一、实例1-写入本地文件

实例要求:

  1. 使用前面学习后的 ByteBuffer(缓冲)和 FileChannel(通道),将 “hello,尚硅谷” 写入到 file01.txt 中
  2. 文件不存在就创建

【netty】02|nio通道实例 - 图1

  1. package com.xiaomeng.netty.learnnetty;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. import java.nio.ByteBuffer;
  5. import java.nio.channels.FileChannel;
  6. /**
  7. * nio通道实例01
  8. * func:利用buffer和channel,将字符串“nio实例01”写入到文件file01.txt中
  9. * @author wmn
  10. * @date 2021-12-11
  11. */
  12. public class NioFileChannel01 {
  13. public static void main(String[] args) throws IOException {
  14. //要写入的字符串
  15. String str = "nio实例01";
  16. //创建一个输出流 -> channel
  17. FileOutputStream fileOutputStream = new FileOutputStream("d:\\file01.txt");
  18. //通过 fileOutputStream 获取对应的 FileChannel
  19. //这个 fileChannel 真实类型是 FileChannelImpl
  20. FileChannel fileChannel = fileOutputStream.getChannel();
  21. //创建一个缓冲区 ByteBuffer
  22. ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
  23. //将 str 放入 byteBuffer
  24. byteBuffer.put(str.getBytes());
  25. byteBuffer.flip();
  26. fileChannel.write(byteBuffer);
  27. fileOutputStream.close();
  28. }
  29. }

测试
image.png

二、实例2-从文件读取到控制台

实例要求:

  1. 使用前面学习后的 ByteBuffer(缓冲)和 FileChannel(通道),将 file01.txt 中的数据读入到程序,并显示在控制台屏幕
  2. 假定文件已经存在

【netty】02|nio通道实例 - 图3

  1. package com.xiaomeng.netty.learnnetty.nio.fileChannel;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.IOException;
  5. import java.nio.ByteBuffer;
  6. import java.nio.channels.FileChannel;
  7. /**
  8. * nio通道实例02
  9. * 1. 使用前面学习后的 ByteBuffer(缓冲)和 FileChannel(通道),将 file01.txt 中的数据读入到程序,并显示在控制台屏幕
  10. * 2. 假定文件已经存在
  11. * @author wmn
  12. * @date 2021-12-11
  13. */
  14. public class NioFileChannel02 {
  15. public static void main(String[] args) throws IOException {
  16. //创建文件的输入流
  17. File file = new File("d:\\file01.txt");
  18. FileInputStream fileInputStream = new FileInputStream(file);
  19. //通过 fileInputStream 获取对应的 FileChannel -> 实际类型 FileChannelImpl
  20. FileChannel fileChannel = fileInputStream.getChannel();
  21. //创建缓冲区
  22. ByteBuffer byteBuffer = ByteBuffer.allocate((int)file.length());
  23. //将通道的数据读入到 Buffer
  24. fileChannel.read(byteBuffer);
  25. //将 byteBuffer 的字节数据转成 String
  26. System.out.println(new String(byteBuffer.array()));
  27. fileInputStream.close();
  28. }
  29. }

三、实例3-使用一个buffer完成文件拷贝

实例要求:

  1. 使用 FileChannel(通道)和方法 read、write,完成文件的拷贝
  2. 拷贝一个文本文件 1.txt,新文件2.txt

image.png

  1. package com.xiaomeng.netty.learnnetty.nio.fileChannel;
  2. import java.io.*;
  3. import java.nio.ByteBuffer;
  4. import java.nio.channels.FileChannel;
  5. /**
  6. * nio通道实例03
  7. * 使用 FileChannel(通道)和方法 read、write,完成文件的拷贝
  8. * 拷贝一个文本文件 file01.txt
  9. * @author wmn
  10. * @date 2021-12-11
  11. */
  12. public class NioFileChannel03 {
  13. public static void main(String[] args) throws IOException {
  14. File file1 = new File("d:\\file01.txt");
  15. File file2 = new File("d:\\file02.txt");
  16. //创建file01输入流,读出文件
  17. FileInputStream file1Input = new FileInputStream(file1);
  18. //创建file02输出流,写入文件
  19. FileOutputStream file2Output = new FileOutputStream(file2);
  20. //获取file01的通道
  21. FileChannel file1Channel = file1Input.getChannel();
  22. //创建一个缓冲区
  23. ByteBuffer byteBuffer = ByteBuffer.allocate((int)file1.length());
  24. //将file01文件内容从通道读出来,放到缓冲区
  25. file1Channel.read(byteBuffer);
  26. byteBuffer.flip();
  27. //获取file02的通道
  28. FileChannel file2Channel = file2Output.getChannel();
  29. //将缓冲区的内容,通过通道写入文件
  30. file2Channel.write(byteBuffer);
  31. //关闭流
  32. file1Input.close();
  33. file2Output.close();
  34. }
  35. }

四、实例4-使用transform完成文件拷贝

  1. 实例要求:
  2. 使用 FileChannel(通道)和方法 transferFrom,完成文件的拷贝
  3. 拷贝一张图片 ```java package com.xiaomeng.netty.learnnetty.nio.fileChannel;

import java.io.FileInputStream; import java.io.FileOutputStream; import java.nio.channels.FileChannel;

/**

  • nio通道实例03
  • 使用 FileChannel(通道)和方法 transferFrom,完成文件的拷贝
  • 拷贝一张图片
  • @author wmn
  • @date 2021-12-11 */ public class NioFileChannel04 {

    public static void main(String[] args) throws Exception {

    1. //创建相关流
    2. FileInputStream fileInputStream = new FileInputStream("d:\\a.jpg");
    3. FileOutputStream fileOutputStream = new FileOutputStream("d:\\a2.jpg");
    4. //获取各个流对应的 FileChannel
    5. FileChannel sourceCh = fileInputStream.getChannel();
    6. FileChannel destCh = fileOutputStream.getChannel();
    7. //使用 transferForm 完成拷贝
    8. destCh.transferFrom(sourceCh, 0, sourceCh.size());
    9. //关闭相关通道和流
    10. sourceCh.close();
    11. destCh.close();
    12. fileInputStream.close();
    13. fileOutputStream.close();

    } }

```

总结

FileChannel 主要用来对本地文件进行 IO 操作,常见的方法有

  • public int read(ByteBuffer dst),从通道读取数据并放到缓冲区中
  • public int write(ByteBuffer src),把缓冲区的数据写到通道中
  • public long transferFrom(ReadableByteChannel src, long position, long count),从目标通道中复制数据到当前通道
  • public long transferTo(long position, long count, WritableByteChannel target),把数据从当前通道复制给目标通道