java-IO InputStream和Reader的区别和使用

苏彦君
2023-12-01

1、InputStream和Reader的区别?

InputStream是表示字节输入流的所有类的超类
Reader是用于读取字符流的抽象类
InputStream提供的是字节流的读取,而非文本读取,这是和Reader类的根本区别。
即用Reader读取出来的是char数组或者String ,使用InputStream读取出来的是byte数组。
字节流用于操作文件数据,网络传输等场景,而字符流适用于与字符串,中文有关的内容处理,因为Writer/Reader两个抽象类对字符的支持比较好。
除了这些,字符输出流写数据时是先将数据写入缓冲区,待字符输出流关闭后再写入到文件中,而字节输出流是直接写入到文件中

2、字节流 InputStream、OutputStream区别

public class ByteStream {
    public static void main(String[] args) throws Exception {
        BufferedReader1();
    }

read()功能:读取单个字符的个数,如果已经读完的话会返回-1 (其范围从 0 到 65535 )
readLine() 功能:读取一个文本行。
InputStream:是表示输入字节流所有类的超类,一般我们使用它的子类,如FileInputStream等
FileInputStream文件字节输入流 以字节形式输出文件内容

   public static void FileInputStream1() throws IOException {

        FileInputStream fi=new FileInputStream("E://file.txt");
        int i;
        //此处的FileInputStream调用的read 每次仅读取一个字节
        while((i=fi.read())!=-1)
        {
            System.out.println(i);
        }
    }

OutputStream:表示输出字输出节流所有类的超类。输出流接受输出字节并将它们发送到某个接收器。
一般我们使用它的子类,如FileOutputStream等.FileOutStream文件字节输出流 字符转换成字节保存至指定文件

 public static void FileOutStream1() throws IOException {
//        File f=new File("E://file.txt");
        OutputStream out=null;
        //也可以out=new FileOutputStream(f);
        out=new FileOutputStream("E://file.txt");
        String str="hello my sorld1";
        // 只能输出byte数组,所以将字符串变为byte数组
        byte b[]=str.getBytes();
        out.write(b);
        //文件不存在会自动创建
        out.close();

    }

InputStreamReader是从字节流到字符流的桥接器:它读取字节并使用指定的字符将它们解码为字符charset。
它使用的字符集可以通过名称指定,也可以明确指定,或者可以接受平台的默认字符集
InputStreamReader 字符输入流 封裝了InputStream在里头,它以较高级的方式,一次读取一个一个字符

  public static void InputStreamReader1() throws IOException {
        FileInputStream fi=new FileInputStream("E://file.txt");
        //指定编码集对字节进行转换,在通过char进行字符转换
        InputStreamReader isr=new InputStreamReader(fi,"utf-8");
        int i;
        while((i=isr.read()) != -1){
            System.out.println((char)i);
        }

    }

OutputStreamWriter是从字符流到字节流的桥接:写入它的字符使用指定的字节编码为字节charset。它使用的字符集可以通过名称指定,也可以明确指定,或者可以接受平台的默认字符集。
OutputStreamWriter是字符流到字节流的桥接 所以无需讲字符串或者字符转换成字节 自身提供转换

   public static void OutputStreamWriter1() throws IOException {
       File file=new File("E://file.txt");
       FileOutputStream out=new FileOutputStream(file);
       OutputStreamWriter osr=new OutputStreamWriter(out);
       String str="htoodada";
       osr.write(str);
        // osr.flush();//如果用于网络传输,记得强制刷新缓冲区,否则输出的数据只停留在缓冲区中,而无法进行网络传输
       osr.close();

    }

3、字符流 BufferedReader和BufferedWriter的区别

为了实现字节到字符的有效转换,可以从基础流中提取比满足当前读取操作所需的更多字节。为了获得最高效率 可以使用字符流
BufferedReader 字符输入流: 从字符输入流中读取文本,缓冲字符,以便有效地读取字符,数组和行。

    public static void BufferedReader1() throws IOException {
        //方案一 FileReader底层是FileInputStream,通过解码器完成字节类转换为字符流
        //FileReader等同于InputStreamReader(FileInputStream)
//        FileReader reader = new FileReader("E://file.txt");
        FileInputStream fi=new FileInputStream("E://file.txt");
        try {
        //指定编码集对字节进行转换,在通过char进行字符转换
        InputStreamReader isr=new InputStreamReader(fi,"utf-8");
        //方案一
//        BufferedReader br=new BufferedReader(reader);
            BufferedReader br=new BufferedReader(isr);
        String str;
        while((str=br.readLine()) != null){
            System.out.println(str);
        }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }

BufferedWriter 将文本写入字符输出流,缓冲字符,以便地写入单个字符,数字和字符串

 public static void BufferedWriter1() throws Exception {
       //方案一
//        FileOutputStream fi=null;
//        OutputStreamWriter ow=null;
//        BufferedWriter writer = null;

       //方案二   FileWriter底层还是FileOutputStream,通过解码器完成字节类转换为字符流
        //即 FileWriter 等同于 OutputStreamWriter(FileOutputStream)
        FileWriter output = null;
        BufferedWriter writer = null;
        try{

            //方案一  BufferedWriter字符输出缓冲流 封装  字符输出流
//            fi=new FileOutputStream("E://file.txt");
//            ow=new OutputStreamWriter(fi);
//            writer = new BufferedWriter(ow);

            //方案二  BufferedWriter字符输出缓冲流 封装 FileWriter

            output = new FileWriter("E://file.txt");
            writer = new BufferedWriter(output);
            writer.write("dasdasdfgsgsgsfasdf \n asdfsfds \n fdsfdsf");
        }finally{
            if(null != writer){
                writer.close();
            }
            if(null != output){
                output.close();
            }
        }
    }

}

//* PW支持两个直接对文件写操作的构造方法:
// * PrintWriter(File f)传文件名
//* PrintWriter(String s)传路径
//* PrintWriter给人一种可以直接对文件进行操作的假象
//* PW是一个高级流
//* 实际上PW包装了字节流、字符流和字符缓冲流。
// * PW负责自动行刷新
//* bw负责提高效率
//* osw负责读字符
//* fos负责写字节
//* 最后PW能够按行很快地把一个字符串变成字节写在文件中
//*/

public static void PrintWriter1()
{
    FileOutputStream os=null;
    PrintWriter pw=null;
    try {
        os =new FileOutputStream("E://file.txt");
        pw = new PrintWriter(os);
        pw.write("服务器欢迎你1");
        pw.flush();
    } catch (Exception e) {
        // TODO: handle exception
    } finally{
        //关闭资源
        try {
            if(pw!=null)
                pw.close();
            if(os!=null)
                os.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
 类似资料: