IO包中有许多不同的类,有些似乎只有微妙的区别。如果要将一些字符串写入文本文件,然后读取它们以备后用。您将为这两个目的使用哪种类,为什么?
这完全取决于您要做什么。
输出流
如果要写入字节数据,则可以使用其中的一些子类,OutputStream该子类用于在具体子类定义的目标中写入字节。
例如FileOutputStream,用于按字节(或一堆字节)在文件中写入数据。
BufferedOutputStream是FileOutputStream写字节块的优化扩展,以最大程度地减少磁盘操作次数。因此,当您调用write时,实际上它可能会或可能不会写入文件-取决于缓冲区的状态是否已满。如果缓冲区达到最大容量,则所有字节立即刷新到文件。
ByteArrayOutputStream仅使用内存块作为目标而不是文件。当前流的内容是通过toByteArray()方法获得的(为什么您需要这样的流将在后面说明)。
ObjectOutputStream用于在底层定义的某个目标中写入对象(类实例)OutputStream。例如,ObjectOutputStream(FileOutputStream)将对象写入文件,而ObjectOutputStream(ByteArrayOutputStream)将对象写入内存。最后一个选项允许您序列化字节缓冲区(字节数组)中的对象,然后可以通过网络将其发送到某个地方。
请注意,您要通过某处写入的任何对象ObjectOutputStream都必须实现Serializable接口。由于对象可能包含对另一个对象的引用,因此要序列化的对象可以访问的所有对象也必须实现Serializable接口作为序列化,默认情况下,这是写入对象全图的过程-假设您未使用transient关键字排除序列化的“类”字段,或者您没有在对象的类中定义writeObject/readObject覆盖默认序列化行为的特殊方法。这些方法旨在实现自定义序列化,即,您可以自己定义如何在/ from中写入/读取类字段 ObjectOutputStream/ObjectInputStream。假设阶级A您要为其实现自定义序列化的对象包含类B。相反书面方式对象b作为一个完整的图形,即而不是调用oos.writeObject(b),这里oos是一个争论writeObject类被实现的方法A,你会在信息流中只类的某些领域写B例如oos.writeBoolean(b.isEnabled),oos.writeInt(b.value)。只要b不通过编写对象oos.writeObject(b),就不必实现Serializable接口。有关更多详细信息,请参见Serializable文档。
DataOutputStream用于编写布尔型,char型,int型,long型,float型,double型等原语。由于任何对象都可以分解为基元,例如class A { int i = 0; B b = new B();},class B {double d = 0.0;}可以简单地编写为int a, double d,因此您可以使用DataOutputStream压缩方式对对象进行序列化,而序列化可以写入更多数据,例如类路径,类版本等,因此ClassLoader可以在运行时标识给定的类,实例化此类,最后将数据加载到此空对象。请注意,以这种方式实例化类的名称+初始化对象要比自己实例化类和自己通过“原始”实例化字段慢得多。DataOutputStream(这就是Android OS偏爱自定义Parcelable界面而不是标准序列化的原因,后者起着向/从中的作用DataOutputStream/DataInputStream)。
如果要写入字符串数据,则可以使用OutputStreamWriter更高级别的输出流,该输出流将在定义的目标位置写入字符/字符串OutputStream(如果在文件中写入,则可以通过FileOutputStream;如果在存储器中写入,则可以通过ByteArrayOutputStream) 。
FileWriter是OutputStreamWriter为写入文件而设计的扩展。
BufferedWriterBufferedOutputStream除了用于字符串和字符外,其他功能与之相同。
CharArrayWriterByteArrayOutputStream除了存储char[]通过调用获得的字符外,其工作方式与相同getCharArray()。
StringWriter与相似,CharArrayWriter不同之处在于它允许您编写StringBuffer通过调用获得的 存储字符串getBuffer()。
PrintWriter允许您在由定义的指定目标位置写入格式化的字符串OutputStream(此编写程序旨在方便记录)。
输入流
相同的概念适用于与上述给定输出流(写入器)关联的输入流(读取器)。
| 归档时间: |
|
| 查看次数: |
519 次 |
| 最近记录: |