一、了解InputStream和ByteArrayInputStream
1、InputStream是Java IO包中的一个抽象类,它是所有输入流的超类。InputStream主要用于读取字节流,由于它是一个抽象类,它本身并不能被实例化,需要使用InputStream的子类进行实例化。
2、ByteArrayInputStream是InputStream类的子类,它通过一个内部缓冲区来实现字节流的读取操作。我们可以将一个字节数组作为参数传递给ByteArrayInputStream的构造器,然后使用read()方法从流中读取字节。
二、实现从网络流中读取数据
1、我们需从输入流中读取字节,因此我们需要实例化一个InputStream对象。
2、我们将使用Socket类来建立一个基于TCP的网络连接。为此,我们需要指定网络地址和端口号。
3、我们需要读取从服务器端发送的数据流,我们需要一个循环来持续执行读取。我们还需要一个缓冲区来存储读取的字节。
public class NetworkInputStreamExample { public static void main(String args[]) throws Exception { // 创建一个InputStream对象 InputStream inputStream; // 创建一个Socket对象,指定要连接的服务器IP地址和端口号 Socket socket = new Socket("localhost", 7777); // 获取输入流对象 inputStream = socket.getInputStream(); // 定义一个缓冲区,用于存储从输入流中读取到的数据 byte[] buffer = new byte[1024]; // 定义一个变量,用于记录读取到的字节数 int length; // 循环读取输入流中的字节 while ((length = inputStream.read(buffer)) != -1) { // 将读取到的字节转换成字符串并输出 System.out.println(new String(buffer, 0, length)); } // 关闭输入流和socket连接 inputStream.close(); socket.close(); } }
三、从ByteArrayInputStream中读取数据
1、我们需要把一个byte数组作为参数传递给ByteArrayInputStream构造器,来获得一个字节输入流。
2、我们需要一个循环,每次从流中读取一个字节,并将它转换为char类型输出。
public class ByteArrayInputStreamExample { public static void main (String[] args) { // 定义一个byte数组 byte[] byteArray = new byte[] {65, 66, 67, 68, 69, 70}; // 使用byte数组创建一个 ByteArrayInputStream 对象 ByteArrayInputStream bais = new ByteArrayInputStream(byteArray); // 从流中读取数据并转换为字符 while (bais.available() > 0) { char c = (char) bais.read(); System.out.println("Read a char: " + c); } } }
四、结论
输入流是Java中非常重要的一部分,它用于从各种数据源中读取字节。InputStream是一个抽象类,它是所有输入流的超类。ByteArrayInputStream是InputStream类的一个子类,它通过一个内部缓冲区来实现字节流的读取操作。
尽管InputStream是一个抽象类,它仍然有很多具体的子类。当我们需要读取网络流时,我们需要一个Socket对象来建立网络连接,并使用getInputStream()方法来获取输入流对象。
这篇文章中,我们介绍了一个使用ByteArrayInputStream的例子。我们使用该类从一个byte数组中读取数据,并将数据转换为一个char类型进行输出。