JAVA IO流总结

本文主要介绍Java中IO流的相关知识。先阐述了IO流按流向和操作类型的分类,以及其将内容读写文件的功能。接着详细讲解了字节流、字符流、缓冲流、转换流、序列化流的使用方法,还提及了IO异常在JDK7前后的处理方式。

IO流的分类

按流向分:
输入流
输出流
按操作的类型分:
字节流
字符流

IO流的功能

将内容写入文件中,或者从文件中读取内容,强调的是内容

IO流的结构图:

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190619180555420.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDcyOTM5NA==,size_16,color_FFFFFF,t_70

(一)字节流

字节输出流

FileOutputStream

使用字节输出流写出数据到文件:

 1.创建文件字节输出流对象
    FileOutputStream fos = new FileOutputStream("文件路径");

    2.调用wirte方法写数据到文件
    //             0   1   2    3   4
    byte[] buf = {97, 98, 99, 100, 101};
    // void write​(byte[] b) 将一个字节数组写入文件中(一次性写多个)
    fos.write(buf);

    // 3.关闭文件.必须要做的
    fos.close();

字节输入流

FileInputStream

使用字节输入流读取数据到程序:

FileInputStream fis = new FileIntpuStream("文件路径");
    int ch = fis.read(); // 读取一个字节

    byte[] buf = new byte[1024];
    int len = fis.read(buf); // 读取一个字节数组

    fis.close();

其中read(byte[])方法的原理:读取多个数据保存到byte[]中,返回读取的个数

字节和字符之间转换

1.String转byte[]使用哪个方法?

    String str = "你好,世界!";
    byte[] buf = str.getBytes();

2.byte[]转String使用哪个方法?

byte[] bytes = {97, 98, 99, 100};
String str = new String(bytes);

(二)字符流

字符输出流

FileWirter

(一)使用FileWirter写数据到文件:

fr.wirte(字符);写入字符
fr.wirte(字符数组);写入字符数组
fr.wirte(字符数组,0, 个数);写入字符数组,并且可以选择写入开始位置,写入个数
fr.write(字符串);写入字符串
fr.write(字符串, 0, 个数);写入字符串,并且可以选择写入开始位置,写入个数

FileWriter fr = new FileWriter("文件路径");//创建文件字符输出流对象
    fr.wirte('a');
    fr.wirte(字符数组);
    fr.wirte(字符数组,0, 个数);

    fr.write(字符串);
    fr.write(字符串, 0, 个数);

    fr.close();//关闭流

(二FileWriter中关闭和刷新方法的区别:
flush: 刷新后还可以继续写数据。
close: close后不能再写数据, close也会刷新。

(三)FileWriter写数据实现换行和追加写
换行: “\r\n”
追加写: 构造方法append参数设置true

FileWriter fr = new FileWriter(“文件路径”, true);

字符输入流

FileReader

FileReader fr = new FileReader("文件路径");
    int ch = fr.read(); // 读取一个字符

    char[] chs = new char[1024];
    int len = fr.read(chs);
    // 读取一个字符数组的数据.读取到的多个数据保存chs数组中,返回读取到的个数。

(三) 缓冲流

缓冲流是对四个基本IO流的增强

BufferedInputStream 字节输入缓冲流
BufferedReader 字符输入缓冲流
BufferedOutputStream 字节输出缓冲流
BufferedWriter字符输出缓冲流

1.使用字节缓冲流读取数据到程序

BufferedInputStream bis = new BufferedIntpuStream(new FileInputStream(路径));
    bis.read();
    bis.close();

2.使用字节缓冲流写出数据到文件

 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(路径));
    bos.write(数据);
    bos.close();

3.字符缓冲流和它的基本用法

字符缓冲流和字符缓冲流的用法基本相同,只是读取和写入的是字符。

//读取字符
    BufferedReader br = new BufferedReader(new FileReader(路径));
    br.read();
    br.close();
//写入字符
    BufferedWriter bw = new BufferedWriter(new FileWriter(路径));
    bw.write(数据);
    bw.close();

4.缓冲流的特殊用法

BufferedReader:
String readLine(); 读取一行数据
BufferedWriter:
void newLine(); 写一个换行符

(四) 转换流

InputStreamReader类构造方法

InputStreamReader​(InputStream in) 创建一个使用默认字符集的InputStreamReader。
InputStreamReader​(InputStream in, String charsetName) 创建一个使用命名字符集的InputStreamReader。
charsetName: gbk/utf8 (大小写均可)

InputStreamReader类构造方法

InputStreamReader​(InputStream in) 创建一个使用默认字符集的InputStreamReader。
InputStreamReader​(InputStream in, String charsetName) 创建一个使用命名字符集的InputStreamReader。
charsetName: gbk/utf8 (大小写均可)

1.使用转换流读取指定编码的文本文件
InputStreamReader isr = new InputStreamReader(new FileInputStream(路径), "GBK/UTF8");
    isr.read();
    isr.close();
2.使用转换流写入指定编码的文本文件
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(路径), "GBK/UTF8");
    osw.write()
    osw.close();

(五)序列化流

ObjectOutputStream对象序列化流
ObjectInputStream对象反序列化流

1.使用序列化流写出对象到文件

提前创建好一个基础的Student类

Student s = new Student("name", age);
    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(路径));
    oos.writeObject(s);
    oos.close();
2.使用反序列化流读取文件到程序中

提前创建好一个基础的Student类

ObjectInputStream ois = new ObjectInputStream(new FileInputStream(路径));
    Object obj = ois.readObject();
    ois.close();

(六)IO异常处理

JDK7以前:


        FileReader fr = null;
        try {
            fr = new FileReader("文件路径");

            int ch = fr.read();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // null不能去调用方法
            if (fr != null) {
                try {
                    fr.close();
                } catch (IOException e) {
                    System.out.println("关闭流失败...");
                }
            }
        }

JDK7以后:

JDK7及以后的处理方式
自动关流
try (能自动关流的代码/创建IO流的代码) {
其他代码
} catch(异常类名 变量名) {}

try (FileReader fr = new FileReader("文件路径");
            FileWriter fw = new FileWriter("文件路径")
        ) {
            int ch = fr.read();
            System.out.println(ch);
        } catch (FileNotFoundException e) {
            System.out.println("文件没有找到");
        } catch (IOException e) {
            System.out.println("IO异常");
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值