“你好,阿米戈!接下来我会告诉你有两个接口:InputStreamOutputStream。它们被声明为抽象类,但如果你深入学习,会发现它们本质上是接口。几乎所有方法都是抽象的,除了几个无关紧要的方法。它们很像我们之前说的“保镖”。

“这些接口非常有意思。现在,我姑且将它们称之为接口,方便你理解我们为何需要它们。然后我们讲讲为什么它们实际上是抽象类。

“好的。这些接口是什么呢?”

“不用多说,我会告诉你的。”

Java 有个有趣的东西,叫做“”。是一个非常简单的实体。它的简单性正是强大的数据交换方式的关键。一共有两种类型的流:读取流和写入流

你可能也猜到了,写入流中可以写入数据。它有 write 方法。你可以从读取流中读取数据。它有 read() 方法。

InputStream  是流支持读取的接口。它定义如下能力:“可以从我读取字节”。

同样,OutputStream 是支持写入的流的接口。它定义如下能力:“字节可以写入我”。

“完了?”

“差不多了。这个关键点就是 Java 拥有大量可以处理 InputStreamOutputStream 的类。例如,如果你要从磁盘读取文件并在屏幕上显示内容。再容易不过了。”

要从磁盘的文件中读取数据,我们有特殊的 FileInputStream 类,这会实现 InputStream 接口。要将此数据写入另一个文件?对此,我们有 FileInputStream 类,这会实现 OutputStream 接口。以下代码显示了将数据从一个文件复制到另一个文件所需执行的操作。

代码
public static void main(String[] args) throws IOException
{
 InputStream inStream = new FileInputStream("c:/source.txt");
 OutputStream outStream = new FileOutputStream("c:/result.txt");

 while (inStream.available() > 0)
 {
  int data = inStream.read(); //read one byte from the input stream
  outStream.write(data); //write that byte to the other stream.
 }

 inStream.close(); //close the streams
 outStream.close();
}

试想一下,我们已经写了一个类,并在其中添加了 InputStream 和 OutputStream 能力。

如果我们正确实现了这些接口,则可以将类的实例保存到文件或从文件中读取。只要通过 read 方法读取其内容。或者它们可以从一个文件加载,只要创建一个对象并使用 write 方法写入文件内容。

“可以举个例子吗?”

“当然可以。”

代码 说明
class MyClass
{
private ArrayList<Integer> list;
}
为简单起见,假设我们的类包含一个对象 ArrayList 存在 Integers。

现在我们将添加 read 和 write 方法

代码 说明
class MyClass
{
private ArrayList<Integer> list;
public void write(int data)
{
list.add(data);
}
public int read()
{
int first = list.get(0);
list.remove(0);
return first;
}

public int available()
{
return list.size();
}
}
现在,我们的类实现 read 方法,这使得它能够按顺序读取 list 的全部内容。

对于 write 方法,它可以让你将值写入我们的列表。

当然,这并不是 InputStream 和 OutputStream 的实现,但很相像。

“嗯,我听懂了。那么如何将这样对象的内容保存到文件?”

“我给你举个例子:“

将 MyClass 对象写入文件
public static void main(String[] args)
{
 MyClass myObject = new MyClass();
 OutputStream outStream = new FileOutputStream ("c:/my-object-data.txt");

 while (myObject.available() > 0)
 {
  int data = myObject.read(); //read one int from the input stream
  outStream.write(data); //write that int to the other stream.
 }

 outStream.close();
}
从文件读取 MyClass 对象
public static void main(String[] args)
{
 InputStream inStream = new FileInputStream("c:/my-object-data.txt");
 MyClass myObject = new MyClass();

 while (inStream.available() > 0)
 {
  int data = inStream.read(); //read one int from the input stream
  myObject.write(data); //write that int to the other stream.
 }

 inStream.close(); //close the streams
}

“天哪!它真的是非常类似于使用 InputStream/OutputStream。流太好用了!”

“还不止这样呢!”