`
哈达f
  • 浏览: 114816 次
  • 性别: Icon_minigender_1
  • 来自: 广西
社区版块
存档分类
最新评论

IO阶段小结

    博客分类:
  • j2se
阅读更多
IO:
	字节流:
		针对的字节数据,包括文本也包括媒体数据,如果是纯文本用字符流处理较为便捷。
		字节流所使用的缓冲区是一个byte[]。
	常用的对象:
		FileInputStream,FileOutputStream,BufferedInputStream,BufferedOutputStream。
	需求:
		copyMp3

		public void copyMp3()
		{
			FileInputStream fis = new FileInputStream("1.mp3");
			BufferedInputStream bufis = new BufferedInputStream(fis);

			FileOutputStream fos = new FileOutputStream("2.mp3");
			BufferedOutputStream bufos = new BufferedOutputStream(fos);

			int by = 0;

			while((by=bufis.read())!=-1)
			{
				bufos.write(by);
				bufos.flush();
			}
			
			bufos.close();
			bufis.close();

		}
		
	模拟BufferedInputStream。原理:其实将一个字节数组进行封装,通过方法将一批数据存入数组中,在通过数组的指针每一次返回数组中一个字节。当数组元素全部取出后,在存入一批新的数据,重复此过程。

	class MyBufferedInputStream
	{
		private InputStream in;
		private byte[] arr = new byte[1024*4];
		private int pos = 0,count = 0;
		MyBufferedInputStream(InputStream in)
		{
			this.in = in ;
		}

		public int myRead()throws IOException
		{
			if(count==0)
			{
				count = in.read(arr);
				if(count<0)
					return -1;
				pos = 0;
				byte b = arr[pos];
				pos++;
				count--;
				return b;//return b&255;
			}
			else if(count>0)
			{
				byte b = arr[pos];
				pos++;
				count--;
				return b;//return b&0xff;
			}
			return -1;
		}
		public void myClose()throws IOException
		{
			in.close();
		}
	}

	当使用自定义的缓冲区时,居然出现的秒杀的情况,为什么会如此呢?
	因为mp3数据最终的二进制表现形式中,很容易出现连续N多1的情况,
	只要出现了连续的8个1,对于一个字节而言十进制体现形式就是-1。
	那么就满足while循环结束条件。程序终止。
	为了避免这种情况,在读到一个字节时,将该字节进行了提升变成int型。
	但是byte-1,变成int 还是-1。为了避免,在进行提升的过程中,保留的源字节的8为数据,并在前以补零方式进行提升。

	这样一个byte -1 变成了int 的255。这就避免了-1的情况。
	如何补的零呢?只要将读到的字节&255或者&0xFF.都可以。这也是read方法不是返回byte而返回int类型的原因。

	通过该过程就可以明确,read方法在对字节或者字符进行提升,而write方法在对提升后的int数据进行强转,
	只写出了最低的8位,或者最低的16位。

---------------------------------

字符流:
四个:

字节流:
四个。

为了实现字符和字节流之间的转换,出现了转换流。

转换流的由来,
当读到的字节数据都是纯文本的时候,而且文本中出现中文字符,那么在解析该字节数据时就需要指定编码表。
因为可以识别中的编码表不唯一。在使用转换流时,如果未指定编码表,那么默认使用本地码表。

InputStramReader:字节通向字符的桥梁
OutputStreamWriter:字符通向字节的桥梁



--------------------------------

流操作的基本规律:
1,明确数据源和数据目的。
	明确到底是使用输入流还是输出流。
2,明确要处理的数据是否是纯文本。
	明确到底是使用字符流还是字节流。
当明确体系后,到底该用该体系的哪个对象呢?
根据数据存在的设备而定,
数据源所在设备可以是,硬盘,键盘,内存。
数据目的所在设备可以是,硬盘,控制台,内存。

需求:
获取键盘录入,将录入信息存储到本地文件中。

	源:键盘录入,输入流。
	处理的数据:纯文本,字符输入流。Reader
	该用哪个对象呢?
	键盘录入System.in完成的。那么它是一个标准的字节输入流。InputStream。

	为了操作文本数据方便,将字节流转换成字符流。使用InputStreamReader。
	但是为了提高对字符操作的效率,BufferedReader.

	BufferedReader bufr = 
		new BufferedReader(new InputStreamReader(System.in));

	目的:本地文件(硬盘)输出流。
	处理的数据:纯文本,字符输出流。Writer。
	该用该体系的哪个对象呢?
		可以操作的文件FileWriter对象。
		为了提高写入流的效率。BufferedWriter.
		
	
	public void show()
	{
		BufferedReader bufr = 
			new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bufw = 
			new BufferedWriter(new FileWriter("a.txt"));

		String line = null;
		while((line=bufr.readLine())!=null)
		{
			if("over".equals(line))
			break;
			bufw.write(line);
			bufw.newLine();
			bufw.flush();
		}
		bufw.close();
		bufr.close();

	}
	/*
	如果基本上面的分析,但不使用缓冲区,代码是一个什么样子呢?
	*/
	public static void show()throws IOException
	{
		InputStreamReader isr = new InputStreamReader(System.in);

		FileWriter fw = new FileWriter("a.txt");

		char[] arr = new char[1024];

		int len = 0;

		while((len=isr.read(arr))!=-1)
		{
			System.out.println(len);
			String s = new String(arr,0,len-2);
			if("over".equals(s))
				break;
			fw.write(arr,0,len);
			fw.flush();
		}
		fw.close();
		isr.close();
	}


获取本地文本数据,将数据息存储到本地另一个文件中,按照UTF-8的编码形式。

源:硬盘,输入流。
数据:纯文本,字符输入流,Read。
该用哪个对象呢?
因为是文件FileReader为了提高效率BufferedReader.

目的:本地文件(硬盘)输出流。
	处理的数据:纯文本,字符输出流。Writer。
	该用该体系的哪个对象呢?
		可以操作的文件的对象,但是因为要将字符数据进行编码在进行存储,就需要使用字符向字节过滤的桥梁。OutputStreamWriter.
		就要使用转换流。而转换流要接收的对象都是字节流对象。所以要使用的可以操作的File的FileOutputStream。
		为了提高写入流的效率。BufferedWriter.

	public void show()
	{
		BufferedReader bufr = new BufferedReader(new FileReader("a.txt));

		BufferedWriter bufw = 
			new BufferedWriter(new OutputStreamWriter(new FileOutputStream("b.txt"),"UTF-8"));
	}


-----------------------------

异常日志。
printStackTrace(PrintStream );

try
{
	int[] arr = new int[2];
	System.out.println(arr[3]);
}
catch(Exception e)
{
	Date d = new Date();
	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	String time = sdf.format(d);
	
	try 
	{
		PrintStream out = new PrintStream("exception.log");
		e.printStackTrace(out);

		out.close();
	}
	catch(IOException e)
	{
		throw new RuntimeException("日志建立失败");
	}
	
}


 

分享到:
评论

相关推荐

    IO类问题排查总结 (1)1

    1.1 kernel 阶段使用 io 命令确认寄存器方法………………………………………………….3 1.2 Uboot 阶段寄存器状态确认方法………………………

    【JavaScript源代码】五十音小游戏中的前端知识小结.docx

    五十音小游戏中的前端知识小结  背景 在日语学习初期阶段,我发现日语五十音的记忆并不是很容易的,片假名的记忆尤其令人费神。这时我想如果有一个应用可以充分利用碎片时间,在午休或地铁上随时可以练习五十音该...

    java翻牌源码-h2pl.github.io:使用GitHubIO+hexo搭建的个人博客,无须自己开发网站,只需简单的配置加上命令行即可以

    项目结束以后,主要在复习Java基础,于是看了不少相关博客,记录了很多Java的基础知识点,比如异常,反射,序列化,集合类等等内容的一些总结,现在看来确实有点幼稚了。所以我最近也在删除一些低质量的文章,以便让...

    dkataiev.github.io

    德米特罗·卡塔耶夫(Dmytro Kataiev)联络人电子邮件: LinkedIn): 职业总结在我的职业生涯中,我通常从事Web服务和企业级Web应用程序开发的工作,其中HTML,CSS和JavaScript用于前端,而Java用于后端和第三方...

    java 编程入门思考

    17.1.2 检查大小写样式 17.2 方法查找工具 17.3 复杂性理论 17.4 总结 17.5 练习 附录A 使用非Java代码 A.1 Java固有接口 A.1.1 调用固有方法 A.1.2 访问JNI函数:JNIEnv自变量 A.1.3 传递和使用Java对象 A.1.4 JNI...

    godbasin.github.io:被删除的前端博客-喜欢请star

    被删除前端博客 【置顶】被删减的前端面板 欢迎来边学前端边撸猫噢〜 如果你访问不了我的博客,可以哦〜 最新 深入理解Vue.js实战 ...前端阶段性总结 CSS相关 js相关 jQuery相关 three.js笔记

    面向对象技术与UML课件及源代码-by 南邮-陈杨

    在章节中穿插了上机习题,并提供了答案,用于对该章内容进行阶段性总结演练。 作者长期从事教学工作,积累了丰富的经验,其“实战教学法”取得了很好的效果。本书适合教学。书中章节安排适当,将习题融于讲解的过程...

    整理后java开发全套达内学习笔记(含练习)

    export ORACLE_HOME=/oracledata/.../bin: BufferedReader建构时接受java.io.Reader物件 可使用java.io.InputStreamReader 例: import java.io.InputStreamReader; import java.io.BufferedReader; class n{ ...

    基于javatcpsocket通信的拆包和装包源码-Netty-practice:Netty学习实践

    阻塞IO和非阻塞IO的区别就在于:应用程序的调用(等待数据准备阶段)是否立即返回! 同步IO和异步IO的区别就在于:数据访问(等待数据复制阶段)的时候进程是否阻塞! 再往深了说,可以去分析一下操作系统原理。 我们的...

    Hadoop实战中文版.PDF

    206第11章 Hive及Hadoop群 20711.1 Hive 20711.1.1 安装与配置Hive 20811.1.2 查询的示例 21011.1.3 深入HiveQL 21311.1.4 Hive小结 22111.2 其他Hadoop相关的部分 22111.2.1 HBase 22111.2.2 ...

    Think in Java(中文版)chm格式

    17.1.2 检查大小写样式 17.2 方法查找工具 17.3 复杂性理论 17.4 总结 17.5 练习 附录A 使用非Java代码 A.1 Java固有接口 A.1.1 调用固有方法 A.1.2 访问JNI函数:JNIEnv自变量 A.1.3 传递和使用Java对象...

    JAVA_Thinking in Java

    17.1.2 检查大小写样式 17.2 方法查找工具 17.3 复杂性理论 17.4 总结 17.5 练习 附录A 使用非Java代码 A.1 Java固有接口 A.1.1 调用固有方法 A.1.2 访问JNI函数:JNIEnv自变量 A.1.3 传递和使用Java对象 A.1.4 JNI...

    Java初学者入门教学

    17.1.2 检查大小写样式 17.2 方法查找工具 17.3 复杂性理论 17.4 总结 17.5 练习 附录A 使用非Java代码 A.1 Java固有接口 A.1.1 调用固有方法 A.1.2 访问JNI函数:JNIEnv自变量 A.1.3 传递和使用Java对象 A.1.4 JNI...

    ThinkInJava

    17.1.2 检查大小写样式 17.2 方法查找工具 17.3 复杂性理论 17.4 总结 17.5 练习 附录A 使用非Java代码 A.1 Java固有接口 A.1.1 调用固有方法 A.1.2 访问JNI函数:JNIEnv自变量 A.1.3 传递和使用Java对象 A.1.4 JNI...

    thinkinjava

    17.1.2 检查大小写样式 17.2 方法查找工具 17.3 复杂性理论 17.4 总结 17.5 练习 附录A 使用非Java代码 A.1 Java固有接口 A.1.1 调用固有方法 A.1.2 访问JNI函数:JNIEnv自变量 A.1.3 传递和使用Java对象 A.1.4 JNI...

    Thinking in Java简体中文(全)

    17.1.2 检查大小写样式 17.2 方法查找工具 17.3 复杂性理论 17.4 总结 17.5 练习 附录A 使用非Java代码 A.1 Java固有接口 A.1.1 调用固有方法 A.1.2 访问JNI函数:JNIEnv自变量 A.1.3 传递和使用Java对象 A.1.4 JNI...

    java联想(中文)

    17.1.2 检查大小写样式 17.2 方法查找工具 17.3 复杂性理论 17.4 总结 17.5 练习 附录A 使用非Java代码 A.1 Java固有接口 A.1.1 调用固有方法 A.1.2 访问JNI函数:JNIEnv自变量 A.1.3 传递和使用Java对象 A.1.4 JNI...

    数据库设计与优化.pdf

    所以我希望按照软件生命周期的不同阶段来总结数据库性能优化相关 的注意事项。 1.2 分析阶段 一 般来说,在系统分析阶段往往有太多需要关注的地方,系统各种功能性、可用性、可靠性、安全性需求往往吸引 了我们大...

    SQLServer2008技术内幕T-SQL查询包含源代码及附录A

    4.3.4 STATISTICS IO135 4.3.5 测量查询的运行时间135 4.3.6 分析执行计划136 4.3.7 图形化的执行计划136 4.3.8 提示(Hint)144 4.3.9 跟踪/Profiler145 4.3.10 数据库引擎优化顾问145 4.3.11 数据收集和管理数据...

    Thinking in Java(中文版 由yyc,spirit整理).chm

    17.1.2 检查大小写样式 17.2 方法查找工具 17.3 复杂性理论 17.4 总结 17.5 练习 附录A 使用非Java代码 A.1 Java固有接口 A.1.1 调用固有方法 A.1.2 访问JNI函数:JNIEnv自变量 A.1.3 传递和使用Java对象 A.1.4 JNI...

Global site tag (gtag.js) - Google Analytics