java NIO FileChannel
所属分类 nio
浏览量 973
public interface Channel extends Closeable {
public boolean isOpen();
public void close() throws IOException;
}
public abstract class FileChannel extends AbstractInterruptibleChannel
implements SeekableByteChannel, GatheringByteChannel, ScatteringByteChannel
public abstract class SelectableChannel extends AbstractInterruptibleChannel implements Channel
public abstract class AbstractSelectableChannel extends SelectableChannel
public abstract class SocketChannel extends AbstractSelectableChannel
public abstract class ServerSocketChannel extends AbstractSelectableChannel
FileChannel
FileChannel 无法设置为非阻塞模式
只有 SelectableChannel 才能 设置为非阻塞模式 与 Selector配合使用
FileChannel 的创建
java.io.FileOutputStream.getChannel()
java.io.FileInputStream.getChannel()
java.nio.channels.FileChannel.open(Path, OpenOption...)
文件复制的两种实现方式
使用 FileChannel read write
使用 FileChannel transferTo
注意写入文件的参数
StandardOpenOption.CREATE
StandardOpenOption.WRITE
// copy file use transferTo
String src = file;
String dest = home + "/FileChannelTest2.txt" ;
FileChannel srcFileChannel = FileChannel.open(Paths.get(src));
// StandardOpenOption CREATE
// CREATE Create a new file if it does not exist
// CREATE_NEW Create a new file, failing if the file already exists
WritableByteChannel destFileChannel = Files.newByteChannel(Paths.get(dest),StandardOpenOption.CREATE,StandardOpenOption.WRITE);
// java.nio.file.NoSuchFileException
srcFileChannel.transferTo(0, srcFileChannel.size(), destFileChannel);
srcFileChannel.close();
destFileChannel.close();
System.out.println("copy file use transferTo done");
// copy file
dest = home + "/FileChannelTest3.txt" ;
srcFileChannel = FileChannel.open(Paths.get(src));
FileChannel destFileChannel2 = FileChannel.open(Paths.get(dest),StandardOpenOption.CREATE,StandardOpenOption.WRITE);
ByteBuffer buffer = ByteBuffer.allocate(8);
while (srcFileChannel.read(buffer) > 0) {
// 写模式切换到读模式
buffer.flip();
while (buffer.hasRemaining()) {
destFileChannel2.write(buffer);
}
buffer.clear();
}
srcFileChannel.close();
destFileChannel2.close();
System.out.println("copy file use channel read and write done");
完整代码
https://gitee.com/dyyx/hellocode/blob/master/src/nio/FileChannelTest.java
上一篇
下一篇
Java NIO写事件处理技巧
java NIO buffer
Java NIO pipe
Java NIO Scatter Gather
java NIO SocketChannel
Java NIO 内存映射文件