Java 流(Stream)、文件(File)和IO
                           
天天向上
发布: 2025-03-02 10:41:48

原创
767 人浏览过

在 Java 中,流(Stream)文件(File)输入输出(IO) 是处理数据传输、文件读写和流式数据处理的核心概念。Java 提供了丰富的 API 来实现这些操作,包括 java.iojava.nio 包中的类。

1. Java 流(Stream)

流(Stream)是用于读取或写入数据的抽象概念。在 Java 中,流可以分为两种类型:

  • 输入流:用于从数据源(如文件、内存、网络连接等)读取数据。
  • 输出流:用于将数据写入目标位置(如文件、内存、网络连接等)。

1.1 输入流和输出流的区别

  • 输入流:数据从外部传入程序,通常继承自 InputStream(字节流)和 Reader(字符流)。
  • 输出流:数据从程序传出到外部,通常继承自 OutputStream(字节流)和 Writer(字符流)。

1.2 字节流与字符流

  • 字节流:用于处理所有类型的I/O操作,包括文本文件和二进制文件。它们继承自 InputStreamOutputStream
  • 例如:FileInputStream, FileOutputStream
  • 字符流:专门用于处理字符数据,通常与字节流相比,它们自动处理字符编码。它们继承自 ReaderWriter
  • 例如:FileReader, FileWriter

1.3 常见流类

  • FileInputStream:字节输入流,用于读取文件数据。
  • FileOutputStream:字节输出流,用于写入文件数据。
  • BufferedInputStream:带缓冲区的字节输入流,提高读性能。
  • BufferedOutputStream:带缓冲区的字节输出流,提高写性能。
  • FileReader:字符输入流,用于读取文本文件数据。
  • FileWriter:字符输出流,用于写入文本文件数据。
  • BufferedReader:带缓冲区的字符输入流。
  • BufferedWriter:带缓冲区的字符输出流。

1.4 示例:字节流与字符流

import java.io.*;

public class StreamExample {
    public static void main(String[] args) throws IOException {
        // 字节流示例
        FileInputStream fis = new FileInputStream("example.txt");
        FileOutputStream fos = new FileOutputStream("output.txt");

        int data;
        while ((data = fis.read()) != -1) {
            fos.write(data);
        }

        fis.close();
        fos.close();

        // 字符流示例
        FileReader fr = new FileReader("example.txt");
        FileWriter fw = new FileWriter("output.txt");

        int charData;
        while ((charData = fr.read()) != -1) {
            fw.write(charData);
        }

        fr.close();
        fw.close();
    }
}

2. Java 文件(File)

File 类提供了对文件和目录的操作。它用于检查文件的存在性、文件的大小、文件的路径等基本操作。

2.1 File 类常用方法

  • 创建文件createNewFile()
  • 检查文件是否存在exists()
  • 删除文件delete()
  • 获取文件路径getPath()
  • 获取文件大小length()
  • 列出目录内容list()

2.2 示例:文件操作

import java.io.File;
import java.io.IOException;

public class FileExample {
    public static void main(String[] args) throws IOException {
        File file = new File("example.txt");

        // 检查文件是否存在
        if (!file.exists()) {
            // 创建文件
            file.createNewFile();
            System.out.println("File created: " + file.getName());
        } else {
            System.out.println("File already exists");
        }

        // 获取文件路径和大小
        System.out.println("File path: " + file.getPath());
        System.out.println("File size: " + file.length() + " bytes");

        // 删除文件
        if (file.delete()) {
            System.out.println("File deleted");
        } else {
            System.out.println("File deletion failed");
        }
    }
}

3. Java 输入输出(IO)

Java 的 I/O 库是基于流的,提供了非常灵活的方式来处理输入输出操作。java.io 包包含了许多类,帮助开发人员执行输入输出操作。

3.1 字节流与字符流的区别

  • 字节流:用于处理所有类型的数据(如图片、音频文件等),InputStreamOutputStream 为父类。
  • 字符流:用于处理文本数据,它们通过编码转换来处理字符。ReaderWriter 为父类。

3.2 文件读取与写入

  • 字节流读写文件
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class ByteStreamExample {
    public static void main(String[] args) throws IOException {
        // 写入文件
        FileOutputStream fos = new FileOutputStream("byteExample.txt");
        fos.write("Hello, Byte Stream!".getBytes());
        fos.close();

        // 读取文件
        FileInputStream fis = new FileInputStream("byteExample.txt");
        int data;
        while ((data = fis.read()) != -1) {
            System.out.print((char) data);
        }
        fis.close();
    }
}
  • 字符流读写文件
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class CharStreamExample {
    public static void main(String[] args) throws IOException {
        // 写入文件
        FileWriter fw = new FileWriter("charExample.txt");
        fw.write("Hello, Char Stream!");
        fw.close();

        // 读取文件
        FileReader fr = new FileReader("charExample.txt");
        int data;
        while ((data = fr.read()) != -1) {
            System.out.print((char) data);
        }
        fr.close();
    }
}

4. Java NIO(New IO)

Java NIO(New IO)是 Java 1.4 引入的 API,提供了非阻塞式 IO 操作、文件操作、缓冲区和通道的支持。相比传统的 Java IO,NIO 提供了更高效的文件和网络操作,尤其适用于高并发、大规模数据传输场景。

4.1 NIO 通道和缓冲区

  • 通道(Channel):通道是一个双向数据流的接口,既可以读取数据,也可以写入数据。
  • 例如:FileChannel, SocketChannel
  • 缓冲区(Buffer):缓冲区用于存储数据,所有数据都通过缓冲区传输。
  • 例如:ByteBuffer, CharBuffer

4.2 示例:NIO 文件操作

import java.nio.file.*;
import java.io.IOException;

public class NIOExample {
    public static void main(String[] args) throws IOException {
        Path path = Paths.get("nioExample.txt");

        // 写入文件
        Files.write(path, "Hello, NIO!".getBytes());

        // 读取文件
        byte[] bytes = Files.readAllBytes(path);
        System.out.println(new String(bytes));
    }
}

总结

  • Java 流(Stream)包括字节流(InputStream, OutputStream)和字符流(Reader, Writer),用于读取和写入数据。
  • 文件操作(File)用于检查、创建、删除文件,并获取文件的路径和大小。
  • Java IO(输入输出)提供了用于文件、网络和内存操作的接口与类。
  • Java NIO 提供了更高效的非阻塞 I/O 操作,适用于高性能的 I/O 任务。

通过掌握这些基本的流、文件和 IO 操作,您可以高效地进行文件处理和数据传输。更多详细内容请关注其他相关文章!

发表回复 0

Your email address will not be published. Required fields are marked *