转自:http://blog.csdn.net/java2000_wl/article/details/7625021
*MappedByteBuffer的创建
在FileChannel上调用map方法 返回一个MappedByteBuffer对象
- public MappedByteBuffer map(MapMode mode, long position, long size)
MapMode 映射模式(MapMode 是FileChannel中的一个内部类) 有三个可选值
1.READ_ONLY 只读映射模式
2.READ_WRITE 读/写映射模式
3.PRIVATE 通过put方法对MappedByteBuffer的修改 不会修改到磁盘文件 只是虚拟内存的修改
*MappedByteBuffer在父类ByteBuffer的基础上 新增的几个方法
1.fore缓冲区在READ_WRITE模式下,此方法对缓冲区所做的内容更改强制写入文件
2.load:将缓冲区的内容载入物理内存,并返回该缓冲区的引用
3.isLoaded:判断缓冲区的内容是否在物理内存,如果在则返回true,否则返回false
- private final static Charset charset = Charset.forName("GBK");
- /**
- * 读文件
- * <br>------------------------------<br>
- * @param path
- * @return
- * @throws IOException
- */
- private static String read(String path) throws IOException {
- if (path == null || path.length() == 0) return null;
- FileInputStream fileInputStream = new FileInputStream(path);
- FileChannel fileChannel = fileInputStream.getChannel();
- MappedByteBuffer mappedByteBuffer = fileChannel.map(MapMode.READ_ONLY, 0, fileChannel.size());
- fileInputStream.close();
- fileChannel.close();
- String str = charset.decode(mappedByteBuffer).toString();
- mappedByteBuffer = null;
- return str;
- }
- /**
- * 追加内容
- * <br>------------------------------<br>
- * @param path
- * @param str
- * @return
- * @throws IOException
- */
- private static MappedByteBuffer append(String path, String str) throws IOException {
- if (str == null || str.length() == 0) return null;
- RandomAccessFile randomAccessFile = new RandomAccessFile(path, "rw");
- FileChannel fileChannel = randomAccessFile.getChannel();
- byte[] bytes = str.getBytes();
- long size = fileChannel.size() + bytes.length;
- MappedByteBuffer mappedByteBuffer = fileChannel.map(MapMode.READ_WRITE, 0, size);
- fileChannel.close();
- randomAccessFile.close();
- int position = mappedByteBuffer.limit() - bytes.length;
- mappedByteBuffer.position(position);
- mappedByteBuffer.put(bytes);
- mappedByteBuffer.force();
- mappedByteBuffer.flip();
- return mappedByteBuffer;
- }
- /**
- * 文件复制
- * <br>------------------------------<br>
- * @param srcfilePath
- * @param targetPath
- * @throws IOException
- */
- private static void copy(String srcfilePath, String targetPath) throws IOException {
- File file = new File(targetPath);
- if (!file.getParentFile().exists()) {
- file.mkdirs();
- }
- RandomAccessFile inRandomAccessFile = new RandomAccessFile(srcfilePath, "r");
- FileChannel inFileChannel = inRandomAccessFile.getChannel();
- MappedByteBuffer inMappedByteBuffer = inFileChannel.map(MapMode.READ_ONLY, 0, inFileChannel.size());
- inRandomAccessFile.close();
- inFileChannel.close();
- RandomAccessFile outRandomAccessFile = new RandomAccessFile(targetPath, "rw");
- FileChannel outFileChannel = outRandomAccessFile.getChannel();
- MappedByteBuffer outMappedByteBuffer = outFileChannel.map(MapMode.READ_WRITE, 0, inMappedByteBuffer.capacity());
- outMappedByteBuffer.put(inMappedByteBuffer);
- outMappedByteBuffer.force();
- outRandomAccessFile.close();
- outFileChannel.close();
- outMappedByteBuffer.flip();
- }
- /**
- * 不会更新到文件 只会更新虚拟内存
- * <br>------------------------------<br>
- * @param path
- * @param str
- * @return
- * @throws IOException
- */
- private static MappedByteBuffer doTestPrivateMode(String path, String str) throws IOException {
- if (str == null || str.length() == 0) return null;
- RandomAccessFile randomAccessFile = new RandomAccessFile(path, "rw");
- FileChannel fileChannel = randomAccessFile.getChannel();
- byte[] bytes = str.getBytes();
- long size = fileChannel.size() + bytes.length;
- MappedByteBuffer mappedByteBuffer = fileChannel.map(MapMode.PRIVATE, 0, size);
- mappedByteBuffer.put(bytes);
- fileChannel.close();
- randomAccessFile.close();
- mappedByteBuffer.flip();
- System.out.println(charset.decode(mappedByteBuffer));
- return mappedByteBuffer;
- }
相关推荐
除了以上提到的 Buffer 类型之外,Java NIO 还提供了一个特殊的 Buffer 类型——`MappedByteBuffer`,用于表示内存映射文件。这种方式能够提高文件的读写效率,但由于其实现较为复杂,本概述中不做详细介绍。 #### ...
Java NIO(New IO,也称为Non-Blocking IO)是一种基于通道(Channel)和缓冲区(Buffer)的I/O操作方法,用于替代标准Java IO API。Java NIO提供了与标准IO不同的I/O工作方式,它是面向缓冲区、基于通道的I/O操作,...
《深入浅出MappedByteBuffer》这篇文章主要探讨了Java NIO中MappedByteBuffer这一高效处理大文件的机制,以及与其相关的计算机内存管理概念。首先,我们来详细理解一下这些知识点。 内存管理是计算机系统的重要组成...
- **内存映射文件**: 对于大数据处理,可以利用MappedByteBuffer将文件映射到内存,减少磁盘I/O。 - **网络通信优化**: 在网络编程中,通过NIO的非阻塞模式,可以更有效地处理网络数据的读写。 ### 5. 示例代码...
- `MappedByteBuffer inputBuffer = channel.map(FileChannel.MapMode.READ_ONLY, f.length()*begin_fz/begin_fm, f.length()*end_fz/end_fm);`将文件的一部分映射到内存中。 3. **数据读取** - 创建一个固定大小...
通过MappedByteBuffer类,可以直接在内存中对文件进行操作,提高大文件处理的性能。 7. **管道(Pipes)**: 管道用于在两个线程间创建单向数据通道,它们并不直接与任何外部资源关联,而是线程间的通信工具。 总...
在Java中,可以通过`java.nio.MappedByteBuffer`类来实现共享内存功能,这被称为内存映射文件(Memory-Mapped File,MMF)。 `MappedByteBuffer`是NIO中的一种特殊缓冲区,它将文件的一部分映射到内存中,使得文件...
### JAVA IO-NIO 详解 #### 一、IO与NIO概述 在Java开发中,输入/输出(IO)操作是程序与外部环境交互的重要环节。通过IO操作,程序可以读取外部数据或向外部环境输出数据。Java的IO体系自Java 1.0以来就一直存在...
- 减少数据复制:利用DirectByteBuffer或MappedByteBuffer减少不必要的数据复制。 - 降低上下文切换:合理利用线程池减少上下文切换。 - 优化内存管理:合理使用缓存和对象池减少垃圾回收压力。 - 利用高级IO...
总的来说,上述代码提供了一个自定义的NIO解决方案来按行读取文件,尽管Java NIO本身并不直接支持这个功能。这种实现方式充分利用了NIO的内存映射特性,提高了读取效率,但同时也需要开发者关注潜在的兼容性和资源...
通过MappedByteBuffer,可以直接将文件映射到内存,提高文件读写的效率。 6. **网络I/O**:NIO为TCP和UDP提供了SocketChannel和DatagramChannel,用于处理网络连接。SocketChannel用于TCP连接,而DatagramChannel则...
- **Memory-Mapped Files**:使用 `MappedByteBuffer` 对象来实现对内存映射文件的访问。 - **Scatter/Gather**:允许数据从多个缓冲区写入通道,或从通道读取数据到多个缓冲区中。 - **FileLocks**:用于文件锁定的...
2. 文件操作:讲解如何使用NIO进行文件的读写操作,包括文件通道和MappedByteBuffer的使用。 3. 非阻塞I/O:对比NIO和BIO,解释非阻塞I/O的优势,并展示如何在实际项目中应用。 4. 多路复用:详述选择器的工作原理,...
5. **内存映射文件(MappedByteBuffer)**:这是NIO的一个高级特性,允许将文件直接映射到内存,使得文件操作更高效。通过FileChannel的map方法,我们可以创建MappedByteBuffer对象,然后直接对它进行读写操作。 6....
- Java NIO提供了一组文件系统操作API,例如FileChannel用于读写文件,MappedByteBuffer实现了内存映射文件,可以直接通过内存访问文件内容,提高了读写速度。 4. **缓冲区的分类** - **ByteBuffer**:用于处理...
使用MappedByteBuffer,NIO可以将文件映射到内存,使得文件操作如同操作内存一样快速,特别适合大数据处理。 在实际应用中,Java NIO通常用于高性能的服务器编程,例如在开发聊天服务器、Web服务器或游戏服务器时...
最后,`Java_NIO.ppt`很可能是整个NIO主题的综合教程,覆盖了从基础到进阶的所有内容,包括基本的读写操作、多路复用、内存映射文件(MappedByteBuffer)以及NIO在Socket通信中的应用等。 总的来说,这些PPT课件构成...
5. **文件系统操作**:NIO提供了FileChannel,支持文件的高效读写,如映射内存到文件(MappedByteBuffer),以及文件的随机访问。 6. **网络通信**:NIO为网络通信提供了SocketChannel和ServerSocketChannel,它们...
5. **文件系统接口**:Java NIO提供了更强大的文件系统访问功能,例如文件通道(FileChannel)、映射文件(MappedByteBuffer)等,可以直接映射文件到内存,提高文件操作速度。 在实际开发中,Apache NIO常用于...
5. **文件系统操作**:NIO提供FileChannel,可以高效地进行文件读写操作,包括映射文件到内存(MappedByteBuffer)。 6. **管道(Pipes)**:管道是两个线程之间进行单向数据传输的通道,用于线程间通信。 7. **...