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...
  • wangjun5159
  • wangjun5159
  • 2015年11月24日 23:24
  • 7980

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

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

NIO按行读取文件内容,并打印出来

package com.broada.wssh.groovy; import java.io.File; import java.io.FileInputStream; import java.io...
  • meteor_1988
  • meteor_1988
  • 2014年07月09日 17:29
  • 1027

java中NIO对文件的读取操作

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

Java NIO ByteBuffer读取文件

FileChannel 和 ByteBuffer 从JDK1.4以后就提供java.nio的包,nio主要提供字节与字符的映射、内存映射文件和文件加锁机制 其中内存映射文件在读取大文件时可能会...
  • u012888365
  • u012888365
  • 2014年03月12日 21:47
  • 10943

java:NIO读写文件的示例

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

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

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

使用NIO来操作文件

JAVA的NIO主要用于对文件的读写操作,效率也比普通IO要高一些。在对文件的操作中,不但支持Byte格式的操作,还支持整数,浮点等基本类型的操作,非常方便。在对大文件的操作中,其特有的文件映射概念可...
  • andycpp
  • andycpp
  • 2006年02月21日 02:15
  • 2749

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

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

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

FileChannel   追加写入文件实现方法如下: File file = new File(filename) ; if(!file.exists()){ ...
  • seapeak007
  • seapeak007
  • 2017年06月20日 18:08
  • 2345
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java nio(文件读写 实例解析)
举报原因:
原因补充:

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