java中的IO分许多种 

  具体介绍请往这走http://blog.51cto.com/stevex/1284437

  java IO 中的NIO的英译名为(new IO ) 他是的出现时在JDK1.4版本才有的。

  NIO 的它实则是一种非阻塞的IO,它是一种基于缓存区的IO读写。

  以前的BIO是一种基于流的读写。每次读写都消耗一个字节数据。而NIO则是一种面向块的读写。每次读写都消耗一个数据块。在操作的速度上要比BIO快许多。

二、使用NIO

  首先介绍一下NIO的必须要知道的几个词汇

  1.通道  2.缓冲区

  通道 和 缓冲区 是 NIO 中的核心对象,几乎在每一个 I/O 操作中都要使用它们。

  通道是对原 I/O 包中的流的模拟。到任何目的地(或来自任何地方)的所有数据都必须通过一个 Channel 对象。一个 Buffer 实质上是一个容器对象。发送给一个通道的所有对象都必须首先放到缓冲区中;同样地,从通道中读取的任何数据都要读到缓冲区中。

  NIO同时支持多路IO复用。(多个通道连接到同一个缓冲区)

  java拓展----NIO

  NIO中程序操作的是缓冲区。文件的读取步骤将缓冲区中的数据读取全部读取到。然后将缓冲区中的缓存内容清除。NIO中文件写入操作则是将缓存中的缓存内容写入到文件中去。

·   以下是一个基于BIO的简单文件拷贝的实现。

package com.demo.io.nio;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class FileChannelTest {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("C:\\Users\\Desktop\\test.jsp");
        FileChannel foc = new FileOutputStream("C:\\Users\\Desktop\\test.txt").getChannel();
        FileChannel fic = fis.getChannel();
        //创建一个缓冲区大小为48的ByteBuffer
        ByteBuffer bb = ByteBuffer.allocate(2);
        int br = 0;
        while((br=fic.read(bb))!= -1) {
            //bb.flip() 的调用,首先读取数据到Buffer,然后反转Buffer,接着再从Buffer中读取数据
            bb.flip();
            //告诉当前位置和极限之间是否存在任何元素(此缓冲区中有元素)
            while(bb.hasRemaining()) {
                foc.write(bb);
            }
            System.out.println();
            //缓存满了就会清理缓存
            bb.clear();
        }
        fic.close();
        fis.close();        
    }
}

 

三、简单的文件操作

  操作流程图:

java拓展----NIO

 

代码:

public class NIOFileChannel {
  public static void main(String[] args) throws IOException {
    String str = "hello world";
    //  创建一个输出流
    FileOutputStream fileOutputStream = new FileOutputStream("C:\\file\\file01.txt");
    //  使用输出流获取到对应的FileChannel
    FileChannel fileChannel = fileOutputStream.getChannel();
    //  创建一个缓冲区
    ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
    //  将要写入的数据放入byteBuffer中
    byteBuffer.put(str.getBytes());
    //  反转ByteBuffer
    byteBuffer.flip();
    //  将缓冲区的数据写入通道中
    fileChannel.write(byteBuffer);
    fileChannel.close();
    fileOutputStream.close();
  }
}
文件写入

相关文章:

  • 2021-05-30
  • 2021-08-12
  • 2021-12-14
  • 2021-11-05
  • 2021-06-02
  • 2022-02-28
  • 2022-03-01
  • 2022-02-13
猜你喜欢
  • 2022-01-20
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-16
  • 2022-12-23
相关资源
相似解决方案