JavaIO InputStreamReader和OutputStreamWriter

InputStreamReader将一个InputStream转换成ReaderOutputStreamWriter将一个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中国人小明

文件内容:




猜你喜欢

转载自blog.csdn.net/qq_21808961/article/details/80311296