Java FileInputStream
上次修改时间:2024 年 3 月 5 日
在本文中,我们将展示如何使用 FileInputStream 类在 Java 中读取文件。
FileInputStream 从文件系统中的文件读取输入字节。
构造函数
以下是 FileInputStream 构造函数
FileInputStream(File file)— 创建一个文件输入流,用于从File对象读取数据。FileInputStream(String name)— 创建一个文件输入流,用于从指定的文件名读取数据。FileInputStream(FileDescriptor fdObj)— 创建一个文件输入流,用于从指定的文件描述符读取数据。
close 方法
FileInputStream 的 close 方法关闭文件输入流并释放与此流关联的任何系统资源。 在我们的示例中,我们使用 *try-with-resources* 语句,该语句确保每个资源在语句结束时关闭。
read 方法
FileInputStream 使用以下 read 方法读取字节
read(byte[] b)— 从此输入流中最多读取b.length个字节的数据到字节数组中。read(byte[] b, int off, int len)— 从此输入流中最多读取len个字节的数据到字节数组中。read— 从文件输入流中读取一个字节。
读取字符
以下示例使用 FileInputStream 从文件中读取三个字符。
sky blue notice word
在小文本文件中,我们有四个英文单词。
import java.io.FileInputStream;
void main() throws Exception {
String fname = "smallfile.txt";
try (var fis = new FileInputStream(fname)) {
char c1 = (char) fis.read();
char c2 = (char) fis.read();
char c3 = (char) fis.read();
System.out.println(c1);
System.out.println(c2);
System.out.println(c3);
}
}
代码示例使用 read 读取三个字符。
char c1 = (char) fis.read();
我们使用 read 读取一个字符并将该值转换为 char。
System.out.println(c1);
该字符被打印到控制台。
按字符读取文件
如果到达文件末尾,read 方法返回 -1。 使用 while 循环,我们可以逐个字符地读取整个文件。 请注意,这种方式效率不是很高。
sky blue notice word
文本文件中有四个英文单词。
import java.io.FileInputStream;
void main() throws Exception {
String fname = "smallfile.txt";
try (var fis = new FileInputStream(fname)) {
int i;
while ((i = fis.read()) != -1) {
System.out.print((char) i);
}
}
System.out.println();
}
该示例读取文件的内容并将其写入终端。
while ((i = fis.read()) != -1) {
System.out.print((char) i);
}
在 while 循环中,我们从 FileInputStream 读取一个字符,直到 read 方法返回 -1。
如果文件是文本文件并且包含非拉丁字符,我们将 FileInputStream 包装到 InputStreamReader 中。 InputStreamReader 接受字符编码作为第二个参数。
sky blue notice буква čerešňa
我们有三个英文单词,一个俄语单词和一个斯洛伐克语单词。
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
void main() throws Exception {
String fname = "smallfile2.txt";
try (var fis = new InputStreamReader(new FileInputStream(fname),
StandardCharsets.UTF_8)) {
int i;
while ((i = fis.read()) != -1) {
System.out.print((char) i);
}
}
System.out.println();
}
该示例从一个小文件中逐个字符地读取。 该文件还包含非拉丁字符。
$ java Main.java sky blue notice буква čerešňa
按文本块读取文件
按数据块读取文件效率更高; 例如,在每次方法调用中读取 1024 字节。
import java.io.FileInputStream;
import java.nio.charset.StandardCharsets;
void main() throws Exception {
String fname = "bigfile.txt";
try (var fis = new FileInputStream(fname)) {
int i = 0;
do {
byte[] buf = new byte[1024];
i = fis.read(buf);
String value = new String(buf, StandardCharsets.UTF_8);
System.out.print(value);
} while (i != -1);
}
}
在此示例中,我们按数据块读取文件
byte[] buf = new byte[1024];
我们从文件读取数据到此字节数组中。
i = fis.read(buf);
read 方法从此流中最多读取 b.length 个字节的数据到提供的字节数组中。
String value = new String(buf, StandardCharsets.UTF_8);
我们从字节数组创建一个 String。 我们指定使用的字符集。
使用 BufferedReader
使用 BufferedReader 读取效率更高。 BufferedReader 从字符输入流读取文本,缓冲字符,以便有效地读取字符。
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
void main() throws Exception {
String fname = "bigfile.txt";
try (var br = new BufferedReader(new InputStreamReader(
new FileInputStream(fname), StandardCharsets.UTF_8));) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
System.out.println();
}
该示例使用缓冲技术读取一个大文件,以提高效率。
while ((line = br.readLine()) != null) {
readLine 方法从缓冲区读取一行文本。
来源
在本文中,我们介绍了 Java FileInputStream 类。
作者
列出所有Java教程。