Java-NIO(五):通道(Channel)的数据传输与内存映射文件
- 通道(Channel)的数据传输(采用非直接缓冲区)
1 @Test 2 public void testChannel() throws IOException { 3 FileInputStream fileInputStream = new FileInputStream("Java NIO.pdf"); 4 FileOutputStream fileOutputStream = new FileOutputStream("2.pdf"); 5 6 // 1、获取通道 7 FileChannel inChannel = fileInputStream.getChannel(); 8 FileChannel outChannel = fileOutputStream.getChannel(); 9 10 // 2.分配指定大小的缓冲区 11 ByteBuffer byteBuffer = ByteBuffer.allocate(1024); 12 13 // 3、将通道的数据读入缓冲区 14 while (inChannel.read(byteBuffer) != -1) { 15 byteBuffer.flip();// 切换缓冲区为读模式 16 // 4、把缓冲区的数据写入通道 17 outChannel.write(byteBuffer); 18 byteBuffer.clear();// 因为需要循环多次读,需要清空缓冲区。 19 } 20 21 byteBuffer.clear(); 22 inChannel.close(); 23 outChannel.close(); 24 fileInputStream.close(); 25 fileOutputStream.close(); 26 }
- 内存映射文件(采用直接缓冲区)
1 /** 2 * 内存映射文件 3 * 4 * @throws IOException 5 */ 6 @Test 7 public void testMemoryMappingFile() throws IOException { 8 long start = System.currentTimeMillis(); 9 10 FileChannel inChannel = FileChannel.open(Paths.get("D:\\nio.zip"), StandardOpenOption.READ); 11 // 注意:StandardOpenOption.CREATE 12 // 如果文件已经存在,直接覆盖,StandardOpenOption.CREATE_NEW,如果文件已经存在,就抛出异常。 13 FileChannel outChannel = FileChannel.open(Paths.get("E:\\nio.zip"), StandardOpenOption.READ, 14 StandardOpenOption.WRITE, StandardOpenOption.CREATE); 15 16 // 获取内存映射文件 17 MappedByteBuffer inMappedByteBuffer = inChannel.map(MapMode.READ_ONLY, 0, inChannel.size()); 18 MappedByteBuffer outMappedByteBuffer = outChannel.map(MapMode.READ_WRITE, 0, inChannel.size()); 19 20 // 直接对数据进行读写 21 byte[] bytes = new byte[inMappedByteBuffer.limit()];
// 此时,如果数据读超出了一定返回会抛出异常。如果内存不足时,会抛出java.lang.OutOfMemoryError: Java heap space 22 inMappedByteBuffer.get(bytes); 23 outMappedByteBuffer.put(bytes); 24 25 inChannel.close(); 26 outChannel.close(); 27 long end = System.currentTimeMillis(); 28 29 System.out.println((end - start)); 30 }
- transferTo&transferFrom将数据从源通道传输到其他 Channel 中(采用直接缓存区)
1 public void testTransfer() throws IOException { 2 FileChannel inChannel = FileChannel.open(Paths.get("D:\\nio.zip"), StandardOpenOption.READ); 3 // 注意:StandardOpenOption.CREATE 4 // 如果文件已经存在,直接覆盖,StandardOpenOption.CREATE_NEW,如果文件已经存在,就抛出异常。 5 FileChannel outChannel = FileChannel.open(Paths.get("E:\\nio.zip"), StandardOpenOption.READ, 6 StandardOpenOption.WRITE, StandardOpenOption.CREATE); 7 8 //inChannel.transferTo(0, inChannel.size(), outChannel); 9 outChannel.transferFrom(inChannel, 0, inChannel.size()); 10 }
基础才是编程人员应该深入研究的问题,比如:
1)List/Set/Map内部组成原理|区别
2)mysql索引存储结构&如何调优/b-tree特点、计算复杂度及影响复杂度的因素。。。
3)JVM运行组成与原理及调优
4)Java类加载器运行原理
5)Java中GC过程原理|使用的回收算法原理
6)Redis中hash一致性实现及与hash其他区别
7)Java多线程、线程池开发、管理Lock与Synchroined区别
8)Spring IOC/AOP 原理;加载过程的。。。
【+加关注】。