`

j2se -----nio----buffer and channel

    博客分类:
  • J2SE
阅读更多
缓冲区 如:ByteBuffer其实是对基本数据类型的封装 byte[]而已啦,
CharBuffer,ShortBuffer,IntBuffer,
LongBuffer,FloatBuffer,DoubleBuffer
其实这些所谓的缓冲区就是给基本数据类型多加了几个变量而已
position(当前可以放的位置),limit(最后一个元素位置),capacity

1.
IntBuffer buf = IntBuffer.allocate(10);
int temp={5,7,9};
buf.put(3);
buf.put(temp);

buf.flip(); //重设缓冲区(翻动---position=0;limit=原本的position)
while(buf.hasRemaining()){
   int x = buf.get();
}

2. 创建子缓冲区
public class Test{
  public static void main(String[] args){
     IntBuffer buf = IntBuffer.allocate(10);
     IntBuffer sub = null;
     for(int i=0;i<10;i++){
        buf.put(2*i+1);
     }
     buf.position(2);       //主缓冲区指针设置在第三个元素
     buf.limit(6);           //主缓冲区limit为6
     sub = buf.slice();      //开辟子缓冲区,也就是他有一个引用指向了buf的部分区域
     //sub = buf.asReadOnlyBuffer(); //创建只读缓冲区
      for(int i=0;i<sub.capacity();i++){
         int temp = sub.get(i);
         sub.put(temp -1);      //这是在改变buf中的东西哈,position指哪改哪
      }
      buf.flip();
      buf.limit(buf.capacity);   //设置limit
      while(buf.hasRemaining()){
          int x = buf.get();      
          System.out.println(x+",");
      }
  }
}

3。创建直接缓冲区,如果创建了直接缓冲区,则JVM将尽量最大努力直接对其执行本机的IO操作
public static ByteBuffer allocateDirect(int capacity)


二:通道
通道是一个可以读取和写入数据的一种形式,
一般先放入缓冲区然后写入或读取,可进行双向操作哈

Channel接口定义
  void close() //关闭通道
  boolean isOpen(); //判断此通道是否是打开的
  
FileChannel()完成文件双向操作
public class Test{
  public static void main(String[] args){
    String[] info = {"MLDN","www.mldn.cn","www.mldnjava.cn","haha"};
     File file = new File("d:"+File.seperator+"a.txt");
     FileOutputStream output = new FileOutputStream(file);
     FileChannel fout = output.getChannel(); //得到输出通道
     ByteBuffer buf = ByteBuffer.allocate(1024);
     for(int i=0;i<info.length;i++){
       buf.put(info[i].getBytes());  //字符串变为字节数组放入缓冲区之中
     }
     buf.flip();
     fout.write(buf); //输出缓冲区的内容
     fout.close();
     output.close();
  }
}  

//注意:输出流通道只能写。。。输入流通道只能读。。哎
class Test{
  public static void main(String[] args){
    File file1 = new File("d:"+File.separator+"note.txt");
    File file2 = new File("d:"+File.separator+"outnote.txt");
    FileChannel fout  = (new FileOutputStream(file2)).getChannel(); //这样写不好,因为流对象需要关闭啦
    FileChannel fin = (new FileInputStream(file2)).getChannel();
    ByteBuffer buf = ByteBuffer.allocate(1024);
    
    int temp =0;
    while((temp = fin.read(buf)) != -1){
       buf.flip();
       fout.write(out);
       buf.clear();  //清空缓冲区
    }
    fin.close();
    fout.close();
   //input.close();
    //output.close();
  }
}

//RamdomAccessFile :较慢
FileInputStream:较慢
缓冲读取:速度较快
内存映射:最快

MappedByteBuffer:使用此种方式读取最快哈
需要将一个输入的操作流绑定在内存映射

FileChannel类的三个内存映射模式:
public static final FileChannel.MapMode.READ_ONLY //只读映射
FileChannel.MapMode.READ_WRITE //读写模式
FileChannel.MapMode.PRIVATE  //专用(写入时拷贝)映射模式


class Test{
  public static void main(String[] args){
    File file = new FIle("d:"+File.separator+"a.txt");
    FileInputStream input = null;
    input = new FileInputStream(file);
    FileChannel fm = null;
    fm = input.getChannel();
    MapperByteBuffer buf =fin.map(FileChannel.MapMode.READ_ONLY,0,file.length()); //把文件直接映射到内存,而不是一行行读
    byte data[] = new byte[(int)file.length()]; //开辟空间接收内容
    int foot = 0;
    while(buf.hasRemaining()){
       data[foot++] = buf.get(); //读取数据
    }
    System.out.println(new String(data));
    fin.close();
    input.close();
    
    
  }
}

//注意:上述操作代码是最快的,但是如果在使用以上操作代码的时候,执行的是写入操作
则有可能非常危险,因为仅仅只是改变数组中的单个元素这样的简单操作,就有可能直接修改磁盘
上的文件,因为修改数据与将数据保存在磁盘上是一样的

分享到:
评论

相关推荐

    Java-NIO与IO的区别和比较.doc

    Java NIO(New Input/Output)是Java标准库在J2SE 1.4及后续版本中引入的一个重要更新,它的出现是为了改进传统的IO模型,提高I/O操作的效率和并发性。NIO的主要特点包括非阻塞I/O、字符转换、缓冲区以及通道等。 1...

    java-j2se.rar_j2se

    13. **IO与NIO**:传统的IO流与New IO(NIO)的区别,NIO的非阻塞特性、通道(Channel)和缓冲区(Buffer)。 14. **网络编程**:Socket编程,TCP与UDP的区别,以及ServerSocket和Socket类的使用。 15. **Swing...

    Java-J2SE学习笔记

    - **Channel与Buffer**:非阻塞I/O,提高数据传输效率。 - **Selector与SocketChannel**:多路复用,处理多个连接。 10. **Java Swing与JavaFX**: - **Swing组件**:创建GUI应用程序,如JFrame、JButton、...

    Java NIO 主要类和方法(Java NIO中文版 附录C)

    Java NIO(New Input/Output)是Java提供的一种新的输入输出处理机制,它与传统IO基于流的处理方式不同,NIO支持面向缓冲区的(Buffer-oriented)、基于通道的(Channel-based)I/O操作。在Java NIO中,Buffer类是...

    JAVA NIO 异步通信模板服务端

    Java NIO(New Input/Output)是Java在J2SE 1.4版本中引入的一个新特性,它提供了与标准I/O完全不同的编程模型,尤其是在处理大量并发连接时,NIO展现出了更高的效率。本模板服务端就是基于JAVA NIO实现的异步通信...

    j2SE中文API帮助文档

    5. **I/O与NIO**:`java.io`提供了传统的阻塞I/O,而`java.nio`引入了非阻塞I/O,提高了大规模并发I/O操作的效率,包括通道(Channel)、缓冲区(Buffer)和选择器(Selector)等概念。 6. **网络编程**:`java.net`包中...

    J2SE程序Demo

    13. **NIO(New IO)**: 研究非阻塞I/O,通道(Channel)和缓冲区(Buffer)的概念,以及选择器(Selector)的使用。 **多线程** 14. **Thread类与Runnable接口**: 创建和管理线程,了解同步和互斥。 15. **...

    java nio

    Java NIO,全称为Non-Blocking Input/Output,即非阻塞输入/输出,是Java在J2SE 1.4版本中引入的一种新的I/O模型,是对传统BIO(Blocking I/O)模型的一种有效补充。它提供了更高效的数据传输方式,尤其是在处理大量...

    nio.rar_NIO_java nio

    Java NIO(New IO)是Java平台中用于替代标准I/O API的一套新API,它在J2SE 1.4版本中引入。NIO提供了与标准IO不同的I/O工作方式,其主要特点是支持非阻塞I/O操作,极大地提高了在处理大量并发连接时的性能。非阻塞I...

    J2SE进阶

    理解和使用Selector、Channel和Buffer等核心概念是进阶学习的一部分。 10. **并发工具类**:Java并发包(java.util.concurrent)包含了很多并发控制和并行处理的工具类,如ExecutorService、Future、Callable、...

    Java_NIO与IO的区别和比较.doc

    Java NIO(New Input/Output)是Java标准库在J2SE 1.4及后续版本中引入的一个重要特性,它的出现是为了改进传统的IO模型,提高I/O操作的性能和效率。NIO与传统的IO(Old IO)在设计模式、工作原理以及使用方式上存在...

    [J2SE]应用编程150例

    11. **NIO(非阻塞I/O)**:Java NIO提供了一种新的I/O模型,相比传统的IO更适用于高并发场景,例子会介绍Channel、Buffer和Selector的使用。 12. **日期和时间API**:Java 8引入了新的日期时间API,例子会展示如何...

    J2SE的API中文版有找不到的可以下来看看

    8. **java.nio**:非阻塞 I/O 模型,提供了 Channel、Buffer 和 Selector 等类,提高了 I/O 性能,特别适用于高并发场景。 掌握这些核心类库的使用是成为熟练的 Java 开发者的必经之路。通过阅读和实践 J2SE 的 API...

    java异步socket调用[文].pdf

    - `java.nio.channels`:定义了通道(Channel)和选择器(Selector),用于异步I/O操作。通道可以注册到选择器上,指定感兴趣的操作事件,如连接就绪、数据可读或可写。 - `java.nio.charset`:处理字符集编码和解码。 ...

    J2SE.development.code.MemMapFile.rar_Java编程_Java_

    MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_WRITE, 0, fileSize); ``` 这里,`MapMode.READ_WRITE`表示我们希望读写映射文件。 2. **内存映射的效率**: 内存映射文件的效率主要来自于...

Global site tag (gtag.js) - Google Analytics