java.io
类 RandomAccessFile可以实现分段数据写入(迅雷)
public class RandomAccessFile extends Object
implements DataOutput, DataInput, Closeable
该类不算是IO体系中的子类,而是直接继承自Object.但是他是IO包中的成员,因为他具备读和写功能.内部封装了一个数组,而且通过指针对数组的元素进行操作,可以通过getFilePointer获取指针的位置,同时可以通过seek改变指针的位置,具体概括如下:
此类的实例支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针;输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。如果随机访问文件以读取/写入模式创建,则输出操作也可用;输出操作从文件指针开始写入字节,并随着对字节的写入而前移此文件指针。写入隐含数组的当前末尾之后的输出操作导致该数组扩展。该文件指针可以通过 getFilePointer 方法读取,并通过 seek 方法设置。
通常,如果此类中的所有读取例程在读取所需数量的字节之前已到达文件末尾,则抛出 EOFException(是一种 IOException)。如果由于某些原因无法读取任何字节,而不是在读取所需数量的字节之前已到达文件末尾,则抛出 IOException,而不是 EOFException。需要特别指出的是,如果流已被关闭,则可能抛出 IOException。
(其实完成读写的原理就是内部封装了字节输入输出流[操作数据必然是流])
通过构造函数可以看出,他有局限性,只能操作文件.而且操作文件还有模式:
模式为只读r时, 操作文件不存在,不会创建.
模式为rw时,操作文件不存在,会自动创建,如果存在,不会覆盖.wiret写.
通过,以下方法改变指针的位置,实现指定位置数据写入.
其实下载软件,的原理就是分段下载数据.该方法就可以通过指针实现.
可以操作基本数据类型的数据流对象
DataOutputStream(OutputStream out)
创建一个新的数据输出流,将数据写入指定基础输出流。
DataInputStream(InputStream in)
使用指定的底层 InputStream 创建一个 DataInputStream。
基本读写实例:
特殊方法:
void | writeUTF(String str) |
指定编码表写入,读出时也要用相对应的编码表读取…………………………..
static String | readUTF(DataInput in) |
都是以内存为源为目的的操作
以操作数组为例简单说一下(其他同理)
直接操作字节数组的流对象(流的思想操作数组)
类 ByteArrayInputStream
public class ByteArrayInputStream
extends InputStream
在构造的时候,需要接收数据源,而却数据源是一个字节数组.
ByteArrayInputStream 包含一个内部缓冲区,该缓冲区包含从流中读取的字节。内部计数器跟踪 read 方法要提供的下一个字节。
关闭 ByteArrayInputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException。
java.io
类 ByteArrayOutputStream
public class ByteArrayOutputStream
extends OutputStream
在构造的时候,不用定义数据目的,因为,改对像中已经内部封装了可变长度的字节数组,这就是数据目的地.
此类实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray() 和 toString() 获取数据。
关闭 ByteArrayOutputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException。
因为这两个流对象都操作的是数组,并没有使用系统资源.所以,不用进行close关闭.
下面是一个特有的方法.可以一次性将内存中的数组写到文件中…
void | writeTo(OutputStream out) |
因为,该方法设计到输出流操作底层资源,所以,就她设计到了异常……