一、字符输入流Reader
Reader 是所有的输入字符流的父类,它是一个抽象类。
Reader 中各个类的用途和使用方法基本和InputStream 中的类使用一致。后面会有Reader 与InputStream 的对应关系。
(1)看看几个常用的实现类
- InputStreamReader类
该类从数据源读取字节并将其解码为使用指定的字符集的字符。InputStreamReader 是一个连接字节流和字符流的桥梁,它将字节流转变为字符流。字节流比字符流的使用范围更广,但字符流比字节流操作方便。如果现在有一个字节流,但可以确定这个字节流的内容都是文本内容,我们就可以将它转换成字符流处理起来会更方便一点。
//创建一个使用默认字符集的 InputStreamReader。
InputStreamReader(InputStream in)
// 创建使用指定字符集的 InputStreamReader。
InputStreamReader(InputStream in, String charsetName)
- FileReader类
该类继承于InputStreamReader,用于读取字符类文件,如文本文件。FileReader可以说是一个达到此功能、常用的工具类,在其源代码中明显使用了将FileInputStream 转变为Reader 的方法。
- BufferedReader类
字节输入缓冲流,从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。BufferedReader 由Reader类扩展而来,提供通用的缓冲方式文本读取,而且提供了很实用的readLine。
//读取一个文本行。通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。
public String readLine()throws IOException
(2)看看常用方法:下面是Reader类的常用方法介绍。
- public int read(int b) throws IOExecption:
该方法用于读取单个字符,返回作为整数读取的字符,如果已经到达流的末尾,返回-1。
- public int read(char[] cbuf) throws IOExecption
该方法用于将字符读入到cbuf,返回读取的字符数。
- public abstract int read(char[] cbuf,int off,int len) throws IOExecption
该方法用于读取len个字符的数据,并从数组cbuf的off位置读入到这个数组中。
- public abstract void close() throws IOExecption
关闭此输入流,并释放与此输出流相关联的所有系统资源。
二、字符输出流
Writer:是所有的输出字符流的父类,它是一个抽象类。
- OutputStreamWriter
将字节输出流转为字符输出流,是字符流通向字节流的桥梁,可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。常用够造方法如下:
//可以设置编码格式
public OutputStreamWriter(OutputStream out, String charsetName);
//创建使用默认字符编码的 OutputStreamWriter。
public OutputStreamWriter(OutputStream out)
- FileWriter:该类写文件方式与OutputStreamWriter基本一样
从OutputStreamWriter类继承而来。该类按字符向流中写入数据,可以关联源文件。主要够造函数:
//创建字符输出流类对象和已存在的文件相关联。
FileWriter fw = new FileWriter(String fileName);
//文件不存在的话,并创建。
如:FileWriter fw = new FileWriter("C:\\demo.txt");
//创建字符输出流类对象和已存在的文件相关联,并设置该该流对文件的操作是否为续写。
FileWriter fw = new FileWriter(String fileName,boolean append);
// 表示在fw对文件再次写入时,会在该文件的结尾续写,并不会覆盖掉。
如:FileWriter fw = new FileWriter("C:\\demo.txt",ture);
- BufferedWriter(缓冲流)
字节输出缓冲流,将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。 可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。 该类提供了 newLine() 方法,它使用平台自己的行分隔符概念,此概念由系统属性 line.separator 定义。该类写入文本的方法就是父类Writer提供的write()系列方法,在这里我们演示他特有的newLine( )方法:
public static void newLineTest() throws IOException{
BufferedWriter bw=new BufferedWriter(new FileWriter("E:\\test\\javaIo\\2.txt"));
bw.write("爱我");
bw.newLine();
bw.write("中华");
bw.flush();
bw.close();
}
//结果:(加入了换行符)
爱我
中华
三、使用示例
1、InputStreamReader:
- public int read() throws IOException
读取单个字符。在字符可用、发生 I/O 错误或者已到达流的末尾前,此方法一直阻塞。
- public int read(char[] cbuf) throws IOException
从输入流读取若干字符数据,并存储到字符数组。在某个输入可用、发生 I/O 错误或者已到达流的末尾前,此方法一直阻塞。
- abstract int read (char[] cbuf, int off, int len)
从输入流读取至多len个字符数据,并存储到字符数组
public class InputStreamReaderTest {
public static void main(String[] args) throws IOException {
InputStreamReader isr = new InputStreamReader(
new FileInputStream("src\\IOTest\\testfile.txt"));
char[] c = new char[1024];
int len = 0;
while((len=isr.read(c))!=-1) {
System.out.println(new String(c,0,len));
}
}
}
2、OutputStreamWriter:
- void write(char[] cbuf) 将指定字符数组的内容写入输出流
- abstract void write(char[] cbuf,int off,int len) 将指定字符数组从off位置开始的len个字符写入输出流
- write(int c) 将指定的字符写入输出流
- abstract void flush() 刷新输出流,强制将缓冲区内容写入输出流
public class OutputStreamWriterTest {
public static void main(String[] args) throws IOException {
OutputStreamWriter osw = new OutputStreamWriter(
new FileOutputStream("src\\IOTest\\osw.txt"));
String str = "Hello OutputStreamWriter";
osw.write(str);
osw.flush();
osw.close();
}
}
3、字符流提供了带缓冲区的包装流,分别是BufferedReader和BufferedWriter,其中BufferedReader用于对字符输入流进行包装,BufferedWriter用于对字符输出流进行包装。缓冲区的出现提高了对数据的读写效率。
文件复制示例:
public class BufferedRWTest {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(
new FileInputStream("src\\IOTest\\testfile.txt")));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream("src\\IOTest\\copy.txt")));
/*一次读一行的方式
String str = null;
while((str=br.readLine())!=null) {//一次读一行
bw.write(str);
bw.newLine();//读完一行给一个换行符
bw.flush();
}
*/
//另一种方式:
char [] ch=new char[1024];
int len=0;
while((len=br.read(ch))!=-1){
bw.write(ch, 0, len);
bw.flush();
}
br.close();
bw.close();
}
}
借鉴博客:https://www.cnblogs.com/jalja/p/6030137.html
https://www.cnblogs.com/justdoitba/p/7582139.html、http://baijiahao.baidu.com/s?id=1600444161351758219&wfr=spider&for=pc