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();
		}
	}
}
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐