常用的IO流类总结

常用的IO流类的框架如下,重点是流式,分为字节流和字符流2种。

 

一、字节流和字符流的区别

  • 字节流操作的基本单元是字节;字符流操作的基本单元是字符(2个字节)
  • 字节流默认不使用缓冲区;字符流使用缓冲区
  • 字节流通常用于处理二进制数据,不支持直接读写字符;字符流通常用于处理文本数据
  • 在读写文件需要对文本内容进行处理:按行处理、比较特定字符的时候一般会选择字符流;仅仅读写文件,不处理内容,一般选择字节流

二、基本流类的使用

1. FileOutputStream:相对于内存是输出流,用于将数据写入File(硬盘),常用fos.write()方法

1         //文件输出流是用于将数据写入File或FileDescriptor的输出流
2         FileOutputStream fos = new FileOutputStream("F://out.txt");
3         fos.write(65);
4         fos.write(',');
5         byte[] bytes ={65,66,67,68,69,70};
6         fos.write(bytes);
7         fos.write(',');
8         fos.write(bytes,0,3);
9         fos.close();

2.FileInputStream:相对于内存是输入流,用于将数据从硬盘中读取到内存,常用的fis.read()方法

 1 //从文件中读取信息到内存                                                                    
 2 FileInputStream fis = new FileInputStream("F://0JavaTest/in.txt");               
 3 int a = fis.read();//读取单个字符                                                      
 4 System.out.println((char)a);                                                     
 5 byte[] bytes = new byte[10];                                                     
 6 int len =  fis.read(bytes);//读取多个字符,推荐使用                                         
 7 System.out.println(new String(bytes,0,len));                                     
 8 len = fis.read(bytes);                                                           
 9 System.out.println(new String(bytes,0,len));                                     
10 len = fis.read(bytes);                                                           
11 System.out.println(new String(bytes,0,len));                                     
12 fis.close();//关闭流,释放分配的系统资源    

3.FileWriter:相对于内存是字符输出流,将数据写入到硬盘文件中,是以一个字符为操作单位,适合传输文字数据等场合。

1  FileWriter fw = new FileWriter("F://0JavaTest/writer.txt");
2         fw.write('a');
3         fw.write(",");
4         fw.write("锄禾日当午,汗滴禾下土");
5         fw.write(",");
6         fw.write(15);//传入ASCII码:15对应的值
7         fw.close();

4.FileReader:相对于内存是字符输入流,将数据从硬盘文件里读入到内存中,供程序操作,是以一个字符为操作单位,适合传输文字数据等场合。

 1        FileReader fr = new FileReader("F://0JavaTest/reader.txt");
 2      /*   //  1.每次读取一个字符
 3         while(true){
 4             int a = fr.read();
 5             if(a ==-1) break;
 6             System.out.println((char)a);
 7         }*/
 8 
 9         //  2.每次读取一个字符数组
10         char[] chars = new char[100];//数组默认值为空格,多余未使用的数组位置需要处理
11         int len = fr.read(chars);
12         System.out.println(new String(chars,0,len));
13         System.out.println("字符个数为:"+len);
14         fr.close();

三、字节流转换成字符流

1.InputStreamReader:从外部获取到字节流的场景,需要处理文本数据,用字节流直接读,会出现读1个字节,半个字符的情况,不能满足我们的需求,因此需要做字节-字符流的转换。

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;

public class Demo5 {
    public static void main(String[] args) throws IOException {
        //  1.自己创建的或从外部获取的字节流
        FileInputStream fis = new FileInputStream("F://0JavaTest/reader.txt");
        //  2.将字节流”装饰“成字符流,使之能利用isr的方法操作字符流
        InputStreamReader isr = new InputStreamReader(fis);

        while(true){
            int c = isr.read();
            if(c == -1) break;
            System.out.println((char)c);
        }

        isr.close();
    }

}

2.OutputStreamWriter:从外部获取到字节流的场景,需要处理文本数据,用字节流直接操作,会出现读1个字节,半个字符的情况,因此需要做字节-字符流的转换

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

public class Demo6 {
    public static void main(String[] args) throws IOException {
        //   1.自己创建的或从外部获取的字节流
        FileOutputStream fos = new FileOutputStream("F://0JavaTest/writer.txt");
        //  2.将字节流”装饰“成字符流,使之能利用osw的方法操作字符流
        OutputStreamWriter osw = new OutputStreamWriter(fos);
        osw.write("床前明月光,疑是地上霜");
        osw.flush();//刷新缓存,将缓存字符写到文件中
        osw.close();
    }
}

四、缓存读取流

BufferedReader:只能读取字符输入流,转换成带缓存的流,提供readLine()方法,一次读取一行数据,比较方便。

 1 //  4.缓存读取流,将字符输入流,转换成带有缓存的,可以一次读取一行数据
 2        //FileInputStream fis = new FileInputStream("F://0JavaTest/in.txt");
 3         FileInputStream fis = new FileInputStream("E:\00java入门\KAIKEBA\CODE\Demo\com.kaikeba.c1\in2.txt");
 4         InputStreamReader isr = new InputStreamReader(fis);
 5         BufferedReader br = new BufferedReader(isr);
 6         while (true) {
 7             String text = br.readLine();
 8             if (text != null) {
 9                 System.out.println(text);
10             } else {
11                 break;
12             }
13         }

.

原文地址:https://www.cnblogs.com/PengLuo22/p/13418710.html