java IO InputStreamReader

InputStream in = new FileInputStream("C:\\file\\hello.txt");
Reader reader = new InputStreamReader(in);

Reader:一个用于读取字符流的静态类

//继承了Reader 
//是字节流与字符流之间的桥梁
//它读取字节流并通过java.nio.charset.Charset charset将其解码成字符
//我们可以指定charset,也可以使用默认的charset
public class InputStreamReader extends Reader 
private final StreamDecoder sd;  //字节与字符的转换器

关于构造函数

//如果构造的时候没有指定charset,使用默认的charset 
public InputStreamReader(InputStream in) {
        super(in);
        try {
            sd = StreamDecoder.forInputStreamReader(in, this, (String)null); // ## check lock object 
        } catch (UnsupportedEncodingException e) {
            // The default encoding should always be available
            throw new Error(e);
        }
    }

//创建一个使用指定charset的InputStreamReader
 public InputStreamReader(InputStream in, String charsetName)
        throws UnsupportedEncodingException
    {
        super(in);
        if (charsetName == null)
            throw new NullPointerException("charsetName");
        sd = StreamDecoder.forInputStreamReader(in, this, charsetName);
    }

//创建一个使用给定charset的InputStreamReader。
public InputStreamReader(InputStream in, Charset cs) {
        super(in);
        if (cs == null)
            throw new NullPointerException("charset");
        sd = StreamDecoder.forInputStreamReader(in, this, cs);
    }

//创建一个使用给定charset解码器的InputStreamReader。
 public InputStreamReader(InputStream in, CharsetDecoder dec) {
        super(in);
        if (dec == null)
            throw new NullPointerException("charset decoder");
        sd = StreamDecoder.forInputStreamReader(in, this, dec);
    }
//读取一个字符,
//返回读取的字符,如果读到结尾,则返回-1
//每次都会从底层输入流中读取一个或多个字节
public int read() throws IOException {
        return sd.read();
    }

// 读取多个字符到一个指定的数组中
// cbuf 指定的数组,offset开始存储字符的位置,length,读取多少字符
public int read(char cbuf[], int offset, int length) throws IOException {
        return sd.read(cbuf, offset, length);
    }

下面说一下OutputStreamWriter

//OutputStreamWriter 是字符流到字节流动的桥梁
// 使用了java.nio.charset.Charset charset  //将写入其中的字符转换成字节
//charset  可以通过名称指定,也可以明确指定,也可以使用平台指定的
public class OutputStreamWriter extends Writer

构造函数就不写了 

private final StreamEncoder se; 

//使用write()的时候,会调用字符到字节的转换器,但注意一下
//传给write()的字符不会放入缓冲区中,但,字符转换的字节会放入缓冲区中而不会直接写入输出流
public void write(int c) throws IOException {
        se.write(c);
    }
//自己写了一个例子
@Test
	public void readerTest() throws IOException{
		InputStream in = new FileInputStream("hello2.txt");
		Reader reader = new InputStreamReader(in);
		OutputStream out = new FileOutputStream("hello3.txt",true);
		Writer writer = new OutputStreamWriter(out);
		char[] cbuf = new char[4];
		while((reader.read(cbuf))!=-1){ //把读取的字节转换成字符放入cbuf 中
			writer.write(cbuf, 0, 3); 从cbuf 0开始中读取3个字符转换成字节放入缓冲区中
		}
		writer.flush(); //刷新缓冲区
		writer.close();
		reader.close();
	}

关于flush

看了一下 Writer 

//刷新缓冲区,将缓冲区的字节全部写入字节输出流,并清空缓冲区
abstract public void flush() throws IOException;

//关闭流,并刷新它
abstract public void close() throws IOException;

所以,是不是使用了close就可以不用flush了?根据下面的测试,发现是正确的
//测试了一下,这次没有关闭流和刷新缓冲区,发现hello3里没有写入
@Test
	public void readerTest() throws IOException{
		InputStream in = new FileInputStream("hello2.txt");
		Reader reader = new InputStreamReader(in);
		OutputStream out = new FileOutputStream("hello3.txt");
		Writer writer = new OutputStreamWriter(out);
		char[] cbuf = new char[4];
		while((reader.read(cbuf))!=-1){
			writer.write(cbuf, 0, 3);
		}
	}

//添加了 writer.flush();  写入了数据
//删除了writer.flush(); 添加了 writer.close(); reader.close(); 写入了数据

猜你喜欢

转载自blog.csdn.net/qq_35815781/article/details/85095847