Friday, August 14, 2015

Java I/O system 8.14



1.ByteBuffer通过一个被“包装”过的8字节数组产生,然后通过各种不同的基本类型的视图缓冲器显示了出来。当从不同类型的缓冲器读取时,数据显示的方式也不同。

ByteBuffer bb = ByteBuffer.wrap(new byte[]{0,0,0,0,0,0,0,'a'});
bb.rewind();
printnb("Byte Buffer");
while (bb.hasRemaining()) {
    printnb(bb.position()+" -> "+bb.get()+". ");
}

CharBuffer cb = ((ByteBuffer)bb.rewind()).asCharBuffer();
printnb("Char Buffer");
while (cb.hasRemaining()) {
    printnb(cb.position()+" -> "+cb.get()+", ");
}

IntBuffer ib = ((ByteBuffer)bb.rewind()).asIntBuffer();
printnb("Int Buffer");
while (ib.hasRemaining()) {
    printnb(ib.position()+" -> "+ib.get()+", ");
}

下图是将同一字节序列翻译成shortintfloatlongdouble


2.字符存放次序
不同的机器可能会使用不同的字节排序方法来存储数据。“big endian(高位优先)将最重要的字节存放在地址最低的存储器单元。而“little endian”(低位优先)则是将最重要的字节放在地址最高的存储器单元。当存储量大于一个字节时,像intfloat等,就要考虑字节的顺序问题了。

3.用缓冲器操纵数据:
如果想把一个字节数组写到文件中去,那么就应该使用ByteBuffer.wrap()方法把字节数组包装起来,然后用getChannel()方法在FileOutputStream上打开一个通道,接着将来自于ByteBuffer的数据写到FileChannel中。
ByteBuffer是将数据移进移出通道的唯一方式

     4.       内存映射文件
内存映射文件允许我们创建和修改那些因为太大而不能放入内存的文件。有了内存映射文件,我们就可以嘉定整个文件都放在内存中,而且可以完全把它当做非常大的数组来访问。这种方法极大地简化了用于修改文件的代码。
用这种方式,很大的文件(可达2GB)也可以很容易地修改。注意底层操作系统的文件映射工具是用来最大化地提高性能。

No comments:

Post a Comment