原文: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关闭

FileInputStreamclose()方法关闭文件输入流,并释放与此流关联的所有系统资源。 在我们的示例中,我们使用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

  1. package com.zetcode;
  2. import java.io.FileInputStream;
  3. import java.io.FileNotFoundException;
  4. import java.io.IOException;
  5. public class FileInputStreamEx {
  6. public static void main(String[] args) throws FileNotFoundException, IOException {
  7. String fileName = "/home/janbodnar/tmp/smallfile.txt";
  8. try (FileInputStream fis = new FileInputStream(fileName)) {
  9. char c1 = (char) fis.read();
  10. char c2 = (char) fis.read();
  11. char c3 = (char) fis.read();
  12. System.out.println(c1);
  13. System.out.println(c2);
  14. System.out.println(c3);
  15. }
  16. }
  17. }

该代码示例使用read()读取三个字符。

  1. char c1 = (char) fis.read();

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

  1. System.out.println(c1);

字符被打印到控制台。

Java FileInputStream按字符读取文件

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

FileInputStreamEx2.java

  1. package com.zetcode;
  2. import java.io.FileInputStream;
  3. import java.io.FileNotFoundException;
  4. import java.io.IOException;
  5. public class FileInputStreamEx2 {
  6. public static void main(String[] args) throws FileNotFoundException, IOException {
  7. String fileName = "/home/janbodnar/tmp/smallfile.txt";
  8. try (FileInputStream fis = new FileInputStream(fileName)) {
  9. int i;
  10. while ((i = fis.read()) != -1) {
  11. System.out.print((char) i);
  12. }
  13. }
  14. System.out.println();
  15. }
  16. }

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

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

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

Java FileInputStream通过文本块读取文件

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

FileInputStreamEx3.java

  1. package com.zetcode;
  2. import java.io.FileInputStream;
  3. import java.io.FileNotFoundException;
  4. import java.io.IOException;
  5. import java.nio.charset.StandardCharsets;
  6. public class FileInputStreamEx3 {
  7. public static void main(String[] args) throws FileNotFoundException, IOException {
  8. String fileName = "/home/janbodnar/tmp/bigfile.txt";
  9. try (FileInputStream fis = new FileInputStream(fileName)) {
  10. int i = 0;
  11. do {
  12. byte[] buf = new byte[1024];
  13. i = fis.read(buf);
  14. String value = new String(buf, StandardCharsets.UTF_8);
  15. System.out.print(value);
  16. } while (i != -1);
  17. }
  18. }
  19. }

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

  1. byte[] buf = new byte[1024];

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

  1. i = fis.read(buf);

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

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

从字节数组中,我们创建一个String

使用BufferedReader的 Java FileInputStream

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

FileInputStreamEx4.java

  1. package com.zetcode;
  2. import java.io.BufferedReader;
  3. import java.io.FileInputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.IOException;
  6. import java.io.InputStreamReader;
  7. import java.nio.charset.StandardCharsets;
  8. public class FileInputStreamEx4 {
  9. public static void main(String[] args) throws FileNotFoundException, IOException {
  10. String fileName = "/home/janbodnar/tmp/bigfile.txt";
  11. try (BufferedReader br = new BufferedReader(new InputStreamReader(
  12. new FileInputStream(fileName), StandardCharsets.UTF_8));) {
  13. String line;
  14. while ((line = br.readLine()) != null) {
  15. System.out.println(line);
  16. }
  17. }
  18. System.out.println();
  19. }
  20. }

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

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

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

在本教程中,我们介绍了 Java FileInputStream类。 您可能也对相关教程感兴趣: Java FileOutputStream教程Java InputStreamReader教程Java InputStream教程Java 谓词教程Java 文件时间Java 附加到文件用 Java 读取文本文件Java 教程