• Java IO输入输出流 第15章


    Java I/O输入/输出流 第15章

    1.输入/输出流

    Java I/O(输入/输出)流是用于在Java程序中处理输入和输出数据的机制。这是与文件、网络连接、键盘、屏幕等各种数据源和数据目标进行交互的重要方式。Java的I/O库提供了一组类来处理各种I/O操作,这些类位于java.io包中。

    Java I/O流主要分为两类:

    1. 字节流(Byte Streams):这些流以字节为单位进行数据传输,适用于处理二进制数据,如图像、音频、视频等。常见的字节流类包括FileInputStreamFileOutputStreamBufferedInputStreamBufferedOutputStream等。
    2. 字符流(Character Streams):这些流以字符为单位进行数据传输,适用于处理文本数据,如文本文件的读写。字符流会自动处理字符编码和解码,以确保正确的字符转换。常见的字符流类包括FileReaderFileWriterBufferedReaderBufferedWriter等。

    1.1输入流

    输入流(InputStream)是用于从数据源(通常是文件、网络连接或其他数据源)读取数据的抽象类。输入流提供了各种方法来从数据源中逐个字节或一组字节读取数据。输入流通常用于处理输入数据,如文件读取、网络通信中的数据接收等。

    以下是一些常用的Java输入流类和方法:

    1. FileInputStream:用于从文件中读取数据。

      InputStream input = new FileInputStream("example.txt");
      
      • 1
    2. ByteArrayInputStream:用于从字节数组中读取数据。

      byte[] data = new byte[] { 65, 66, 67, 68 };
      InputStream input = new ByteArrayInputStream(data);
      
      • 1
      • 2
    3. BufferedInputStream:用于提高性能的缓冲输入流。它包装在其他输入流周围,通过缓冲区一次读取多个字节。

      InputStream input = new BufferedInputStream(new FileInputStream("example.txt"));
      
      • 1
    4. DataInputStream:用于以二进制格式读取基本数据类型。

      InputStream input = new DataInputStream(new FileInputStream("data.dat"));
      
      • 1
    5. ObjectInputStream:用于反序列化对象,从输入流中还原对象。

      InputStream input = new FileInputStream("object.dat");
      ObjectInputStream objectInput = new ObjectInputStream(input);
      Object obj = objectInput.readObject();
      
      • 1
      • 2
      • 3
    6. PipedInputStream:用于线程间通信,通过管道传输数据。

      PipedInputStream input = new PipedInputStream();
      
      • 1

    使用输入流时,通常会调用其read方法来读取数据,并根据读取结果进行处理。输入流的常用方法包括:

    • int read():从输入流中读取下一个字节的数据,返回读取的字节数据,如果到达流的末尾,则返回-1。
    • int read(byte[] buffer):从输入流中读取多个字节数据到字节数组中,并返回实际读取的字节数。
    • int read(byte[] buffer, int offset, int length):从输入流中读取指定数量的字节到字节数组的指定偏移位置,返回实际读取的字节数。
    • void close():关闭输入流,释放相关资源。

    以下是一个简单的示例,演示如何使用FileInputStream读取文件中的数据:

    import java.io.*;
    
    public class InputStreamExample {
        public static void main(String[] args) {
            try {
                InputStream input = new FileInputStream("example.txt");
                int data;
                while ((data = input.read()) != -1) {
                    System.out.print((char) data);
                }
                input.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    这个示例使用FileInputStream从名为"example.txt"的文件中逐个字节读取数据,并将其显示在控制台上。

    1.2输出流

    输出流(OutputStream)是用于向数据目标(通常是文件、网络连接或其他数据目标)写入数据的抽象类。输出流提供了各种方法来将数据逐个字节或一组字节写入到数据目标中。输出流通常用于处理输出数据,如将数据写入文件、通过网络发送数据等。

    以下是一些常用的Java输出流类和方法:

    1. FileOutputStream:用于将数据写入文件。

      OutputStream output = new FileOutputStream("output.txt");
      
      • 1
    2. ByteArrayOutputStream:用于将数据写入字节数组。

      ByteArrayOutputStream output = new ByteArrayOutputStream();
      
      • 1
    3. BufferedOutputStream:用于提高性能的缓冲输出流。它包装在其他输出流周围,通过缓冲区一次写入多个字节。

      OutputStream output = new BufferedOutputStream(new FileOutputStream("output.txt"));
      
      • 1
    4. DataOutputStream:用于以二进制格式写入基本数据类型。

      OutputStream output = new DataOutputStream(new FileOutputStream("data.dat"));
      
      • 1
    5. ObjectOutputStream:用于将对象序列化后写入输出流中。

      OutputStream output = new FileOutputStream("object.dat");
      ObjectOutputStream objectOutput = new ObjectOutputStream(output);
      objectOutput.writeObject(someObject);
      
      • 1
      • 2
      • 3
    6. PipedOutputStream:用于线程间通信,通过管道传输数据。

      PipedOutputStream output = new PipedOutputStream();
      
      • 1

    使用输出流时,通常会调用其write方法来写入数据,并根据写入结果进行处理。输出流的常用方法包括:

    • void write(int b):将一个字节写入输出流。
    • void write(byte[] buffer):将字节数组中的所有数据写入输出流。
    • void write(byte[] buffer, int offset, int length):将字节数组中的指定范围数据写入输出流。
    • void flush():将缓冲区中的数据立即刷新到输出流,确保数据被写入。
    • void close():关闭输出流,释放相关资源

    以下是一个简单的示例,演示如何使用FileOutputStream将数据写入文件:

    import java.io.*;
    
    public class OutputStreamExample {
        public static void main(String[] args) {
            try {
                OutputStream output = new FileOutputStream("output.txt");
                String data = "Hello, Java I/O!";
                byte[] bytes = data.getBytes();
                output.write(bytes);
                output.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    这个示例使用FileOutputStream将字符串数据写入名为"output.txt"的文件中

    2.File类

    File类是Java中用于操作文件和目录的类,它提供了一种在文件系统中创建、访问、检查和管理文件和目录的方法。File类的实例可以代表文件或目录的路径,允许你进行文件和目录的各种操作,如创建文件、删除文件、查询文件信息等。

    以下是File类的一些常见操作和用法:

    1. 创建文件或目录

      • File file = new File("example.txt"):创建一个代表名为"example.txt"的文件的File对象。
      • File dir = new File("myDirectory"):创建一个代表名为"myDirectory"的目录的File对象。
      • file.createNewFile():在文件系统中创建一个文件。
      • dir.mkdir():在文件系统中创建一个目录。
    2. 检查文件或目录属性

      • file.exists():检查文件是否存在。
      • file.isFile():检查File对象是否代表文件。
      • dir.isDirectory():检查File对象是否代表目录。
      • file.getName():获取文件或目录的名称。
      • file.getAbsolutePath():获取文件或目录的绝对路径。
    3. 获取文件和目录内容

      • dir.list():返回目录中的文件和子目录的名称数组。
      • dir.listFiles():返回目录中的文件和子目录的File对象数组。
    4. 删除文件或目录

      • file.delete():删除文件。
      • dir.delete():删除目录。
    5. 重命名文件或目录

      • file.renameTo(newName):重命名文件。
      • dir.renameTo(newName):重命名目录。
    6. 遍历目录内容

      使用递归或循环来遍历目录中的文件和子目录。你可以使用listFiles()方法获取File对象数组,并递归遍历子目录。

    例1:在指定盘目录创建文本文件

    在这里插入图片描述

    3.文件输入/输出流

    3.1FileInputStream和FileOutputStream类

    FileInputStreamFileOutputStream是Java中用于文件输入和输出的类,它们分别用于从文件中读取数据和将数据写入文件。这两个类属于字节流,适用于处理二进制数据,如图像、音频、视频以及文本等。以下是关于它们的更详细信息:

    1. FileInputStream
      • FileInputStream 是用于从文件中读取数据的类。
      • 它继承自 InputStream 类,因此可以使用所有 InputStream 提供的方法来读取文件中的字节数据。
      • 你可以通过创建一个 FileInputStream 对象,并传递文件路径作为参数来打开一个文件以供读取。
      • 通常使用 read() 方法从文件中逐个字节地读取数据。例如,int data = fileInputStream.read(); 会返回文件中的下一个字节数据。
      • 需要注意的是,在使用完 FileInputStream 后,应该调用 close() 方法关闭流,以确保文件句柄和系统资源得到释放。
    2. FileOutputStream
      • FileOutputStream 是用于向文件中写入数据的类。
      • 它继承自 OutputStream 类,因此可以使用所有 OutputStream 提供的方法来写入数据到文件中。
      • 你可以通过创建一个 FileOutputStream 对象,并传递文件路径作为参数来打开一个文件以供写入。
      • 通常使用 write() 方法将字节数据写入文件。例如,fileOutputStream.write(data) 会将一个字节的数据写入文件。
      • 需要注意,在使用完 FileOutputStream 后,应该调用 close() 方法关闭流,以确保文件得到保存并释放相关资源。

    例2:写入/读取文本内容

    在这里插入图片描述

    3.2FileReader和FileWriter类

    FileReaderFileWriter 是 Java 中用于读取和写入字符数据的类,它们通常用于处理文本文件。这两个类是字符流,会自动处理字符编码和解码,以确保正确的字符转换。以下是关于它们的更详细信息:

    1. FileReader:
      • FileReader 用于从文件中读取字符数据。
      • 它继承自 InputStreamReader 类,因此可以使用所有 Reader 提供的方法来读取字符数据。
      • 你可以通过创建一个 FileReader 对象,并传递文件路径作为参数来打开一个文件以供读取。
      • 通常使用 read() 方法从文件中逐个字符地读取数据。例如,int data = fileReader.read(); 会返回文件中的下一个字符数据。
      • 需要注意的是,在使用完 FileReader 后,应该调用 close() 方法关闭流,以确保文件句柄和系统资源得到释放。
    2. FileWriter:
      • FileWriter 用于向文件中写入字符数据。
      • 它继承自 OutputStreamWriter 类,因此可以使用所有 Writer 提供的方法来写入字符数据到文件中。
      • 你可以通过创建一个 FileWriter 对象,并传递文件路径作为参数来打开一个文件以供写入。
      • 通常使用 write() 方法将字符数据写入文件。例如,fileWriter.write(data) 会将一个字符的数据写入文件。
      • 需要注意的是,在使用完 FileWriter 后,应该调用 close() 方法关闭流,以确保文件得到保存并释放相关资源。

    例3:字符流读写文本

    在这里插入图片描述

    4.带缓存的输入/输出流

    4.1 BufferedInputStream与BufferedOutputStream类

    BufferedInputStreamBufferedOutputStream 是 Java 中用于提高 I/O 性能的类,它们通过使用内部缓冲区来批量读取和写入数据,从而减少了与底层流的频繁交互。这些类属于字节流,适用于处理二进制数据,如文件、网络连接等。以下是关于它们的更详细信息:

    1. BufferedInputStream:
      • BufferedInputStream 用于从输入流中读取数据,并提供了内部缓冲区,可以一次读取多个字节数据。
      • 你可以通过创建一个 BufferedInputStream 对象,并将其他输入流(如 FileInputStream)作为参数传递给它,以创建一个包装了缓冲功能的输入流。
      • 使用 read() 方法来从缓冲区中读取数据,通常一次读取多个字节,然后逐个返回。
      • BufferedInputStream 对于频繁的小量读取操作特别有用,因为它可以减少与底层流的交互次数,提高读取性能。
    2. BufferedOutputStream:
      • BufferedOutputStream 用于向输出流中写入数据,并提供了内部缓冲区,可以一次写入多个字节数据。
      • 你可以通过创建一个 BufferedOutputStream 对象,并将其他输出流(如 FileOutputStream)作为参数传递给它,以创建一个包装了缓冲功能的输出流。
      • 使用 write() 方法来将数据写入缓冲区,通常一次写入多个字节,然后一次性刷新到底层输出流。
      • BufferedOutputStream 对于频繁的小量写入操作也特别有用,因为它可以减少与底层流的交互次数,提高写入性能。

    4.2BufferedReader与BufferedWriter类

    BufferedReaderBufferedWriter 是 Java 中用于读取和写入字符数据的类,它们提供了缓冲功能,可以一次读取和写入多个字符,从而提高了 I/O 性能。这些类通常用于处理文本数据,如文本文件的读写。以下是关于它们的更详细信息:

    1. BufferedReader:
      • BufferedReader 用于从字符输入流中读取数据,并提供了内部缓冲区,可以一次读取多个字符数据。
      • 你可以通过创建一个 BufferedReader 对象,并将其他字符输入流(如 FileReaderInputStreamReader)作为参数传递给它,以创建一个包装了缓冲功能的字符输入流。
      • 使用 read() 方法来从缓冲区中读取数据,通常一次读取多个字符,然后逐个返回。
      • BufferedReader 对于频繁的小量读取操作特别有用,因为它可以减少与底层流的交互次数,提高读取性能。另外,它还提供了一些方便的方法用于读取行。
    2. BufferedWriter:
      • BufferedWriter 用于向字符输出流中写入数据,并提供了内部缓冲区,可以一次写入多个字符数据。
      • 你可以通过创建一个 BufferedWriter 对象,并将其他字符输出流(如 FileWriterOutputStreamWriter)作为参数传递给它,以创建一个包装了缓冲功能的字符输出流。
      • 使用 write() 方法来将数据写入缓冲区,通常一次写入多个字符,然后一次性刷新到底层输出流。
      • BufferedWriter 对于频繁的小量写入操作也特别有用,因为它可以减少与底层流的交互次数,提高写入性能。另外,它还提供了一些方便的方法用于写入行。

    例题4

    在这里插入图片描述

    5数据输入/输出流

    数据输入流和数据输出流(DataInputStream 和 DataOutputStream)是 Java 中用于以二进制格式读写基本数据类型的类。它们是字节流,通常用于处理二进制数据,如将整数、浮点数等写入文件并读取它们。

    以下是关于数据输入流和数据输出流的更详细信息:

    DataInputStream:

    • DataInputStream 是用于以二进制格式从输入流中读取基本数据类型的类。
    • 你可以通过创建一个 DataInputStream 对象,并将其他输入流(如 FileInputStreamSocketInputStream)作为参数传递给它,以创建一个包装了二进制数据读取功能的输入流。
    • 使用 readInt(), readDouble(), readBoolean(), 等方法从输入流中读取基本数据类型的数据。
    • 通常与 DataOutputStream 配合使用,以确保写入和读取的数据格式一致。

    DataOutputStream:

    • DataOutputStream 用于以二进制格式向输出流中写入基本数据类型的类。
    • 你可以通过创建一个 DataOutputStream 对象,并将其他输出流(如 FileOutputStreamSocketOutputStream)作为参数传递给它,以创建一个包装了二进制数据写入功能的输出流。
    • 使用 writeInt(), writeDouble(), writeBoolean(), 等方法将基本数据类型的数据写入输出流。
    • 通常与 DataInputStream 配合使用,以确保写入和读取的数据格式一致。

    在这里插入图片描述

  • 相关阅读:
    c++游戏常用函数
    购物季订单多管理难?用WeLink轻松搞定
    【Flink】flink简介
    实现STL(SGI)的string(深拷贝)
    开发视频会议系统:使用GPU解码渲染视频
    龟速乘【模板】
    乾元通多卡聚合路由器的技术解析
    【快速搞定Webpack5】处理图片资源(四)
    云原生之Linux命名空间和docker容器隔离
    Linux安装ffmpeg并截取图片和视频的缩略图使用
  • 原文地址:https://blog.csdn.net/Sion_one/article/details/133977409