nio

nio学习笔记(二)

Posted by alonealice on 2018-02-02

RandomAccessFile

RandomAccessFile允许你来回读写文件,也可以替换文件中的某些部分。

读写文件
1
2
3
4
5
6
7
8
9
//打开文件
RandomAccessFile file = new RandomAccessFile(filePath, "rw");
//读取文件
int aByte = file.read();

//写入文件
file.write(testBytes);
//关闭
file.close();
来回读写

在RandomAccessFile的某个位置读写之前,必须把文件指针指向该位置。通过seek()方法可以达到这一目标。可以通过调用getFilePointer()获得当前文件指针的位置

1
2
3
4
RandomAccessFile file = new RandomAccessFile(filePath, "rw");
file.seek(200);
long pointer = file.getFilePointer();
file.close();

分散和聚集

分散(scatter)是指从通道中读取的数据写入到多个buffer中;聚集是指将多个buffer中的数据写入同一个通道中。

1
2
3
4
5
6
ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body = ByteBuffer.allocate(1024);
ByteBuffer[] bufferArray = { header, body };
channel.read(bufferArray);
//
channel.write(bufferArray);

从channel中读取数据时,会按顺序先写满一个buffer后,在写到后面的buffer中,因此这种情况不适合数据长度不定的情况。写数据时,也会按buffer顺序依次把数据写入到channel中。

通道数据传输

两个通道中有一个是FileChannel,就可以直接将数据从一个通道传输到另外一个通道。

Channel的transferFrom()方法可以将数据从源通道传输到FileChannel中

1
2
3
4
5
6
7
RandomAccessFile fromFile = new RandomAccessFile(fileFrom, "rw");
FileChannel fromChannel = fromFile.getChannel();
RandomAccessFile toFile = new RandomAccessFile(fileTo, "rw");
FileChannel toChannel = toFile.getChannel();
long position = 0;
long count = fromChannel.size();
toChannel.transferFrom(position, count, fromChannel);

如果fromchannel是socketchannels时,传输时只会将已经有的数据进行传输。

transferTo()方法将数据从FileChannel传输到其他的channel中。

1
2
...
fromChannel.transferTo(position, count, toChannel);