ZetCode

Java FileInputStream

上次修改时间:2024 年 3 月 5 日

在本文中,我们将展示如何使用 FileInputStream 类在 Java 中读取文件。

FileInputStream 从文件系统中的文件读取输入字节。

构造函数

以下是 FileInputStream 构造函数

close 方法

FileInputStreamclose 方法关闭文件输入流并释放与此流关联的任何系统资源。 在我们的示例中,我们使用 *try-with-resources* 语句,该语句确保每个资源在语句结束时关闭。

read 方法

FileInputStream 使用以下 read 方法读取字节

读取字符

以下示例使用 FileInputStream 从文件中读取三个字符。

smallfile.txt
sky blue notice word

在小文本文件中,我们有四个英文单词。

Main.java
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 循环,我们可以逐个字符地读取整个文件。 请注意,这种方式效率不是很高。

smallfile.txt
sky blue notice word

文本文件中有四个英文单词。

Main.java
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 接受字符编码作为第二个参数。

smallfile2.txt
sky blue notice буква čerešňa

我们有三个英文单词,一个俄语单词和一个斯洛伐克语单词。

Main.java
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 字节。

Main.java
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 从字符输入流读取文本,缓冲字符,以便有效地读取字符。

Main.java
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 FileInputStream 类。

作者

我叫 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。 我自 2007 年以来一直在撰写编程文章。到目前为止,我已撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有Java教程