字节流和字符流是Java提供的两种输入/输出处理方式。字节流以单个字节为读/写单位,字符流以字符为读/写单位。一般字符由多个字节组成。InputStreamReader和OutputStreamWriter用来作为字节和字符之间的中介,可以把以字节形式表示的流转化为特定平台上的字符表示。可以从一个字节流构造一个字符流对象。可以在构造这些流对象时指定字符编码规范,也可以用当前平台默认编码规划。
InputStreamReader的构造函数如下
public InputStreamReader(InputStream in)使用当前平台默认的编码规范,从字节流in构造一个字符流对象
public InputStreamReader(InputStream in,String charsetName)使用特定的字符集编码规范,从字节流in构造一个字符流对象
public InputStreamReader(InputStream in,charset cs)使用一个字符集对象cs和字节流in构造输入字符流
public InputStreamReader(InputStream in,CharasetDecoder dec)使用字符集解码器dec和字节流in构建输入字符流。
in是一个字节流对象,charsetName是字符集的名字,cs是表示字符集的对象,dec是一个字符集解码器。
如果使用了不支持的字符集,那么会产生一个UnsupportedEncodingException异常。
OutputStreamWriter
构造函数
public OutputStreamWriter(OutputStream out)使用当前平台默认的编码规范,从字节流out构造一个字符流对象
public OutputStreamWriter(OutputStream out,String charsetName)使用特定的字符集编码规范,从字节流out构造一个字符流对象
public OutputStreamWriter(OutputStream out,Charset cs)使用一个字符集对象cs和字节流out构造输出字符流
public OutputStreamWriter(OutputStream out,CharsetEncoder enc)使用字符集编码器enc和字节流out构造输出字符流
这里out是一个输出字节流对象,charsetName是字符集的名字,cs是表示字符集的对象,enc是一个字符集编码器。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class StreamToReaderWriter {
public static void main(String[] args)throws IOException {
File file=new File("src/StreamToReaderWriter.java");
FileInputStream fin=new FileInputStream(file);
FileOutputStream fout=new FileOutputStream("copy-of-file.txt");
InputStreamReader isr=new InputStreamReader(fin,"GBK");
OutputStreamWriter osw=new OutputStreamWriter(fout,"GBK");
System.out.println("Current charset of Reader is:"+isr.getEncoding());
System.out.println("Current charset of Writer is:"+osw.getEncoding());
int n=(int)(file.length()/30);
System.out.println("First "+n+"char of the file one read() at a time");
for(int i=0;i<n;i++)
{
osw.write(isr.read());
}
System.out.println("Reading the next "+n+"with one read(b[])");
char b[]=new char[n];
if(isr.read(b)!=n)
{
System.err.println("could't read "+n+"bytes.");
}
osw.write(b);
System.out.println("Reading the rest chars with read(b[],offset,len)");
int count=0;
while((count=isr.read(b, 0,n))!=-1)
osw.write(b,0,count);
isr.close();
fin.close();
osw.flush();
osw.close();
fout.flush();
fout.close();
}
}
有问题
Exception in thread “main” java.io.FileNotFoundException: src\StreamToReaderWriter.java (系统找不到指定的文件。)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(Unknown Source)
at java.io.FileInputStream.(Unknown Source)
at Main.StreamToReaderWriter.main(StreamToReaderWriter.java:14)