使用带有缓冲的字符流读写数据

------------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);

// Stringinput 写入到文件 java_buff.txt,但是会丢失所有的换行符

// 这是因为使用 BufferedReader readLine()方法来读取一行数据时,

// 虽然读取的是一行数据,返回值中却并不包含换行符,所以在写入文件

// 时就只能写入每一行的真实内容,而没有换行符,最后就只有一行了

// 可以手动加入一个换行符

bw.write(input + " ");

   

// 或者 使用另一个APIPrintWriter,来保留换行符

// PrintWriter write() 方法和BufferedWriterOutputStreamWriter一样

// 除此之外,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】

原文地址:https://www.cnblogs.com/siwuxie095/p/6624292.html