zoukankan      html  css  js  c++  java
  • JavaNIO中的内存映射io

    客户端代码:

    package cc.client;
    
    import java.io.*;
    import java.net.InetSocketAddress;
    import java.nio.ByteBuffer;
    import java.nio.MappedByteBuffer;
    import java.nio.channels.*;
    
    public class ClientOper {
        public static void main(String[] args) throws IOException {
            
            File file=new File("test.txt");
            
            RandomAccessFile raf=new RandomAccessFile(file, "rw"); 
            FileChannel fileChannel=raf.getChannel();
            //内存映射,将内核缓存区的内存进行映射,应用程序可以像操作用户缓存区一样向内核缓存区读写数据。
            MappedByteBuffer mbb=fileChannel.map(FileChannel.MapMode.READ_WRITE, 0,1024 );
            //写入数据
            for(int i=0;i<1024;i++)
                mbb.put((byte)'c');
            raf.close();
            
            /* SocketChannel sChannel = SocketChannel.open();
                sChannel.configureBlocking(false);
                //建立连接
                sChannel.connect(new InetSocketAddress("127.0.0.1", 80));
            
            
            
              while (!sChannel.finishConnect()) {
               
                try {
                  Thread.sleep(10);
                } catch (InterruptedException e) {
                  e.printStackTrace();
                }
              }
             
             
            //这时依旧需要CPU将内核缓冲区的内容拷贝到网络缓冲区
            while(mbb.hasRemaining()) {
                sChannel.write(mbb);
            }
            fileChannel.close();
            raf.close();*/
            
            
            //测试消息成功写入了test文件
            /*FileInputStream fs=new FileInputStream(file);
            
            byte[] bytes=new byte[1024];
              StringBuilder stringb=new StringBuilder();
              //开始读消息
              int length;
              while((length=fs.read(bytes))!=-1) {
                  
                  stringb.append(new String(bytes,0,length));
              }
              System.out.println(stringb);
              fs.close();*/
            
            
            
             
        }
    }
            
            
            
        

    服务端代码:

    public class ServerOper {
    
        
        public static void main(String[] args) throws IOException {
            // TODO Auto-generated method stub
            ServerSocketChannel serverSocket = ServerSocketChannel.open();
            serverSocket.bind(new InetSocketAddress(80));
            serverSocket.configureBlocking(false);
            
             SocketChannel socketChannel = null;
             while(socketChannel==null) {
                 socketChannel=serverSocket.accept();
             }
             ByteBuffer byteBuffer=ByteBuffer.allocate(1024);
             int numByetsRead;
              while((numByetsRead = socketChannel.read(byteBuffer)) != -1) {
                  
                  if (numByetsRead == 0) {
                      // 如果没有数据,则稍微等待一下
                      try {
                        Thread.sleep(1);
                      } catch (InterruptedException e) {
                        e.printStackTrace();
                      }
                      continue;
                    }
                    // 转到最开始
                    byteBuffer.flip();
                    while (byteBuffer.remaining() > 0) {
                      System.out.print((char) byteBuffer.get());
                    }
    
            
                  
              }
              
              socketChannel.close();
              serverSocket.close();
             
    
        }
    
    }

    参考:

    Java NIO学习笔记四(零拷贝详解)

               https://www.linuxtopia.org/online_books/programming_books/thinking_in_java/TIJ314_029.htm

  • 相关阅读:
    git 常用命令总结
    Activiti(工作流)如何关联业务表
    常见数据结构复杂度
    linux 启动 oracle数据库
    word2vec 入门(三)模型介绍
    数组中出现次数超过一半的数字 -java
    word2vec 入门(二)使用教程篇
    word2vec 入门基础(一)
    Stackoverflow上人气最旺的10个Java问题(转ImportNew)
    leetcode 326. Power of Three(不用循环或递归)
  • 原文地址:https://www.cnblogs.com/cai-cai777/p/10255620.html
Copyright © 2011-2022 走看看