------------siwuxie095
工程名:TestRWBufferedCharStream
包名:com.siwuxie095.bufferedcharstream
类名:RWByBufferedCharStream.java
打开资源管理器,在工程 TestRWBufferedCharStream 文件夹下,放入
一个文本:java.txt
java.txt 的内容:
工程结构目录如下:
代码:
package com.siwuxie095.bufferedcharstream;
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.UnsupportedEncodingException;
public class RWByBufferedCharStream {
/** *使用带有缓冲的字符流实现文本文件的数据读写 * * InputStreamReader没有读取一行数据的方法 * OutputStreamWriter没有写入一行数据后自动换行的方法 *所以有一定的局限性 * *使用带有缓冲的字符流就可以解决 * * InputStreamReader和 BufferedReader的API区别: * InputStreamReader有 4个 read()方法,BufferedReader则多出一个 readLine() * readLine()每读取到一个换行的时候,此函数就会结束,并将这一行数据返回 * * OutputStreamWriter和 BufferedWriter的API区别: * OutputStreamWriter有 5个 write()方法,BufferedWriter同样是这 5个方法 * BufferedWriter的优势在于其写出的操作是带有缓冲的,在 BufferedWriter内部 *有一个自带的缓冲区,当文件写出的时候,会先写入到这个缓冲区,当缓冲区被写满 *之后才会向硬盘执行一次真正的写出操作,这样就大大减少了硬盘的使用量,延长了 *硬盘的使用寿命,整体的写出时间也会变短,增加了写入效率 * * *在使用缓冲流写出数据时要注意一点: *到文件末尾时如果写出的数据还没有填满缓冲区,缓冲区里的内容有些时候是不会被 *写入到文件里的。导致文件内容丢失或不完整,所以在缓冲流 close() 之前,要调 *用输出流的 flush()方法,将当前的缓冲区里的内容强制输出,不留遗漏,保证文件 *内容的完整 * * @param args */ public staticvoid main(String[] args) {
try {
//先创建一个文件对象 File file =new File("java.txt"); //再创建一个文件输入流(字节流),传入 file FileInputStream fis =new FileInputStream(file); //使用 InputStreamReader将字节流转化为字符流 //传入 fis并指定字符集:UTF-8 InputStreamReader isr =new InputStreamReader(fis, "UTF-8"); //继续包装成带缓冲的字符流,传入Reader对象:isr BufferedReader br =new BufferedReader(isr);
//文件的输出流会自动创建文件 java_buff.txt,不需要手动创建 FileOutputStream fos =new FileOutputStream("java_buff.txt"); //在对同一个文件进行读写或对同一段数据操作时,其编码设定一定要一致 OutputStreamWriter osw =new OutputStreamWriter(fos,"UTF-8"); BufferedWriter bw =new BufferedWriter(osw);
//打印流,其方法和 BufferedWriter相似,传入一个Writer对象:osw // PrintWriter还可以设置自动执行 flush操作,不用手动去 pw.flush() //PrintWriter pw=new PrintWriter(osw,true); PrintWriter pw=new PrintWriter(osw);
String input;
//如果 readLine()的返回值是 null,则读取到了文件末尾 while ((input = br.readLine()) != null) { System.out.println(input); //将 String:input写入到文件 java_buff.txt,但是会丢失所有的换行符 //这是因为使用 BufferedReader的 readLine()方法来读取一行数据时, //虽然读取的是一行数据,返回值中却并不包含换行符,所以在写入文件 //时就只能写入每一行的真实内容,而没有换行符,最后就只有一行了 //可以手动加入一个换行符 bw.write(input +"\n");
//或者使用另一个API:PrintWriter,来保留换行符 // PrintWriter的 write()方法和BufferedWriter、OutputStreamWriter一样 //除此之外,PrintWriter还提供了特殊的写出方法,即 print() println() //特别是 printline写出数据时会在当前字符串末尾添加一个换行符 //pw.println(input); }
//关闭缓冲流之前,执行输出流的 flush 操作 bw.flush(); //pw.flush();
//读写完毕,关闭流 br.close(); isr.close(); fis.close(); pw.close(); bw.close(); osw.close(); fos.close();
}catch (FileNotFoundException e) { e.printStackTrace(); }catch (UnsupportedEncodingException e) { e.printStackTrace(); }catch (IOException e) { e.printStackTrace(); } }
} |
运行一览:
java_buff.txt 的内容:
运行后,工程结构目录一览:
【made by siwuxie095】