`

Java nio(三)

阅读更多
一、读文件:
前面我们介绍了通过获得FileChannel来写文件,现在我们再看看读操作。
其实读操作和写操作基本是对应的。
首先与写操作类似从文件中获得流,读操作要获得输入流FileInputStream
,再从这个流中得到FileChannel对象,然后进行读操作。
文件通道的读操作有三个read()方法:
int read(ByteBuffer buf);
从文件中读取buf.remaining()[即limit-position]个字节到缓冲区buf,从缓冲区的当前位置开始存取
int read(ByteBuffer[] buffers);
从文件中读到多个缓冲区中
int read(ByteBuffer[] buffers,int offset,int length);
从文件中读到buffers[offset]--buffers[offset+length-1]缓冲区中

用个小例子描述上面的过程:
File file = new File("D:\text.txt");
FileInputStream fis = new FileInputStream(file);
FileChannel inputChannel = fis.getChannel();
ByteBuffer buf = ByteBuffer.allocate(48);
while(inChannel.read(buf) != -1){
  //....从buf中提取出数据;for example:
  System.out.println(buf.filp().asCharBuffer().toString());
  buf.clear();
}

二、文件复制:
文件通道定义了两个方法,可以进行直接的文件传输:
int transferTo(int position,long count,WritableByteChannel dst);
这个函数是把文件从position位置开始向dst通道传送count个字节。
int transferFrom(ReadableByteChannel src,long position,long count);
将count个字节从通道src传送到文件中,position是为文件开始写入的位置。
从FileInputStream中获得的通道只支持transferTo,而从FileOutputStream中获得
的通道只支持tansferFrom()方法
举个小例子来说明这个过程:
  File fromFile = new File("D:/from.txt");
  File toFile = new File("D:/to.txt");
  FileInputStream fis = new FileInputStream(fromFile);
  FileOutputStream fos = new FileOutputStream(toFile);
  FileChannel inChannel = fis.getChannel();
  FileChannel outChannel = fos.getChannel();
  int byteWritten = 0;
  long byteCount = inChannel.size();
  while(byteWritten < byteCount){
    byteWritten += inChannel.transferTo(bytesWritten,byteCount- bytesWritten,outChannel);
  }
  fis.close();
  fos.close();

也可以使用outChannel的transferFrom()方法复制数据,他们都可以一次传送所有的
数据,万一没有一次传送所有的数据,可以使用类似上面的while循环来处理。
三、随机读取文件:
FileChannel定义了两个方法用来进行随机读写操作:
int read(ByteBuffer buf,long position);
从文件的position位置开始读取字节到buf中
int write(ByteBuffer buf,long position);
把buf的数据,从文件的position开始写入到文件中
四、一个通道进行文件的读写
上面提到的从FileInputStream和FileOutputStream获得的通道只能进行读或者写操作,
如果我们想得到一个通道,同时可以进行读和写操作,那该怎么办?
从RandomAccessFile获得的通道就是这样一个通道。
File file = new File("D:\test.txt");
RandomAccessFile raf = new RandomAccessFile(file,"rw");
FileChannel ioChannel = rad.getChannel();

五、内存映像文件:
内存映像文件是这样的文件,它的内容被映像到计算机虚拟内存的一块区域,这样就可以
直接的使用和更新文件中的数据了,可以很大的提高效率。
FileChannel提供了map方法来把文件影射为内存映像文件:
MappedByteBuffer map(int mode,long position,long size);
可以把文件的从position开始的size大小的区域映射为内存映像文件,mode指出了
可访问该内存映像文件的方式:READ_ONLY,READ_WRITE,PRIVATE.
详细可以参考java API
MappedByteBuffer类还提供了三个方法:
fore();缓冲区是READ_WRITE模式下,此方法对缓冲区内容的修改强行写入文件
load()将缓冲区的内容载入内存,并返回该缓冲区的引用
isLoaded()如果缓冲区的内容在物理内存中,则返回真,否则返回假
File file = new File("D:\test.txt");
RandomAccessFile raf = new RandomAccessFile(file,"rw");
FileChannel ioChannel = rad.getChannel();
MappedByteBuffer buf = ioChannel.map(READ_WRITE.0L,ioChannel.size()).load();

后面总结有关从Socket获得到SocketChannel进行异步通讯的问题。
7
1
分享到:
评论
4 楼 fuliang 2013-12-20  
string2020 写道
内存映像文件 有什么用,MappedByteBuffer是干啥的。

可以像操作ByteBuffer一样操作文件。
3 楼 string2020 2013-12-19  
内存映像文件 有什么用,MappedByteBuffer是干啥的。
2 楼 bojianpc 2008-09-08  
不错哦最近项目要用 可以向你请教此类的问题么 我的QQ1067302 希望能得到你的恢复
1 楼 fuliang 2008-03-02  
另外补充一下读写基本类型的例子:
写入基本类型:
 public static void testWritePrimitiveBuffer()throws Exception{
       int i = 10;
       long l = 10L;
       double d = 29.01;
       char ch = 'c';
       ByteBuffer buffer = ByteBuffer.allocate(100);
       buffer.putInt(i).putLong(l).putDouble(d).putChar(ch);
       FileOutputStream fos = new FileOutputStream(new File("D:/primitive.txt"));
       FileChannel outputChannel = fos.getChannel();
       buffer.flip();
       outputChannel.write(buffer);
    }

读入基本类型:
将刚写入的数据读出:
public static void testReadPrimitiveBuffer()throws Exception{
       int i;
       long l;
       double d;
       char ch;
       ByteBuffer buffer = ByteBuffer.allocate(100);
       FileInputStream fis = new FileInputStream(new File("D:/primitive.txt"));
       FileChannel inputChannel = fis.getChannel();
       inputChannel.read(buffer);
       buffer.flip();
       i = buffer.getInt();
       l = buffer.getLong();
       d = buffer.getDouble();
       ch = buffer.getChar();
       System.out.println("i=" + i + ",l=" + l + ",d=" + d + ",ch=" + ch);
    }

相关推荐

    JavaNIO chm帮助文档

    Java NIO系列教程(三) Buffer Java NIO系列教程(四) Scatter/Gather Java NIO系列教程(五) 通道之间的数据传输 Java NIO系列教程(六) Selector Java NIO系列教程(七) FileChannel Java NIO系列教程(八) ...

    java NIO和java并发编程的书籍

    java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java...

    java NIO.zip

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java标准库提供的一种替代传统的I/O模型的新技术。自Java 1.4版本引入NIO后,它为Java开发者提供了更高效的数据传输方式,尤其是在处理大量并发...

    Java NIO英文高清原版

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java平台中用于替代标准I/O(BIO)模型的一种新机制。NIO在Java 1.4版本引入,提供了更高效的数据处理和通道通信方式,特别适用于高并发、大数据...

    Java NIO 中文 Java NIO 中文 Java NIO 中文文档

    Java NIO 深入探讨了 1.4 版的 I/O 新特性,并告诉您如何使用这些特性来极大地提升您所写的 Java 代码的执行效率。这本小册子就程序员所面临的有代表性的 I/O 问题作了详尽阐述,并讲解了 如何才能充分利用新的 I/O ...

    java NIO 视频教程

    Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。 Java NIO: Channels and Buffers(通道和缓冲区) 标准的IO基于字节流和字符流进行操作的,...

    java nio 包读取超大数据文件

    #### 三、使用Java NIO读取超大数据文件 在Java NIO中,处理超大数据文件的关键在于合理利用内存映射文件(Memory-Mapped Files)来提高读取效率。内存映射文件是一种将文件内容直接映射到内存中的技术,使得对文件...

    java NIO技巧及原理

    Java NIO(New Input/Output)是Java标准库提供的一种I/O模型,它与传统的 Blocking I/O(IO)相比,提供了更加高效的数据传输方式。在Java NIO中,"新"主要体现在非阻塞和多路复用这两个特性上,这使得NIO更适合于...

    java NIO实例

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种新的I/O模型,它为Java应用程序提供了更高效的数据传输方式。传统的Java I/O模型(BIO)在处理大量并发连接时效率较...

    一个java NIO的例子

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java标准库提供的一种替代传统I/O模型的新技术。在传统的Java IO模型中,读写操作是阻塞的,即当调用read或write方法时,线程会等待数据准备好或...

    Java Nio selector例程

    java侧起server(NioUdpServer1.java),基于Java Nio的selector 阻塞等候,一个android app(NioUdpClient1文件夹)和一个java程序(UI.java)作为两个client分别向该server发数据,server收到后分别打印收到的消息...

    Java NIO Socket基本

    Java NIO(New Input/Output)是Java标准库中提供的一种I/O模型,与传统的 Blocking I/O(同步阻塞I/O)相对。NIO在Java 1.4版本引入,其设计目标是提供一种更高效、更灵活的I/O操作方式,特别适合处理大量并发连接...

    java nio 实现socket

    #### 三、NIO实现Socket通信的基本流程 基于Java NIO的Socket通信流程大致如下: 1. **创建ServerSocketChannel**:服务器端首先需要创建一个`ServerSocketChannel`,用于监听客户端的连接请求。 2. **创建...

    Java NIO测试示例

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种新的I/O模型,它为Java应用程序提供了更高效、灵活的I/O操作方式。NIO与传统的 Blocking I/O(阻塞I/O)模式相比,...

    java nio入门学习,两个pdf

    三、Java NIO的工作流程 1. **打开通道**:首先,我们需要创建一个或多个通道,如打开文件、建立网络连接等。 2. **分配缓冲区**:根据需求分配合适的缓冲区,如ByteBuffer。 3. **读写操作**:通过通道与缓冲区...

Global site tag (gtag.js) - Google Analytics