Java学习之IO流


前言

才疏学浅,能力有限,文章中有什么错误,欢迎评论指出,一起进步~

学习I/O流之前,还得学习一下File类。

1、File类的理解

  • 文件和目录路径名的抽象表示。
  • File类的一个对象,代表一个文件或一个文件目录(文件夹)。
  • File类声明在java.IO包下。
  • File类中涉及到关于一些文件和文件目录的创建、删除、重命名、修改时间文件大小等办法,并未涉及到读取或写入文件内容的操作。如果需要读写文件,必须使用I/O流来操作。
  • 后续File类的对象常会作为参数传递到流的构造器中,知名读取或写入的“终点”。

2、FIle类的构造器

  • File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。
    相当于创建了路径为 parent / child(在parent的路径后面再拼接上child)的File实例。

  • File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
    参数直接传文件的相对路径或者绝对路径。

  • File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。

3、常用方法

public static void main(String[] args) throws IOException {

        //file类得到的文件不能直接写入。
        File file = new File("E:\\javaStudy\\src\\yg\\day10\\Demo01.java");

        if(file.exists()){
            System.out.println(file.getAbsoluteFile()); //获取文件的绝对路径
            System.out.println(file.getName());//获取文件名
            System.out.println(file.getPath());//获取文件路径(相对或者绝对)
            System.out.println(file.length());//返回文件中内容长度
            System.out.println(file.isFile());//判断该路径对应的是不是文件,是返回true
            System.out.println(file.isDirectory());//判断该路径对应的是不是文件夹,是返回true
            System.out.println(file.canWrite());//判断该文件是否可写,是返回true
        }else {
            System.out.println("file not found");
            file.createNewFile();
        }
    }

运行结果:
在这里插入图片描述

一、什么是I/O流

  • I/O流是Input/Output的缩写,I/O是非常实用的技术,用于处理设备之间的数据传输。如读写文件,网络通讯等。
  • Java程序中,对于数据的输入/输出的操作以“流(Stream)”的方式进行。
  • 输入Input,读取外部数据到内存。
  • 输出Output,将内存数据输出到外部存储设备。

二、I/O流的分类

  • 按照操作数据单位不同分为:字节流(8bit),字符流(16bit)
  • 按照流向不同分为:输入流,输出流
  • 按照角色不同分为:节点流,处理流

三、I/O流的框架

在这里插入图片描述
来源:W3C菜鸟教程

四、字节流

1、特点

  • 字节流处理单元为1个字节,操作字节和字节数组。
  • 字节流可用于操作任何类型的对象,包括二进制对象,但他不能直接处理Unicode字符。
  • 字节流是最基本的,所有的InputStream和OutputStream的子类都是字节流。
  • 一般用于对二进制数据的读写,例如:图像,声音等数据。

2、InputStream和OutputStream

在这里插入图片描述
InputStream: 抽象类。
在这里插入图片描述
(1.) InputStream是个输入流,同样也是一个字节流。

(2.) 使用该类可能发生异常,所以要进行异常处理。

(3.) InputStream的直接子类。

(4.) 创建了该类的子类对象后,需要调用close()方法手动关闭。

  • FileInputStream:从文件系统中的文件获取输入字节,用于读取诸如图像数据的原始字节流。是一个比较常用的类。
    其两个常用的构造方法:
    FileInputStream(File file) :通过打开与实际文件的连接创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。
    实例代码如下:
 public static void main(String[] args) throws IOException {

        //file类得到的文件不能直接写入。
        File file = new File("E:\\javaStudy\\src\\yg\\day10\\Demo01.java");

        //初始化
        InputStream is = new FileInputStream("E:\\javaStudy\\src\\yg\\day10\\Demo01.java");
        InputStream inputStream = new FileInputStream(file);
}

FileInputStream(String name) :通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。
该路径可以是绝对路径也可以是相对路径。

  • ByteArrayInputStream:包含一个内部缓冲区,可以读取字节数组中的数据。
    构造方法:
    ByteArrayInputStream(byte[] buf) :创建一个 ByteArrayInputStream ,使其使用 buf作为其缓冲区数组。
    ByteArrayInputStream(byte[] buf, int offset, int length) :创建 ByteArrayInputStream使用 buf作为其缓冲器阵列。
    注意:该类调用了close方法后,依然可以使用该类中的其他方法。代码如下:
 public static void main(String[] args) throws IOException {

        byte[] bytes = new byte[10];

        bytes[0] = 1;

        bytes[1] = 3;

        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);

        System.out.println(byteArrayInputStream.read());

        byteArrayInputStream.close();

        System.out.println(byteArrayInputStream.read());
    }

运行结果:
在这里插入图片描述

  • PipedInputStream:管道字节输入流,可以实现多线程间的管道通信。
  • ObjectInputStream:对象输入流,反序列化中使用。
  • BufferedInputStream:添加了缓冲输入和支持mark和reset方法的功能。默认缓冲区大小为8192。先将数据读入缓冲区,在从缓冲区读入到程序当中。

OutputStream 输出字节流
在这里插入图片描述

  • FileOutputStream的使用
public static void main(String[] args) {

        //file类得到的文件不能直接写入。
        File file = new File("E:\\javaStudy\\src\\yg\\day10\\Demo02.java");

        OutputStream os = null;
        try {
            OutputStream outputStream = new FileOutputStream(file);
            os = new FileOutputStream(file);

            String s = "1111";
            os.write(s.getBytes());

            outputStream.close();
            os.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

如果指定路径的文件或文件夹不存在,使用该类写入时会自动创建文件夹。并且写入数据的时候要将数据转换成字节。

  • ByteArrayOutputStream:向字节数组中写入数据。
  • PipedOutputStream:向与其它线程共用的管道中写入数据.
  • PrintStream:为另一个输出流添加了功能,即能够方便地打印各种数据值的表示。类似缓冲流一样给底层介质流提供功能,这功能就是数字和对象转化为文本。PrintStream从不抛出IOException ,可以自动刷新。
    System.out和PrintStream类的关系:
    先看看 System类中的字段public static final PrintStream out;实际上out就是PrintStream类的实例。

五、字符流

1、特点

  • 字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串。
  • 字符流只能处理字符或者字符串。
  • 字符流是按虚拟机的编码来处理数据。

2、Reader和Write

在这里插入图片描述

Reader 字符输入流
在这里插入图片描述

  • Reader:字符输出流的所有父类。
  • CharArrayReader:从字符数组中读取数据。
  • PipedReader:与其它线程共用的管道中读取数据。
  • FilterReader:所有自定义具体装饰流的父类。
  • BufferedReader:从字符输入流读取文本,缓冲区存放字符,以提供字符,数组和行的高速读取。如果没有缓冲,每次使用read()和readLine()可能会导致从文件中读取字节,转换成字符,这可能非常低效。
    构造方法:
    1、 BufferedReader(Reader in) :创建使用默认大小的输入缓冲区的缓冲字符输入流。(默认缓冲区大小,8192)
    2、 BufferedReader(Reader in, int sz) :创建使用指定大小的输入缓冲区的缓冲字符输入流。 (指定缓冲区大小)
    代码实例:
 public static void main(String[] args) throws IOException {

        File file = new File("E:\\javaStudy\\src\\yg\\day10\\Demo01.java");

        Reader reader = new FileReader(file);

        BufferedReader bufferedReader = new BufferedReader(reader);

        System.out.println((char)bufferedReader.read());
        
        reader.close();
        
        bufferedReader.close();
    }

主要成员方法:
在这里插入图片描述

  • InputStreamReader:是一个连接字节流和字符流的桥梁,它将字节流转变为字符流。FileReader实现此功能的常用工具类。

Write 字符输出流
在这里插入图片描述

  • write:所有字符输出流的父类。
  • CharArrayWriter:向Char 数组中写入数据。
  • PrintWriter 和PrintStream 极其类似,功能和使用也非常相似。
  • OutputStreamWriter 是OutputStream 到Writer 转换的桥梁,它的子类FileWriter 其实就是一个实现此功能的具体类。
  • BufferedWriter:将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入。提供了一个newLine()方法,它使用平台自己的系统属性line.separator定义的行分隔符概念。 并非所有平台都使用换行符(’\ n’)来终止行。

六、字符流和字节流的转换

  • InputStreamReader(OutStream out):将字节流以字符流输出。
  • OutputStreamWriter(InputStream in):将字节流以字符流输入。

总结

  • 字节输入流中常用的类是FileInputStream;
  • 字节输出流中常用的类是FileOutputStream。注意:写入文件时,如不需覆盖原本文件内容时,需要将其构造方法第二个参数设为true。例如:FileOutputStream(file, true);参数为false,表示新写入的内容将覆盖原有文件内容。
  • 字符输入流中常用类是FileReader。
  • 字符输出流中常用类是FileWrite。构造函数第二个参数为false,覆盖原有内容;true,原有内容后面添加新内容。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值