本帖最后由 冯超 于 2014-7-21 00:00 编辑
java IO流的基础知识真的很重要,自己不清楚一些基本的操作,或者不知道他的结构体系,后面的深入你根本不了解。
Java IO体系结构看似庞大复杂,其实有规律可循,要弄清楚其结构,需要明白两点: 1. 其对称性质:InputStream 与 OutputStream, Reader 与 Writer,他们分别是一套字节输入-输出,字符输入-输出体系 2. 原始处理器(适配器)与链接流处理器(装饰器) * InputStream用来进行写操作(写入控制台,写入文本等) OutputStream用来读操作(从文本中读数据等) 对于2的理解我目前不了解,但是对于1中说的他们分别是一套字节输入-输出,字符输入-输出体系,首先你要明白字节流和字符流究竟有什么区别?
a. 字节流:字节流是最基本的,主要用来处理2进制数据,他是按字节来处理的。 字符流:实际上很多数据都是文本,所以才有了字符流的概念。 从字节流转化为字符流是:String s = new String(byte[], 0, length); byte[]数组像String转换的一个过程 从字符流转化为字节流是:byte[] b = s.getBytes()l; String类型转换为byte[]数组的一个过程
b.
字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的
而字符流在操作时使用了缓冲区,通过缓冲区再操作文件,
有个问题,什么叫做缓冲区了?
可以简单地把缓冲区理解为一段特殊的内存。
某些情况下,如果一个程序频繁地操作一个资源(如文件或数据库),则性能会很低,此时为了提升性能,就可以将一部分数据暂时读入到内存的一块区域之中,以后直接从此区域中读取数据即可,因为读取内存速度会比较快,这样可以提升程序的性能。
在字符流的操作中,所有的字符都是在内存中形成的,在输出前会将所有的内容暂时保存在内存之中,所以使用了缓冲区暂存数据。
如果想在不关闭时也可以将字符流的内容全部输出,则可以使用Writer类中的flush()方法完成。
还有个问题,你凭什么说字节流操作的是文件本身,二字符流是使用的缓冲区?
这个问题简单,模拟一个从文件中写数据的操作。
用字符流:Writer 的实现类FileWriter测试如下:
- public String OutputStreamTest(File file) throws IOException {
- Writer writer = new FileWriter(file);
- String s = "xcscs牛角尖";
-
- writer.write(s);
- writer.flush();
- //writer.close();
-
- return s;
- }
复制代码
测试结果显示:Writer流最后是否关闭或者flush() 都能直接影响你文件中是否已经成功写进去了内容。经过刷新缓冲区或者关闭Writer流都能成功写进内容。而字节流则不会出现这种情况,自己可以去测试。字符流通过缓冲区的流程图如下:
|