Channel通道
Channel 通道Channel原理类似于传统的流对象, FileInputStream FileOutputStream但是有两个主要的区别1.Channel能够将指定的部分或者全部文件映射到内存中全部映射MappedByteBuffer部分文件映射2.程序如果想要读取Channel中的数据,不能够直接读写,必须经过BufferJava中为Channel提供了如下常用的类Fi...
Channel 通道
Channel原理类似于传统的流对象, FileInputStream FileOutputStream
但是有两个主要的区别
1.Channel能够将指定的部分或者全部文件映射到内存中
全部映射
MappedByteBuffer
部分文件映射
2.程序如果想要读取Channel中的数据,不能够直接读写,必须经过Buffer
Java中为Channel提供了如下常用的类
FileChannel 和文件相关的通道
DatagramChannel 和UDP协议传输数据相关的通道
SocketChannel 和TCP协议相关的数据传输通道
ServerSocket 和TCP协议相关的数据传输通道
获取FileChannel对象
和文件相关的普通流有哪些?
FileInputStream FileOutputStream RandomAccessFile
常用的方法
read() : 将Channel中的数据读取到Buffer中
write() : 向Buffer中写入数据
map(): 将channel中的数据全部或者部分映射到Buffer中
inChannel.map(mode, position, size)
MappedByteBuffer mappBuffer = inChannel.map(MapMode.READ_ONLY, 0, srcFile.length());
代码演示
public class NIODemo02 {
public static void main(String[] args) {
File srcFile = new File("src\\com\\sxt\\day21\\nio\\nio-a.txt");
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream(srcFile);
fos = new FileOutputStream(new File("src\\com\\sxt\\day21\\nio\\nio-b.txt"));
FileChannel inChannel = fis.getChannel();
FileChannel outChannel = fos.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(10);
while ((inChannel.read(buffer)) != -1) {
buffer.flip(); // 为取出数据做好准备
outChannel.write(buffer);
buffer.clear();
}
// 获取MapByteBuffer对象
MappedByteBuffer mapBuffer = inChannel.map(MapMode.READ_ONLY, 0, srcFile.length());
mapBuffer.flip();
Charset charset = Charset.forName("GBK");
outChannel.write(mapBuffer);
mapBuffer.clear();
CharsetDecoder decoder = charset.newDecoder();
CharBuffer charBuffer = decoder.decode(mapBuffer);
System.out.println(charBuffer);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)