传递给字符流的字节流不需要单独的进行关系 , 在字符流关闭的时候会调用字节流的close()方法 。
FileWriter & FileReader
FileWriter 和 FileReader 分别是 OutputStreamWriter 和 InputStreamReader 的子类 , 只不过他们是只能操作系统默认编码表的字符流 。也可以这么简单的理解: OutputStreamWriter 和 InputStreamReader 的构造函数不支持传递第二个参数 , 就是操作系统默认的编码表 。所以在使用上只需要注意操作的文件编码格式是否与系统默认的编码格式一致即可 。既然不传递第二个参数就可以达到相同的效果 , 为什么还会有这个两个类呢?因为这两个类操作简单 。下面还是以复制文件为例 。
File sourceFile = new File("sourceFile.txt"); File destFile = new File("destFile.txt"); FileReader reader=null;FileWriter writer=null; try {reader= new FileReader(sourceFile);writer =new FileWriter(destFile); char[] cbuf =new char[1024];int len=0;while((len=reader.read(cbuf))!=-1) { System.out.println(String.copyValueOf(cbuf,0,len));writer.write(cbuf, 0,len);} } catch(IOException ex) { } finally { try{reader.close();}catch(IOException ex) { } try{writer.close();}catch(IOException ex) { } }无论是使用 FileWriter & FileReader 还是 OutputStreamWriter & InputStreamReader , 在他们的内部都会存在缓冲区的 , 默认大小为8192字节 。如果不对流进行关闭的话 , 数据会继续存在缓冲区 , 不会存储到文件上 , 除非手动调用flush方法或者是在缓冲区中写入的数据超过了缓冲区的大小 , 数据才会刷新到文件上 。而调用close方法的内部会先调用flush刷新缓冲区 。
BufferedOutputStream & BufferedInputStream & BufferedWriter & BufferedReader
这四个Buffered开头的类分别是为字节流和字符流提供一个合适的缓冲区来提高读写性能 , 尤其是在读写数据量很大的时候效果更佳显著 。其用法和不带Buffered的流没有任何区别 , 只不过在不带Buffered流的基础上提供了一些更加便利的方法 , 例如newLine() , ReadLine()和ReadAllBytes() , 他们会根据操作系统的不同添加合适的换行符 , 根据合适的换行符来读取一行数据和读取所有字节 。来看一下用法以缓冲字符流为例
File sourceFile = new File("sourceFile.txt");File destFile = new File("destFile.txt");BufferedWriter bw =null;BufferedReader br =null;try { FileReader reader= new FileReader(sourceFile);FileWriter writer=new FileWriter(destFile);bw =new BufferedWriter(writer); br =new BufferedReader(reader); String line =null; while((line=br.readLine())!=null) { bw.write(line); bw.newLine(); }}catch(IOException ex) {}finally { try { bw.close();} catch(IOException ex) {}try { br.close();} catch(IOException ex) {} }上述的代码中有两点需要注意:
当按照行来读取字符的时候 , 当下一行没有内容 , 继续读取下一行的内容 , 结果会返回 null , 可以此来判断文件中是否还有字符 。当读取的文件行返回为null后 , 仍然会执行一次循环 , 此时调用newLine() 会在写入的文件中多添加一个换行符 , 这个换行符无关紧要 , 可以不用考虑处理掉 。ObjectOutputStream & ObjectInputStream
在编写程序的过程中 , 难免会遇到和外部程序进行数据交流的需求 , 例如调用外部服务 , 并传输一个对象给对方 , 此时需要把传输对象序列化为流才能和外部程序进行交互 。又比如需要对一个对象进行深拷贝 , 也可以将对象序列化为流之后再反序列化为一个新的对象 。Java提供了ObjectOutputStream 和 ObjectInputStream 来实现对对象的序列化和反序列化 。序列化后的流为字节流 , 为了清晰的看到序列化后的结果 , 以下将序列化后的流输出到文件中然后在反序列化为一个对象 , 具体来看一看吧 。
以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!
「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助:- java入门基础知识 java算法题面试
- java解压各种类型的文件 java解压zip文件为空
- 讲解java部署jar还是war优劣 jar运行命令
- java程序员必备的基础知识 java截取字符串后几位
- 哪个培训班靠谱?想要培训Java的应该如何选择? 程序员编程培训
- 自学java坚持不下去了,要找Java培训机构吗 程序员编程培训
- 简单好玩的编程代码 javascriptvoid怎么解决
- 教你javascript实时获取鼠标位置 js获取鼠标点击的位置
- 你做 Java 程序员真的是因为热爱吗? 程序员编程培训
- Java基本数据类型 java字符串拆分为数组