一、InputStream概述
Java的InputStream是输入流的抽象基类,在java.io包中定义。它是所有输入流的父类。一个输入流可以有不同的来源,例如文件、网络连接、内存缓冲区等。输入流用于从数据源中读取数据。
InputStream使用一些通用的方法来读取字节数据。其中最基本的方法是read()。read()方法从输入流中读取一定数量的字节数,并返回读取字节数量。
InputStream的实现子类包括FileInputStream, ByteArrayInputStream, StringBufferInput等等。Java通常使用InputStream和OutputStream类来处理与字节流相关的输入/输出(I/O)操作。
二、InputStream的常用方法
1. read()
int b = inputStream.read(); while(b != -1) { // do something with byte b = inputStream.read(); }
read()方法会从输入流中读取一个字节的数据。如果已经到达流的结束,则返回-1。该方法最常用于循环中,直到读取到-1为止。
2. read(byte b[])
byte[] buffer = new byte[1024]; int bytesRead = inputStream.read(buffer); while(bytesRead != -1) { // 处理buffer bytesRead = inputStream.read(buffer); }
该方法从输入流中读取数据到一个缓冲区(byte数组)中。返回值是实际读取的字节数。如果返回-1,则表示已到达流的末尾。
3. skip(long n)
// Skip the first n bytes inputStream.skip(1024);
该方法跳过并丢弃输入流中的n个字节。该方法返回实际跳过的字节数。如果在跳过的字节数小于n时到达流的末尾,则返回值为比n小的正整数。
4. available()
int count = inputStream.available(); byte[] buffer = new byte[count]; inputStream.read(buffer);
available()方法返回输入流中可读取字节数的估计值。虽然该值不保证准确,但是具有参考意义。
三、InputStream使用示例
下面是一个使用InputStream读取文件内容的示例:
try (InputStream input = new FileInputStream("file.txt")) { byte[] buffer = new byte[1024]; int bytesRead = input.read(buffer); while (bytesRead != -1) { // 处理buffer bytesRead = input.read(buffer); } } catch (IOException e) { // 处理错误 }
在代码示例中,使用try-with-resources语句打开文件输入流。接着,定义一个缓冲区并从输入流中读取字节数据,处理读取到的字节,直到读取全部数据或发生异常。
在这个示例中,读取的字节数是缓冲区的大小,但是如果需要,可以更改缓冲区大小,以满足实际需要。
四、小结
Java的InputStream类提供了一些基本的方法来从不同来源(例如文件、网络连接、内存缓冲区等)中读取字节数据。这使得Java程序可以轻松访问和操作这些数据源。
在读取数据时,需要注意异常处理和缓冲区的使用。例如,为了避免资源泄漏,需要使用try-with-resources语句来关闭输入流。此外,使用适当大小的缓冲区可以提高读取性能。