1.OutputStream
类
我们最近刚刚探索了输入流。是时候讨论输出流了。
该类OutputStream
是所有支持字节输出的类的父类。这是一个抽象类,它自己什么都不做,但它有适用于各种场合的子类。
听起来极其复杂。更简单地说,此类对字节进行操作,而不是对字符或其他数据类型进行操作。而且它是抽象的这一事实意味着我们通常不使用它,而是使用它的后代类之一。比如,FileOutputStream
之类的。
但是回到OutputStream
课堂上。此类具有其所有后代类都必须实现的方法。以下是主要的:
方法 | 描述 |
---|---|
|
将一个字节(不是int )写入流。 |
|
将字节数组写入流 |
|
将字节数组的一部分写入流 |
|
将缓冲区中存储的所有数据写入流 |
|
关闭流 |
当您创建一个继承类的对象时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
。
复制文件的例子
代码 | 笔记 |
---|---|
|
InputStream 用于从文件中OutputStream 读取 用于写入文件将数据读入的缓冲区 只要流中有数据 将数据读入缓冲区 将缓冲区中的数据写入第二个流 |
2.Writer
类
该类Writer
与类完全相同OutputStream
,但只有一个区别:它使用字符 ( char
) 而不是字节。
这是一个抽象类:您不能创建该类的对象Writer
。它的主要目标是成为数百个后代类的公共父类,并为它们提供处理字符流的通用方法。
Writer
该类(及其所有后代类)的方法:
方法 | 描述 |
---|---|
|
将一个字符(不是int )写入流。 |
|
将字符数组写入流 |
|
将字符数组的一部分写入流 |
|
将字符串写入流 |
|
将字符串的一部分写入流 |
|
将缓冲区中存储的所有数据写入流 |
|
关闭流 |
这些方法与类的方法非常相似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
。
复制文本文件的程序示例:
代码 | 笔记 |
---|---|
|
Reader 用于从文件中Writer 读取 用于写入文件我们将读取数据的缓冲区 只要流中有数据 将数据读入缓冲区 将缓冲区中的数据写入第二个流 |
StringWriter
班级
还有一个有趣的类继承了该类Writer
:它被称为StringWriter
. 它包含一个可变字符串——一个StringBuffer
对象。每次您向StringWriter
对象“写入”内容时,文本都会简单地添加到其内部缓冲区中。
例子:
代码 | 笔记 |
---|---|
|
一个目标字符流( StringWriter )被创建一个字符串被写入缓冲区里面 StringWriter 一个字符串被写入缓冲区里面 StringWriter 一个对象的内容转换成字符串 |
在这种情况下,该类StringWriter
本质上是该类的包装器StringBuffer
,但该类StringWriter
是流类的后代Writer
,并且可以在流对象链中使用。这在实践中是一个非常有用的属性。
3.PrintStream
类
输出流类也可以放入带有中间流的链中,中间流将数据写入传递给它们的目标流。这些流交互的一般视图如下所示:
所有中间输出流中最有趣和通用的是PrintStream
. 它有几十个方法和多达12个构造函数。
类PrintStream
继承类FilterOutputStream
,类继承OutputStream
。这意味着该类除了拥有自己的方法外,还PrintStream
拥有父类的所有方法。以下是最有趣的:
方法 | 描述 |
---|---|
|
将传递的对象转换为字符串并将其输出到目标流。 |
|
将传递的对象转换为字符串并将其输出到目标流。在末尾添加一个换行符 |
|
向目标流输出一个换行符 |
|
根据格式字符串和传递的参数构造并输出一个字符串;类似于String.format() 方法 |
你问这几十种方法在哪里?
好吧,它有许多具有不同参数的print()
和方法的变体。println()
它们可以总结在此表中。
我们不会深入研究这些方法,因为您已经很了解它们。你能猜出我在说什么吗?
还记得吗System.out.println()
?但是可以写成两行:
代码 | 控制台输出 |
---|---|
|
|
我们最喜欢的命令是调用类的静态变量上的方法。这个变量的类型是.System.out.println()
println()
out
System
PrintStream
PrintStream
在许多 CodeGym 关卡中,几乎在每个任务中,您都在不知不觉中调用了类的方法!
实际使用
Java 有一个有趣的类ByteArrayOutputStream
,它是一个动态增长的字节数组,它继承了OutputStream
.
一个ByteArrayOutputStream
对象和PrintStream
一个对象可以这样链接:
代码 | 描述 |
---|---|
|
在内存中创建一个写入缓冲区 将缓冲区包装在一个 PrintStream 对象中将数据写入控制台 将数组转换为字符串! 控制台输出:
|
GO TO FULL VERSION