java nio channel

淩亂°似流年 2023-10-17 08:21 248阅读 0赞

Java NIO 通道类似于流,但又有一下不同:

1、既可以从通道中读取数据,也可以写数据到通道中。java .io 中的流是单向性。

2、通道数据读取可以异步。

3、通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。

总结:从通道中读取数据到Buffer缓存中,从Buffer缓存中写入数据到通道中。如下截图所示:

Center

Java NIO 通道详解:

1、FileChannel:文件中读写数据

2、DatagramChannel:通过UDP 读写网络数据

3、SocketChannel:通过TCP 读写网络数据

4、ServerSocketChannel:监听新进来的TCP 连接,像Web 服务器那样。对每一个新进来的连接都会创建一个socketchannel.

示列一:文件拷贝功能(基于FileChannel)

  1. package com.nio.filechannel;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;
  7. import java.nio.ByteBuffer;
  8. import java.nio.channels.FileChannel;
  9. public class CopyFile {
  10. public static boolean copy(String in,String out){
  11. boolean target = false;
  12. try {
  13. //文件输入流
  14. FileInputStream inStream = new FileInputStream(new File(in));
  15. //文件输出流
  16. FileOutputStream outStream = new FileOutputStream(new File(out));
  17. //文件输入通道
  18. FileChannel inChannel =inStream.getChannel();
  19. //文件输出通道
  20. FileChannel outChannel=outStream.getChannel();
  21. //文件缓存大小1024字节
  22. ByteBuffer buffer = ByteBuffer.allocate(1024);
  23. while(true){
  24. //clear方法重置缓存区,接收读入数据
  25. buffer.clear();
  26. //从输入通道将数据读到缓存区
  27. int result = inChannel.read(buffer);
  28. //判断该输入通道是否读取输入流完毕,如果为-1,表示数据流已经读取完毕,应该终止whil 循环
  29. if(result == -1){
  30. target = true;
  31. break;
  32. }
  33. //数据模式切换(读取模式--------输出模式)
  34. buffer.flip();
  35. //从输出通道将数据写到缓存区
  36. outChannel.write(buffer);
  37. }
  38. } catch (FileNotFoundException e) {
  39. // TODO Auto-generated catch block
  40. System.out.println("指定文件名称不存在");
  41. e.printStackTrace();
  42. } catch (IOException e) {
  43. // TODO Auto-generated catch block
  44. System.out.println("IO 异常");
  45. e.printStackTrace();
  46. }
  47. return target;
  48. }
  49. public static void main(String[] args){
  50. boolean target = copy("D:\\eula.1028.txt","D:\\a.txt");
  51. if(target){
  52. System.out.println("文件copy 成功");
  53. }else{
  54. System.out.println("文件copy 失败");
  55. }
  56. }
  57. }

示列二:UDP数据发送功能(基于DatagramChannel)

  1. package com.nio.channel;
  2. import java.io.IOException;
  3. import java.net.InetSocketAddress;
  4. import java.nio.ByteBuffer;
  5. import java.nio.channels.DatagramChannel;
  6. import java.nio.charset.Charset;
  7. public class UDPServer {
  8. public static void main(String[] args) {
  9. try {
  10. // 打开数据包通道
  11. DatagramChannel channel = DatagramChannel.open();
  12. // 获取与此通道关联的数据报套接字
  13. channel.socket().bind(new InetSocketAddress(8888));
  14. // 分配一个新的字节缓冲区。
  15. ByteBuffer buffer = ByteBuffer.allocate(1024);
  16. // 判断数据包通道中是否存在数据
  17. while (channel.receive(buffer) == null) {
  18. try {
  19. Thread.sleep(2000);
  20. } catch (InterruptedException e) {
  21. e.printStackTrace();
  22. }
  23. }
  24. //反转此缓冲区(写模式---读模式)
  25. buffer.flip();
  26. //接受字符
  27. String recStr =Charset.forName("UTF-8").newDecoder().decode(buffer).toString();
  28. System.out.println(recStr);
  29. channel.close();
  30. } catch (IOException e) {
  31. // TODO Auto-generated catch block
  32. e.printStackTrace();
  33. }
  34. }
  35. }
  36. package com.nio.channel;
  37. import java.io.IOException;
  38. import java.net.InetSocketAddress;
  39. import java.nio.ByteBuffer;
  40. import java.nio.channels.DatagramChannel;
  41. public class UDPClient {
  42. public static void main(String[] args) {
  43. // TODO Auto-generated method stub
  44. try {// 打开数据包通道
  45. DatagramChannel channel = DatagramChannel.open();
  46. // 将 byte 数组写入缓冲区中
  47. ByteBuffer buffer = ByteBuffer.wrap("左青龙右白虎,南朱雀北玄武".getBytes("UTF-8"));
  48. // 绑定与服务UDP通道关联的数据报套接字
  49. channel.send(buffer, new InetSocketAddress("127.0.0.1", 8888));
  50. channel.close();
  51. } catch (IOException e) {
  52. e.printStackTrace();
  53. }
  54. }
  55. }

发表评论

表情:
评论列表 (有 0 条评论,248人围观)

还没有评论,来说两句吧...

相关阅读

    相关 java nio channel

    Java NIO 通道类似于流,但又有一下不同: 1、既可以从通道中读取数据,也可以写数据到通道中。java .io 中的流是单向性。 2、通道数据读取可以异步。 3、通

    相关 Java NIOChannel

    定义 用于源节点和目标节点之间的连接。nio中负责缓冲区中数据传输,Channel本地并不存储数据,而是配合缓冲区进行数据传输。你可以把它理解成io中的流。 结