InputStreamReader将一个InputStream转换成Reader;OutputStreamWriter将一个OutputStream转换成Writer。
InputStreamReader(Reader 的子类)和 OutputStreamWriter(Writer 的子类)是用于处理字符流的最基本的类,用来在字节流和字符流之间作为中介。
InputStream 此抽象类是表示字节输入流的所有类的超类
InputStreamReader能将字节流转换为字符流,是字节流通向字符流的桥梁:它读取字节并将其解码为使用指定的字符集的字符。
InputStreamReader封裝了InputStream在里头, 它能以较高级的方式,一次读取一个字符。
1.InputSteamReader的API:
InputStreamReader(InputStream in) 创建一个使用默认字符集的 InputStreamReader。 InputStreamReader(InputStream in, Charset cs) 创建使用给定字符集的 InputStreamReader。 InputStreamReader(InputStream in, CharsetDecoder dec) 创建使用给定字符集解码器的 InputStreamReader。 InputStreamReader(InputStream in, String charsetName) 创建使用指定字符集的 InputStreamReader。
2.方法:
int read() 读取单个字符。 int read(char[] cbuf, int offset, int length) 将字符读入字符数组中的某一部分。 boolean ready() 判断此流是否已经准备好用于读取。 String getEncoding() 返回此流使用的字符编码的名称。 void close() 关闭该流并释放与之关联的所有资源。
3.读文件测试:
(1) read()方法
这个方法每次读取一个字符,并返回读取到的字符(int表示),如果读取完毕就返回-1.因为返回的是int类型,我们打印字符的时候,要强制类型转换为char类型。
import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import com.lan.filepath.FilePath; public class TestInputStreamReader { public static void main(String[] args) throws IOException { String packagePath=FilePath.getSrcPackagePath(TestInputStreamReader.class); String fileName="test.txt"; String fileName1="TestInputStreamReader.java"; String fileName2="JavaIO 字符流.docx"; InputStreamReader inReader=new InputStreamReader( new FileInputStream(packagePath+fileName1)); //逐个 int read=0; while((read=inReader.read())!=-1) { System.out.print((char)read); } } }
运行结果:
package com.lan.InputSteamReader; import java.io.FileInputStream; import java.io.IOException; ......//略 } }
这里把字节的源文件TestInputStreamReader.java给读了出来。InputStreamReader字节转字符转换流只能正确读取文本文件。不能读取其他文件,如.docx文件。把上面的代码改成
InputStreamReader inReader=new InputStreamReader( new FileInputStream(packagePath+fileName2));
读取JavaIO 字符流.docx:
运行结果:
可以看到非文本文件是不能正确读取的。
(2)int read(char[] cbuf, int offset, int length)
这个方法把一批字符读取到字节数组中,每次读满整个字节数组cbuf,每次读取返回读取到的字节数,读取完毕后返回-1.
import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import com.lan.filepath.FilePath; public class TestInputStreamReader { public static void main(String[] args) throws IOException { String packagePath=FilePath.getSrcPackagePath(TestInputStreamReader.class); String fileName="test.txt"; String fileName1="TestInputStreamReader.java"; String fileName2="JavaIO 字符流.docx"; InputStreamReader inReader=new InputStreamReader( new FileInputStream(packagePath+fileName)); // //read()每次读入一个字符,并返回读取到的字符,如果读取完毕就返回-1 // int read=0; // while((read=inReader.read())!=-1) // { // System.out.print((char)read); // } // int size=0; char[] buf=new char[1024]; //读取一个个字符填到字符数组中,每次读满整着字符数组,如果读取完毕返回-1 while((size=inReader.read(buf,0,buf.length))!=-1) { // System.out.print(new String(buf,0,size)); for(int i=0;i<size;i++) { System.out.print(buf[i]); } } } }
运行结果:
静夜思 作者:李白 床前明月光,疑是地上霜。 举头望明月,低头思故乡。
OutputStreamWriter能将字符流转换为字节流,是字符流通向字节流的桥梁。
它使用的字符集可以指定,否则将使用平台默认的字符,wirte()也就是把代有编码的一个字符,转换成字节序列写流中。
OutputStreamWriter的API:
1.构造方法:
OutputStreamWriter(OutputStream out) 创建使用默认字符编码的 OutputStreamWriter。 OutputStreamWriter(OutputStream out, Charset cs) 创建使用给定字符集的 OutputStreamWriter。 OutputStreamWriter(OutputStream out, CharsetEncoder enc) 创建使用给定字符集编码器的 OutputStreamWriter。 OutputStreamWriter(OutputStream out, String charsetName) 创建使用指定字符集的 OutputStreamWriter。
2.方法:
void write(int c) 写入单个字符。 void write(char[] cbuf, int off, int len) 写入字符数组的某一部分。 void write(String str, int off, int len) 写入字符串的某一部分。 void close() 关闭此流,但要先刷新它。 void flush() 刷新该流的缓冲。 String getEncoding() 返回此流使用的字符编码的名称。
3.读写文件试试:
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import com.lan.filepath.FilePath; import java.io.OutputStreamWriter; public class TestOutputStreamWriter { public static void main(String[] args) throws IOException { String packagePath=FilePath.getSrcPackagePath(TestInputStreamReader.class); String fileName="testOutputStreamWrite.txt"; OutputStreamWriter out=new OutputStreamWriter( new FileOutputStream(packagePath+fileName) ); char c='1'; out.write(c);//写入单个字符 String str="中国人"; char[] cbuf=str.toCharArray(); out.write(cbuf, 0,cbuf.length);//写入字符数组 String str2="小明"; out.write(str2, 0,str2.length());//写入字符串 out.close(); System.out.println("--------------写字符:-------------------"); System.out.println(c+new String(cbuf)+str2); System.out.println("--------------读字符:-------------------"); InputStreamReader in=new InputStreamReader( new FileInputStream(packagePath+fileName) ); int ch; while((ch=in.read())!=-1) { System.out.print((char)ch); } in.close(); } }
运行结果:
--------------写字符:------------------- 1中国人小明 --------------读字符:------------------- 1中国人小明
文件内容: