`

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

阅读更多
http://blog.csdn.net/biexf/article/details/5897255
读写操作是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,容量和最大容量都为1024的ByteBuffer

    ByteBuffer bb = ByteBuffer.allocate(1024);

    //fc向buffer中读入数据

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) 在fcin向buffer读数据之前,使用clear();

2) 在buffer向fcout写数据之前,使用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上百实例源码以及开源项目源代码

    Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密  Java非对称加密源程序代码实例,本例中使用RSA加密技术,...

    JAVA上百实例源码以及开源项目

    Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密  Java非对称加密源程序代码实例,本例中使用RSA加密技术,...

    Java思维导图xmind文件+导出图片

    Java客户端实现Kafka生产者与消费者实例 kafka的副本机制及选举原理剖析 基于kafka实现应用日志实时上报统计分析 RabbitMQ 初步认识RabbitMQ及高可用集群部署 详解RabbitMQ消息分发机制及主题消息分发 ...

    java开源包4

    fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的插件,用来对 HTML 文件内容进行清洗和格式化处理。它采用...

    java开源包6

    fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的插件,用来对 HTML 文件内容进行清洗和格式化处理。它采用...

    java开源包11

    fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的插件,用来对 HTML 文件内容进行清洗和格式化处理。它采用...

    java开源包9

    fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的插件,用来对 HTML 文件内容进行清洗和格式化处理。它采用...

    java开源包101

    fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的插件,用来对 HTML 文件内容进行清洗和格式化处理。它采用...

    java开源包8

    fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的插件,用来对 HTML 文件内容进行清洗和格式化处理。它采用...

    java开源包5

    fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的插件,用来对 HTML 文件内容进行清洗和格式化处理。它采用...

    java开源包10

    fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的插件,用来对 HTML 文件内容进行清洗和格式化处理。它采用...

    java开源包1

    fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的插件,用来对 HTML 文件内容进行清洗和格式化处理。它采用...

    java开源包3

    fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的插件,用来对 HTML 文件内容进行清洗和格式化处理。它采用...

    精通并发与 netty 视频教程(2018)视频教程

    39_NIO中Scattering与Gathering深度解析 40_Selector源码深入分析 41_NIO网络访问模式分析 42_NIO网络编程实例剖析 43_NIO网络编程深度解析 44_NIO网络客户端编写详解 45_深入探索Java字符集编解码 46_字符集编解码...

    java开源包2

    fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的插件,用来对 HTML 文件内容进行清洗和格式化处理。它采用...

    java开源包7

    fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的插件,用来对 HTML 文件内容进行清洗和格式化处理。它采用...

    精通并发与netty视频教程(2018)视频教程

    39_NIO中Scattering与Gathering深度解析 40_Selector源码深入分析 41_NIO网络访问模式分析 42_NIO网络编程实例剖析 43_NIO网络编程深度解析 44_NIO网络客户端编写详解 45_深入探索Java字符集编解码 46_字符集编解码...

    Java资源包01

    fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的插件,用来对 HTML 文件内容进行清洗和格式化处理。它采用...

    精通并发与netty 无加密视频

    第39讲:NIO中Scattering与Gathering深度解析 第40讲:Selector源码深入分析 第41讲:NIO网络访问模式分析 第42讲:NIO网络编程实例剖析 第43讲:NIO网络编程深度解析 第44讲:NIO网络客户端编写详解 第45讲:...

Global site tag (gtag.js) - Google Analytics