💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# 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/)。