`

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 NIO推送实例

    - **通道(Channels)**:Java NIO 提供了多种通道,如文件通道、套接字通道等,它们代表不同类型的I/O操作。 - **缓冲区(Buffers)**:数据在通道和应用程序之间传输时会存储在缓冲区中,缓冲区提供了更有效率的...

    Java NIO——Selector机制解析三(源码分析)

    相比于传统的BIO(Blocking I/O),NIO允许我们以非阻塞的方式读写数据,提高了系统资源的利用率,尤其在处理大量并发连接时表现优异。本文将深入探讨Java NIO中的Selector机制,并通过源码分析来理解其实现原理。 ...

    Java NIO (中文版).pdf

    Java NIO,全称为Non-...书中应该涵盖了理论知识、实例解析以及实战技巧,帮助Java开发者更好地掌握这一关键技术。无论是网络编程、文件操作还是服务器开发,NIO都能提供强大的支持,是Java开发者的必备技能之一。

    java io读写文件

    在Java中,进行文件读写的操作通常涉及两个核心包:`java.io` 和 `java.nio`。这里我们主要关注 `java.io` 包,它提供了多种类来处理文件的读写操作,如`FileReader`, `FileWriter`, `BufferedReader`, 和 `...

    java nio 网络编程指南

    ### Java NIO网络编程核心知识点解析 #### 非阻塞式Socket通信:Java NIO的革命性突破 从JDK 1.4版本开始,Java引入了NIO(Non-blocking I/O)API,这标志着Java网络编程的一个重大转折点。传统上,基于阻塞I/O的...

    Java_NIO原理解析

    Java NIO(New Input/Output)是Java标准库在JDK 1.4引入的一套全新的I/O API,它的设计目标是提供一种更有效、更灵活的I/O操作方式,尤其是在处理大量并发连接时,其性能表现显著优于传统的阻塞I/O模型。NIO的核心...

    Java读写.txt文件

    在Java编程中,读写文本文件(如`.txt`文件)是常见的操作,尤其是在处理配置文件时。配置文件通常以键值对(key-value pairs)的形式存储数据,便于程序访问和管理设置。以下是对这个主题的详细阐述: 1. **Java I...

    java 读写 csv 文件

    首先创建一个`CSVFormat`实例,设置分隔符、引用字符等参数,然后通过`Files.newBufferedReader()`读取文件内容,最后使用`CSVParser.parse()`方法解析文件。 ```java import org.apache.commons.csv.*; // 创建...

    Java NIO Path接口和Files类配合操作文件的实例

    这篇文章将通过实例讲解如何使用Java NIO的Path接口和Files类来操作文件。 首先,我们需要了解什么是Path接口。Path接口表示的是文件系统中的一个路径。这个路径可以是绝对路径,也可以是相对路径。绝对路径以根...

    PRO JAVA 7 NIO2

    在Java 7的NIO2(JSR203:Java平台上的更多新I/O API)更新中,`java.nio.file.Path` 类成为了核心组件之一,为开发者提供了更高效、更直观的文件系统操作接口。本文将详细解析 `Path` 类的功能与应用,帮助读者掌握...

    Java Socket学习---nio实现阻塞多线程通信

    我们将会分析`EchoServer.java`、`EchoClient.java`和`SocketUtils.java`这三个文件中的关键知识点。 首先,让我们从`EchoServer.java`开始。这是一个典型的回显服务器,它的主要任务是接收客户端发送的数据并...

    基于JAVA NIO 的轻量级消息传输框架。主要功能包括:文本消息传输、二进制文件传输、文本及二进制混合传输.zip

    在这个基于JAVA NIO的消息传输框架中,我们看到了三个主要功能:文本消息传输、二进制文件传输以及文本和二进制混合传输。这些功能使得框架能够灵活地处理不同类型的通信需求。 1. **文本消息传输**: 在网络通信...

    Java高并发编程代码(Netty NIO 实例)

    本实例将深入探讨Netty如何实现NIO在高并发场景下的优化和应用。 首先,让我们理解Java的NIO(Non-blocking I/O,非阻塞I/O)。传统的Java IO模型(BIO)是基于流(Stream)的,对每一个连接都需要一个线程来处理,当...

    java编写的文件管理系统

    5. **Files类**:与Path接口配套的`java.nio.file.Files`类提供了许多静态方法,可以直接操作文件和目录,如创建、删除、复制文件,读取文件内容等。 6. **目录遍历**:文件管理系统通常需要遍历目录结构,Java可以...

    基于Java的实例开发源码-NIO网络框架 xSocket.zip

    Java NIO(New IO)是Java 1.4版本引入的一个新特性,它为Java应用程序提供了非阻塞I/O操作的能力,极大地提升了I/O性能。NIO与传统的BIO(Blocking IO)模型相比,主要优势在于可以同时处理多个连接,避免了线程...

    java socket nio 研究

    Java Socket和NIO(非阻塞I/O)是Java编程中的重要部分,它们在构建高性能、高并发的网络应用程序中发挥着关键作用。Socket是基于TCP/IP协议的应用层接口,而NIO则是一种I/O模型,它提供了不同于传统阻塞I/O的处理...

    java 读取写入csv

    通过上述分析,我们可以看到Java读取和写入CSV文件的过程涉及到多个步骤,包括初始化读写器、循环读取或写入数据、异常处理以及资源释放。正确地理解和应用这些步骤对于高效处理CSV文件至关重要。 此外,使用日志...

    Java 对象序列化 NIO NIO2详细介绍及解析

    NIO2是Java 7引入的进一步扩展,增加了文件系统查询、文件监听、异步I/O等功能。NIO2的主要改进包括: 1. **Path API**:提供了一种抽象表示文件路径的方式,使得跨平台操作更加方便。 2. **Files API**:提供了...

Global site tag (gtag.js) - Google Analytics