Java nio(文件读写 实例解析)

原创 2010年09月20日 15:58:00

读写操作是I/O操作的基本行为;NIO中从Channel中读数据非常简单:创建一个buffer;通过一个channel完成buffer的数据读入;写数据同样简单:创建一个buffer;向其中填充数据;然后通过一个channel完成buffer的数据写入;

         下面通过java的实际例子进行说明:

 NIO读操作:

原来的IO中需要先创建一个FileInputStream然后完成读操作;

NIO读数据时因为数据最终都驻留在buffer,所以你只需要从channel中读取数据到buffer对象中;

NIO中读取数据的步骤:1)从FileInputStream中得到Channel对象;2)创建一个buffer对象;3)Channel中读数据到Buffer;

javaCode:

-------------------------------------------------------------------------------------------------------------------------

//FileInputStream中获取channel对象

    FileInputStream fis = new FileInputStream(new File("D://1.txt"));

    FileChannel fc = fis.getChannel();

    //生成一个偏移量为0,容量和最大容量都为1024ByteBuffer

    ByteBuffer bb = ByteBuffer.allocate(1024);

    //fcbuffer中读入数据

fc.read(bb);

         --------------------------------------------------------------------------------------------------------------------------

        

         你可能会注意到这里我们并不需要要求channel对象读入多少buffer数据,每个buffer对象内部有一个复杂的计数系统来跟踪已经读取的数据和剩余可读的buffer数据空间;

 

NIO写数据:

         javacode:

         --------------------------------------------------------------------------------------------------------------------------

         //FileOutputStream中获取一个文件流;

    FileOutputStream fos = new FileOutputStream("D:/1.txt");      

    FileChannel fc = fos.getChannel();

      

    //创建一个buffer并把准备写的数据填充进去;

    ByteBuffer bb = ByteBuffer.allocate(1024);

    //数据源

    byte[] message = {1,2,42,'a',3};

    bb.put(message);

    bb.flip();

//一定得有,如果没有,就是从文件最后开始读取的。通过这个语句,就能把buffer的当前位置更改为buffer缓冲区的第一个位置。这样就可以从buffer开头,对该buffer进行遍历(读取)了。

    //实际的写操作;

    fc.write(bb); -----------------------------------------------------------------

    这里同样的,我们不需要告诉Channel对象我们将要写入多少个字节,buffer内部有自己的计数系统来跟踪记录已经包含的数据和还可以写入数据的空间;

   

NIO的同时读操作和写操作:

    举一个CopyFile的例子:从一个文件中复制数据到另一个文件中;其中包含三个基本操作:

创建一个Buffer,然后从从一个源文件中读取数据到buffer,继而把buffer中的数据写入到目标文件中; Read->Write->Read->Write;该过程一直重复直至完成复制;

    所以核心的循环代码如下:

    -----------------------------------------------------------------

    fcin.read(buffer);//read

    fout.write(buffer);//write

    -----------------------------------------------------------------

 

控制的循环终点: int r = fcin.read(buffer);

if(r==-1) 可以作为循环控制的终点;

 

重新定位Buffer位置:

1) fcinbuffer读数据之前,使用clear();

2) bufferfcout写数据之前,使用flip;

 

-----------------------------------------------------------------

    buffer.clear();

    int r = fcin.read(buffer);

   

    if(r==1){

       break;

}

 

buffer.flip();

fcout.write(buffer);

    -----------------------------------------------------------------

 

    CopyFile.java全文:

    -----------------------------------------------------------------

    static public void main( String args[] ) throws Exception {

        if (args.length<2) {

         System.err.println( "Usage: java CopyFile infile outfile" );

         System.exit( 1 );

        }

        File file = new File("");

        String infile = args[0];

        String outfile = args[1];

 

        FileInputStream fin = new FileInputStream( infile );

    FileOutputStream fout = new FileOutputStream( outfile );

 

        FileChannel fcin = fin.getChannel();

    FileChannel fcout = fout.getChannel();

 

        ByteBuffer buffer = ByteBuffer.allocate( 1024 );

 

        while (true) {

            buffer.clear();

 

        int r = fcin.read( buffer );

 

        if (r==-1) {

           break;

            }

       buffer.flip();

       fcout.write( buffer ); }

     }

    -----------------------------------------------------------------

相关文章推荐

Java NIO 读取文件、写入文件、读取写入混合

前言 Java NIO使用通道、缓冲来操作流,所以要深刻理解这些概念,尤其是,缓冲中的数据结构,当前位置、limit、容量 读取文件的样例代码 String pathname = "C:\\Use...

JAVA之NIO按行读写大文件,完美解决中文乱码问题

前言 最近在开发的时候,接到了一个开发任务,要将百万行级别的txt数据插入到数据库中,由于内存方面的原因,因此不可能一次读取所有内容,后来在网上找到了解决方法,可以使用NIO技术来处理,于是找到了这篇...

java:NIO读写文件的示例

Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API。 NIO方式读数据非常简单 创建一个缓冲区(ByteBuffer);通...
  • 10km
  • 10km
  • 2016年07月04日 19:00
  • 1990

javanio中FileChannel写入文件write,追加文件,以及多文件合并

FileChannel   追加写入文件实现方法如下: File file = new File(filename) ; if(!file.exists()){ ...

Java NIO 写文件

//将邮箱 姓名和最后生成的链接数据写入csv文件     private void writeCsv(String content, String fileName) throws IOExcep...
  • cynhafa
  • cynhafa
  • 2012年03月30日 09:52
  • 4119

java中NIO对文件的读取操作

NIO相比普通的IO,多的内容在于指定缓冲区和通道。这种和底层直接交互的流操作方式,相比普通流而言,在效率上有所提升。以下为完整的NIO操作实例。   import java.io...

Java IO流和NIO流读写文件比较

学习,借鉴,共同分享

Java NIO 读取文件、写入文件、读取写入混合

前言 Java NIO(new/inputstream outputstream)使用通道、缓冲来操作流,所以要深刻理解这些概念,尤其是,缓冲中的数据结构(当前位置(position)、限制(l...

Java文件读写IO/NIO及性能比较总结

干Java这么久,一直在做WEB相关的项目,一些基础类差不多都已经忘记。经常想得捡起,但总是因为一些原因,不能如愿。 其实不是没有时间,只是有些时候疲于总结,今得空,下定决心将丢掉的都给捡起来。 文件...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java nio(文件读写 实例解析)
举报原因:
原因补充:

(最多只允许输入30个字)