# Java `FileInputStream`教程

原文：http://zetcode.com/java/fileinputstream/

Java `FileInputStream`教程显示了如何使用`FileInputStream`类读取 Java 中的文件。

## Java `FileInputStream`

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

## Java `FileInputStream`构造器

这些是`FileInputStream`构造器：

*   `FileInputStream(File file)` - 创建文件输入流以从`File`对象读取。
*   `FileInputStream(String name)` - 创建文件输入流以从指定的文件名读取。
*   `FileInputStream(FileDescriptor fdObj)` - 创建从指定文件描述符读取的文件输入。

## Java `FileInputStream`关闭

`FileInputStream`的`close()`方法关闭文件输入流，并释放与此流关联的所有系统资源。 在我们的示例中，我们使用`try-with-resources`语句，该语句确保在语句末尾关闭每个资源。

## Java `FileInputStream`读取

`FileInputStream`使用以下读取方法读取字节：

*   `read(byte[] b)`-从此输入流中读取最多`b.length`个字节的数据到一个字节数组中。
*   `read(byte[] b, int off, int len)`-从此输入流中读取最多`len`个字节的数据到一个字节数组中。
*   `read()`-从文件输入流中读取一个字节。

## Java `FileInputStream`读取字符

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

`FileInputStreamEx.java`

```java
package com.zetcode;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class FileInputStreamEx {

    public static void main(String[] args) throws FileNotFoundException, IOException {

        String fileName = "/home/janbodnar/tmp/smallfile.txt";

        try (FileInputStream fis = new FileInputStream(fileName)) {

            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()`读取三个字符。

```java
char c1 = (char) fis.read();

```

我们用`read()`读取一个字符，并将该值转换为`char`。

```java
System.out.println(c1);

```

字符被打印到控制台。

## Java `FileInputStream`按字符读取文件

如果到达文件末尾，则`read()`方法返回 -1。 通过`while`循环，我们可以逐字符读取整个文件。 请注意，这种方式不是很有效。

`FileInputStreamEx2.java`

```java
package com.zetcode;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class FileInputStreamEx2 {

    public static void main(String[] args) throws FileNotFoundException, IOException {

        String fileName = "/home/janbodnar/tmp/smallfile.txt";

        try (FileInputStream fis = new FileInputStream(fileName)) {

            int i; 

            while ((i = fis.read()) != -1) {
                System.out.print((char) i);
            }
        }        

        System.out.println();
    }
}

```

该示例读取文件的内容并将其写入终端。

```java
while ((i = fis.read()) != -1) {
    System.out.print((char) i);
}

```

在`while`循环中，我们从`FileInputStream`读取字符，直到`read()`方法返回 -1。

## Java `FileInputStream`通过文本块读取文件

按数据块读取文件更有效； 例如每个方法调用中 1024 个字节。

`FileInputStreamEx3.java`

```java
package com.zetcode;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

public class FileInputStreamEx3 {

    public static void main(String[] args) throws FileNotFoundException, IOException {

        String fileName = "/home/janbodnar/tmp/bigfile.txt";

        try (FileInputStream fis = new FileInputStream(fileName)) {

            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);
        }
    }
}

```

在此示例中，我们通过数据块读取文件

```java
byte[] buf = new byte[1024];

```

我们从文件中读取数据到此字节数组中。

```java
i = fis.read(buf);

```

`read()`方法从此流中最多读取`b.length`个字节的数据到提供的字节数组中。

```java
String value = new String(buf, StandardCharsets.UTF_8);

```

从字节数组中，我们创建一个`String`。

## 使用`BufferedReader`的 Java `FileInputStream`

使用`BufferedReader`可以提高阅读效率。 `BufferedReader`从字符输入流中读取文本，缓冲字符，以便有效读取字符。

`FileInputStreamEx4.java`

```java
package com.zetcode;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;

public class FileInputStreamEx4 {

    public static void main(String[] args) throws FileNotFoundException, IOException {

        String fileName = "/home/janbodnar/tmp/bigfile.txt";

        try (BufferedReader br = new BufferedReader(new InputStreamReader(
                new FileInputStream(fileName), StandardCharsets.UTF_8));) {

            String line;

            while ((line = br.readLine()) != null) {

                System.out.println(line);
            }
        }

        System.out.println();
    }
}

```

该示例使用缓冲技术读取大文件，以提高效率。

```java
while ((line = br.readLine()) != null) {

```

`readLine()`方法从缓冲区读取一行文本。

在本教程中，我们介绍了 Java `FileInputStream`类。 您可能也对相关教程感兴趣： [Java `FileOutputStream`教程](/java/fileoutputstream/)， [Java `InputStreamReader`教程](/java/inputstreamreader/)， [Java `InputStream`教程](/java/inputstream/)， [Java 谓词教程](/java/predicate/)， [Java 文件时间](/articles/javafiletime/)， [Java 附加到文件](/articles/javaappendtofile/)，[用 Java 读取文本文件](/articles/javareadtext/)和 [Java 教程](/lang/java/)。