Java 流(Stream)、文件(File)和IO
在 Java 中,流(Stream)、文件(File) 和 输入输出(IO) 是处理数据传输、文件读写和流式数据处理的核心概念。Java 提供了丰富的 API 来实现这些操作,包括 java.io 和 java.nio 包中的类。
1. Java 流(Stream)
流(Stream)是用于读取或写入数据的抽象概念。在 Java 中,流可以分为两种类型:
- 输入流:用于从数据源(如文件、内存、网络连接等)读取数据。
- 输出流:用于将数据写入目标位置(如文件、内存、网络连接等)。
1.1 输入流和输出流的区别
- 输入流:数据从外部传入程序,通常继承自
InputStream(字节流)和Reader(字符流)。 - 输出流:数据从程序传出到外部,通常继承自
OutputStream(字节流)和Writer(字符流)。
1.2 字节流与字符流
- 字节流:用于处理所有类型的I/O操作,包括文本文件和二进制文件。它们继承自
InputStream和OutputStream。 - 例如:
FileInputStream,FileOutputStream - 字符流:专门用于处理字符数据,通常与字节流相比,它们自动处理字符编码。它们继承自
Reader和Writer。 - 例如:
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 字节流与字符流的区别
- 字节流:用于处理所有类型的数据(如图片、音频文件等),
InputStream和OutputStream为父类。 - 字符流:用于处理文本数据,它们通过编码转换来处理字符。
Reader和Writer为父类。
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 操作,您可以高效地进行文件处理和数据传输。更多详细内容请关注其他相关文章!