iis服务器助手广告广告
返回顶部
首页 > 资讯 > 服务器 >Java NIO服务器端开发详解
  • 262
分享到

Java NIO服务器端开发详解

javanio服务器 2023-05-30 18:05:26 262人浏览 泡泡鱼
摘要

一、NIO类库简介  1、缓冲区Buffer  Buffer是一个对象,包含一些要写入和读出的数据。  在NIO中,所有的数据都是用缓冲区处理的,读取数据时,它是从通道(Channel)直接读到缓冲区中,在写入数据时,也是从缓冲区写入到通道

一、NIO类库简介

  1、缓冲区Buffer

  Buffer是一个对象,包含一些要写入和读出的数据。

  在NIO中,所有的数据都是用缓冲区处理的,读取数据时,它是从通道(Channel)直接读到缓冲区中,在写入数据时,也是从缓冲区写入到通道。

  缓冲区实质上是一个数组,通常是一个字节数组(ByteBuffer),也可以是其它类型的数组,此外缓冲区还提供了对数据的结构化访问以及维护读写位置等信息。

  Buffer类的继承关系如下图所示:

Java NIO服务器端开发详解

通道Channel

  Channel是一个通道,网络数据通过Channel读取和写入。通道和流的不同之处在于通道是双向的(通道可以用于读、写后者二者同时进行),流只是在一个方向上移动。

  Channel大体上可以分为两类:用于网络读写的SelectableChannel(ServerSocketChannel和SocketChannel就是其子类)、用于文件操作的FileChannel。

  下面的例子给出通过FileChannel来向文件中写入数据、从文件中读取数据,将文件数据拷贝到另一个文件中:

public class NioTest{  public static void main(String[] args) throws IOException  {    copyFile();  }  //拷贝文件  private static void copyFile()  {    FileInputStream in=null;    FileOutputStream out=null;    try    {      in=new FileInputStream("src/main/java/data/in-data.txt");      out=new FileOutputStream("src/main/java/data/out-data.txt");      FileChannel inChannel=in.getChannel();      FileChannel outChannel=out.getChannel();      ByteBuffer buffer=ByteBuffer.allocate(1024);      int bytesRead = inChannel.read(buffer);      while (bytesRead!=-1)      {        buffer.flip();        outChannel.write(buffer);        buffer.clear();        bytesRead = inChannel.read(buffer);      }    }    catch (FileNotFoundException e)    {      // TODO Auto-generated catch block      e.printStackTrace();    } catch (IOException e)    {      // TODO Auto-generated catch block      e.printStackTrace();    }    }  //写文件  private static void writeFileNio()  {    try    {      RandoMaccessFile fout = new RandomAccessFile("src/main/java/data/nio-data.txt", "rw");      FileChannel fc=fout.getChannel();      ByteBuffer buffer=ByteBuffer.allocate(1024);      buffer.put("hi123".getBytes());      buffer.flip();      try      {        fc.write(buffer);      } catch (IOException e)      {        // TODO Auto-generated catch block        e.printStackTrace();      }    }     catch (FileNotFoundException e)    {      // TODO Auto-generated catch block      e.printStackTrace();    }  }  //读文件  private static void readFileNio()  {    FileInputStream fileInputStream;    try    {      fileInputStream = new FileInputStream("src/main/java/data/nio-data.txt");      FileChannel fileChannel=fileInputStream.getChannel();//从 FileInputStream 获取通道      ByteBuffer byteBuffer=ByteBuffer.allocate(1024);//创建缓冲区      int bytesRead=fileChannel.read(byteBuffer);//将数据读到缓冲区      while(bytesRead!=-1)      {                byteBuffer.flip();        //hasRemaining():告知在当前位置和限制之间是否有元素        while (byteBuffer.hasRemaining())        {          System.out.print((char) byteBuffer.get());        }                byteBuffer.clear();        bytesRead = fileChannel.read(byteBuffer);      }    } catch (FileNotFoundException e)    {      // TODO Auto-generated catch block      e.printStackTrace();    } catch (IOException e)    {      // TODO Auto-generated catch block      e.printStackTrace();    }  }}

--结束END--

本文标题: Java NIO服务器端开发详解

本文链接: https://www.lsjlt.com/news/220411.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作