`

通过nio的Channel-Buffer来读写文件

    博客分类:
  • java
nio 
阅读更多

 

// 通过nio的Channel来读写文件
public class NioFileReadWrite {

 public static void main(String[] args) {
  String file = "d:\\n4.txt";
  String file2 = "d:\\ncc.txt";
  
  // 1.通过Channel-Buffer进行文件读写
//  new Thread(new ReadFileThread(file, file2)).start();
  
  // 2.内存映射文件读取: 速度快                   MappedByteBuffer
  new Thread(new MapFileReadThread(file)).start();
 }

 static class ReadFileThread implements Runnable{
  private String file;
  private String file2;
  
  public ReadFileThread(String file, String file2){
   this.file = file;
   this.file2 = file2;
  }
  
  public void run(){
   try{
    int num = 1024;
    int k =0;
    FileInputStream fis = new FileInputStream(file); 
    FileOutputStream fos = new FileOutputStream(file2);
     
          // 1.从FileInputStream对象获取文件通道FileChannel 
          FileChannel channel = fis.getChannel(); 
          FileChannel channel2 = fos.getChannel();
         
          long size = channel.size(); 
   
          // 2.从通道读取文件内容 
          byte[] bytes = new byte[num]; 
          ByteBuffer byteBuffer = ByteBuffer.allocate(num); 
   
          // 每次read都将读取 allocate 个字节到ByteBuffer 
          int len = -1; 
          while ((len = channel.read(byteBuffer)) != -1) { 
              // 注意先调用flip方法反转Buffer,再从Buffer读取数据 
              byteBuffer.flip(); 
               
              // 有几种方式可以操作ByteBuffer 
              // 1.可以将当前Buffer包含的字节数组全部读取出来 
              //bytes = byteBuffer.array(); 
              // System.out.print(new String(bytes)); 
               
              // 2.类似与InputStrean的read(byte[],offset,len)方法读取  
//              byteBuffer.get(bytes, 0, len); 
//              System.out.print(new String(bytes, 0 ,len)); 

              channel2.write(byteBuffer);
              // 最后注意调用clear方法,将Buffer的位置回归到0 
              byteBuffer.clear(); 
              k++;
          } 
         
          System.out.println("k="+k);
          // 关闭通道和文件流 
          channel.close(); 
          fis.close(); 
          channel2.close();
          fos.close();
   }catch(Exception e){
    e.printStackTrace();
   }
  }
 }
 
 static class MapFileReadThread implements Runnable{
  private String file;
  public MapFileReadThread(String file){
   this.file = file;
  }

  public void run() {
   try{
    int num = 1024;
    RandomAccessFile fis = new RandomAccessFile(new File(file), "rw"); 
          FileChannel channel = fis.getChannel(); 
          long size = channel.size(); 
           
          // 构建一个只读的MappedByteBuffer 
          MappedByteBuffer mappedByteBuffer = channel.map(MapMode.READ_ONLY, 0, size); 
           
          // 如果文件不大,可以选择一次性读取到数组 
          // byte[] all = new byte[(int)size]; 
          // mappedByteBuffer.get(all, 0, (int)size); 
           
          // 如果文件内容很大,可以循环读取,计算应该读取多少次 
          byte[] bytes = new byte[num]; 
          long cycle = size / num; 
          int mode = (int)(size % num); 
          for (int i = 0; i < cycle; i++) { 
              // 每次读取allocate个字节 
              mappedByteBuffer.get(bytes); 
               
              // 打印文件内容,关闭打印速度会很快 
               System.out.print(new String(bytes)); 
          } 
          if(mode > 0) { 
              bytes = new byte[mode]; 
              mappedByteBuffer.get(bytes); 
              System.out.print(new String(bytes));
          } 
   
          // 关闭通道和文件流 
          channel.close(); 
          fis.close();
   }catch(Exception e){
    e.printStackTrace();
   }
  }
  
 }
}

分享到:
评论

相关推荐

    java网络编程NIO视频教程

    - **主要内容**:演示如何分配Buffer以及如何通过Buffer进行数据的读写操作。 - **学习目标**:熟练使用Buffer进行数据交换。 #### 16. Java NIO-Buffer-几个方法 - **主要内容**:讲解Buffer的一些常用方法,如...

    NIO详细介绍channle,buffer,Selector

    NIO通过引入Channel、Buffer以及Selector等核心组件,极大地提高了数据读写的效率。 #### 二、Channel简介 **Channel**是NIO中的一个核心概念,它是一种双向的数据传输通道,可以实现数据的读取或写入。在NIO中,...

    动态演示nio中的buffer相关操作.zip

    这个压缩包“动态演示nio中的buffer相关操作.zip”显然是为了帮助用户直观地理解NIO Buffer的工作机制,通过动态演示来展示Buffer如何存储、读取和传输数据。 在Java NIO中,Buffer是一个特定类型的数组,用于临时...

    NIO学习-Java源代码分享(含netty)

    NIO的核心组件包括Channel、Buffer和Selector,它们共同构建了一个非阻塞的I/O模型。 1. **Channel**:在NIO中,数据通过Channel进行传输。Channel类似于传统I/O中的流,但它可以同时读写,并且是双向的。常见的...

    httpcore-nio-4.3.jar包

    NIO的核心概念包括通道(Channel)、缓冲区(Buffer)和选择器(Selector)。通道可以读写数据,缓冲区用于临时存储数据,选择器则用于监听多个通道的事件,实现了多路复用,从而实现非阻塞I/O。 3. **HttpCore NIO...

    java nio 包读取超大数据文件

    - **FileChannel**:用于与文件进行交互的Channel,提供了读写操作的支持。 #### 三、使用Java NIO读取超大数据文件 在Java NIO中,处理超大数据文件的关键在于合理利用内存映射文件(Memory-Mapped Files)来提高...

    Java-NIO-系列教程

    除了以上提到的 Buffer 类型之外,Java NIO 还提供了一个特殊的 Buffer 类型——`MappedByteBuffer`,用于表示内存映射文件。这种方式能够提高文件的读写效率,但由于其实现较为复杂,本概述中不做详细介绍。 #### ...

    android-socket-nio-master.zip

    在Socket通信中,NIO主要通过Selector和Channel两个核心组件来实现。Selector负责监听多个Channel的读写事件,而Channel则代表了与操作系统进行I/O操作的通道。当数据准备好时,Selector会返回一个包含就绪通道的...

    JAVA-NIO-DEMO

    - **Channel读写**:演示如何使用FileChannel读取和写入文件,以及如何通过SocketChannel进行网络通信。 - **Buffer操作**:展示如何创建、填充、清空和读取缓冲区,以及如何使用`flip()`、`clear()`和`compact()`...

    基于matrix-nio和nio-template构建的管理员和个人协助.zip

    相比之下,NIO(Non-blocking I/O)通过选择器和通道的概念,使得一个线程可以同时处理多个连接,极大地提高了服务端的并发处理能力。Matrix-NIO就是利用这种机制,为开发者提供了一套易于使用的API,用于构建可扩展...

    socket-nio-single-reactor.zip

    与传统的I/O模型(BIO)不同,NIO不依赖于线程池来处理并发连接,而是通过选择器(Selector)来轮询和监听通道(Channel)上的事件。这使得NIO在资源利用率和性能上有了显著提升。 在"socket-nio-single-reactor....

    JAVA NIO 简单PFT 文件服务

    1. **Channel**:在NIO中,数据读写是通过Channel进行的,它像一个管道,可以从一个源头(如文件或网络连接)到目的地(如另一个文件或网络连接)传输数据。例如,FileChannel可以用来读取和写入文件。 2. **Buffer...

    java nio 读文件

    总的来说,Java NIO提供了一种更高效、灵活的方式来处理文件读取和其他I/O操作,尤其适合需要处理大量并发I/O请求的场合,例如服务器端编程。通过熟练掌握NIO,开发者可以构建出更加高效的Java应用程序。

    Java NIO - The NIO Architecture

    NIO还引入了通道(Channel)的概念,通道是一种支持读写操作的对象,可以连接到文件或网络套接字。通过使用FileChannel和SocketChannel等接口,可以更灵活地控制数据传输过程。例如,可以将一个文件通道的数据直接...

    java NIO 写文件

    Java NIO(New IO)是Java 1.4版本引入的一个新模块,它提供了一种新的方式来处理I/O操作,相比传统...通过理解其核心组件和操作机制,开发者可以充分利用NIO来优化文件读写性能,尤其是在高并发和大文件处理的场景下。

    java nio 写文件

    在Java NIO中,数据的读取和写入都是通过通道(Channel)进行的。通道可以理解为连接到I/O设备的桥梁,例如文件、网络套接字等。要使用NIO写文件,首先需要获取FileChannel对象,这可以通过`FileOutputStream`的`...

    Java NIO.docx

    Java NIO 是 JDK 1.4 中引入的新的 IO 方式,它主要包含 Buffer、Channel、Selector 三个核心的组件。 Java NIO 概述 ---------------- Java NIO 是 Java 编程语言中的一种新的 IO 模式,它与传统 IO 的区别在于...

    bio-nio-aio.zip

    NIO基于通道(Channel)和缓冲区(Buffer)进行数据传输,且提供了选择器(Selector)来监听多个通道的事件,实现了一对多的模型。这样,服务器端可以同时处理多个连接,提高了系统资源利用率。 压缩包中的`demo3.txt`...

Global site tag (gtag.js) - Google Analytics