在 Java 中,InputStream
是一个抽象类,代表了所有输入字节流的基类。它用于读取字节数据,是 Java 输入输出流机制的核心部分。InputStream
的主要功能是从不同的数据源(如文件、网络、内存等)读取字节数据。
InputStream
是 Java I/O 流体系中的一个重要组成部分,位于 java.io
包下。它提供了多种方法来读取字节数据,但由于它是一个抽象类,不能直接实例化。常用的实现类如 FileInputStream
、BufferedInputStream
、ByteArrayInputStream
等。
InputStream
实现类FileInputStream
:用于从文件中读取数据。BufferedInputStream
:为其他输入流提供缓冲功能,提升读取性能。ByteArrayInputStream
:将字节数组作为输入源来读取数据。ObjectInputStream
:用于反序列化对象。InputStream
类提供了一些用于读取字节数据的方法,最常用的有以下几种:
int read()
java
int read() throws IOException
从输入流中读取一个字节的数据,并返回该字节。如果到达流的末尾,则返回 -1
。
int read(byte[] b)
java
int read(byte[] b) throws IOException
从输入流中读取多个字节并将其存储到字节数组 b
中。返回值是实际读取的字节数。如果到达流的末尾,返回 -1
。
int read(byte[] b, int off, int len)
java
int read(byte[] b, int off, int len) throws IOException
从输入流中读取最多 len
个字节,并将其存储到字节数组 b
中,从指定的偏移量 off
开始。返回值是实际读取的字节数。如果到达流的末尾,返回 -1
。
long skip(long n)
java
long skip(long n) throws IOException
跳过输入流中的 n
个字节并返回跳过的字节数。这个方法常用于跳过不需要的数据。
int available()
java
int available() throws IOException
返回当前输入流中可以读取的字节数,但不一定表示所有字节都能立刻读取。它的返回值表示流中剩余的字节数。
void close()
java
void close() throws IOException
关闭输入流,释放相关资源。每次使用流结束后都应该调用该方法,通常会通过 try-with-resources
语句自动关闭流。
以下是一个简单的示例,演示如何使用 FileInputStream
从文件中读取字节数据。
```java import java.io.FileInputStream; import java.io.IOException;
public class InputStreamExample { public static void main(String[] args) { try (FileInputStream fis = new FileInputStream("example.txt")) { int byteData; while ((byteData = fis.read()) != -1) { System.out.print((char) byteData); } } catch (IOException e) { e.printStackTrace(); } } } ```
```java import java.io.FileInputStream; import java.io.IOException;
public class InputStreamExample { public static void main(String[] args) { try (FileInputStream fis = new FileInputStream("example.txt")) { byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = fis.read(buffer)) != -1) { System.out.write(buffer, 0, bytesRead); } } catch (IOException e) { e.printStackTrace(); } } } ```
FileInputStream
是 InputStream
的子类,它允许从文件中读取字节数据。通过它,我们可以读取文件中的数据并将其处理。
```java import java.io.FileInputStream; import java.io.IOException;
public class FileInputStreamExample { public static void main(String[] args) { try (FileInputStream fis = new FileInputStream("example.txt")) { int data; while ((data = fis.read()) != -1) { System.out.print((char) data); } } catch (IOException e) { e.printStackTrace(); } } } ```
ByteArrayInputStream
是 InputStream
的另一个子类,它从字节数组中读取数据。它对于处理内存中的数据非常有用。
```java import java.io.ByteArrayInputStream; import java.io.IOException;
public class ByteArrayInputStreamExample { public static void main(String[] args) { byte[] data = "Hello, InputStream!".getBytes(); try (ByteArrayInputStream bais = new ByteArrayInputStream(data)) { int byteData; while ((byteData = bais.read()) != -1) { System.out.print((char) byteData); } } catch (IOException e) { e.printStackTrace(); } } } ```
从 Java 7 开始,Java 引入了 try-with-resources 语法,允许我们在使用 InputStream
时自动关闭流,而无需手动调用 close()
方法。
java
try (InputStream is = new FileInputStream("example.txt")) {
// 使用流进行读取操作
} catch (IOException e) {
e.printStackTrace();
}
// 这里的 InputStream 会自动关闭
对于大文件的读取,直接使用 InputStream
可能会导致性能问题。此时,使用 BufferedInputStream
可以提高读取效率。
```java import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException;
public class BufferedInputStreamExample { public static void main(String[] args) { try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("example.txt"))) { int byteData; while ((byteData = bis.read()) != -1) { System.out.print((char) byteData); } } catch (IOException e) { e.printStackTrace(); } } } ```
InputStream
是 Java 中处理字节输入流的核心类,提供了多种读取字节数据的方法。通过继承和实现该类,Java 提供了多种输入流实现,如 FileInputStream
、BufferedInputStream
和 ByteArrayInputStream
,适用于不同的应用场景。掌握 InputStream
的使用,对于高效处理文件读取和数据传输非常重要。