使用带有缓冲的字符流读写数据
------------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 static void 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】
posted on 2017-03-26 22:03 siwuxie095 阅读(2100) 评论(0) 编辑 收藏 举报