1.OutputStream

我们最近刚刚探索了输入流。是时候讨论输出流了。

该类OutputStream是所有支持字节输出的类的父类。这是一个抽象类,它自己什么都不做,但它有适用于各种场合的子类。

听起来极其复杂。更简单地说,此类对字节进行操作,而不是对字符或其他数据类型进行操作。而且它是抽象的这一事实意味着我们通常不使用它,而是使用它的后代类之一。比如,FileOutputStream之类的。

但是回到OutputStream课堂上。此类具有其所有后代类都必须实现的方法。以下是主要的:

方法 描述
void write(int b)
将一个字节(不是int)写入流。
void write(byte[] buffer)
将字节数组写入流
void write(byte[] buffer, off, len)
将字节数组的一部分写入流
void flush()
将缓冲区中存储的所有数据写入流
void close()
关闭流

当您创建一个继承类的对象时InputStream,您通常会指定一个从中读取数据的源对象InputStream。当您创建一个继承类的对象时OutputStream,您通常还指定数据将写入的目标对象或流。

让我们简要介绍一下该类的所有方法OutputStream

write(int b)方法

此方法将一个字节(不是int)写入输出流。传递的值被强制转换为一个字节,并且丢弃该 int 的前三个字节。

write(byte[] buffer)方法

将给定的字节数组写入输出流。就是这样。

write(byte[] buffer, int offset, int length)方法

将传递的字节数组的一部分写入输出流。偏移量变量表示数组第一个元素的索引,是length要写入的子集的长度。

flush()方法

flush()方法用于强制将当前流中可能缓冲的任何数据写入目标流。这在使用缓冲和/或排列在链中的多个流对象时是相关的。

close()方法

将任何未写入的数据写入目标对象。close()如果您使用块,则无需调用该方法try-with-resources

复制文件的例子

代码 笔记
String src = "c:\\projects\\log.txt";
String dest = "c:\\projects\\copy.txt";

try(FileInputStream input = new FileInputStream(src);
FileOutputStream output = new FileOutputStream(dest))
{
   byte[] buffer = new byte[65536]; // 64Kb
   while (input.available() > 0)
   {
      int real = input.read(buffer);
      output.write(buffer, 0, real);
   }
}



InputStream用于从文件中
OutputStream读取 用于写入文件

将数据读入的缓冲区
只要流中有数据

将数据读入缓冲区
将缓冲区中的数据写入第二个流

2.Writer

该类Writer与类完全相同OutputStream,但只有一个区别:它使用字符 ( char) 而不是字节。

这是一个抽象类:您不能创建该类的对象Writer。它的主要目标是成为数百个后代类的公共父类,并为它们提供处理字符流的通用方法。

Writer该类(及其所有后代类)的方法:

方法 描述
void write(int b)
将一个字符(不是int)写入流。
void write(char[] buffer)
将字符数组写入流
void write(char[] buffer, off, len)
将字符数组的一部分写入流
void write(String str)
将字符串写入流
void write(String str, off, len)
将字符串的一部分写入流
void flush()
将缓冲区中存储的所有数据写入流
void close()
关闭流

这些方法与类的方法非常相似OutputStream,但它们使用字符而不是字节。

方法说明:

write(int b)方法

此方法将单个字符 ( char— 而不是int) 写入输出流。传递的值被转换为 a char,前两个字节被丢弃。

write(char[] buffer)方法

将给定的字符数组写入输出流。

write(char[] buffer, int offset, int length)方法

将传递的字符数组的一部分写入输出流。该offset变量表示数组第一个元素的索引,length是要写入的子集的长度。

write(String str)方法

将给定的字符串写入输出流。

write(String str, int offset, int length)方法

将给定字符串的一部分写入输出流:字符串被转换为字符数组。该offset变量表示数组第一个元素的索引,length是要写入的子集的长度。

flush()方法

flush()方法用于强制将当前流中可能缓冲的任何数据写入目标流。这在使用缓冲和/或排列在链中的多个流对象时是相关的。

close()方法

将任何未写入的数据写入目标对象。close()如果您使用块,则无需调用该方法try-with-resources

复制文本文件的程序示例:

代码 笔记
String src = "c:\\projects\\log.txt";
String dest = "c:\\projects\\copy.txt";

try(FileReader reader = new FileReader(src);
FileWriter writer = new FileWriter(dest))
{
   char[] buffer = new char[65536]; // 128Kb
   while (reader.ready())
   {
      int real = reader.read(buffer);
      writer.write(buffer, 0, real);
   }
}



Reader用于从文件中
Writer读取 用于写入文件

我们将读取数据的缓冲区
只要流中有数据

将数据读入缓冲区
将缓冲区中的数据写入第二个流

StringWriter班级

还有一个有趣的类继承了该类Writer:它被称为StringWriter. 它包含一个可变字符串——一个StringBuffer对象。每次您向StringWriter对象“写入”内容时,文本都会简单地添加到其内部缓冲区中。

例子:

代码 笔记
StringWriter writer = new StringWriter();
writer.write("Hello");
writer.write(String.valueOf(123));

String result = writer.toString();
一个目标字符流( StringWriter)被创建
一个字符串被写入缓冲区里面StringWriter
一个字符串被写入缓冲区里面StringWriter

一个对象的内容转换成字符串

在这种情况下,该类StringWriter本质上是该类的包装器StringBuffer,但该类StringWriter是流类的后代Writer,并且可以在流对象链中使用。这在实践中是一个非常有用的属性。