VI . 文件通道 ( FileChannel ) 读取文件 示例代码
1 . 示例需求 : 通过 文件通道 ( FileChannel ) 读取文件中的数据 ;
① 文件通道 ( FileChannel ) 获取 : NIO 中 , 文件通道 ( FileChannel ) 可以从 文件输入流 ( FileInputStream ) 中进行获取 , 其本质是通过文件输入流 , 读取文件中的数据 ;
② 整体流程 : 先通过文件输入流获取文件通道 ( FileChannel ) , 文件通道 ( FileChannel ) 读取文件数据到 字节缓冲区 ( ByteBuffer ) 中 , 从 字节缓冲区 ( ByteBuffer ) 中获取数据 , 将该数据转为字符串打印出来 ;
2 . 代码示例 :
package kim.hsl.nio; import java.io.FileInputStream; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; public class FileChannelDemo2 { public static void main(String[] args) { FileInputStream fis = null; try { //1 . FileChannel 可以从 FileInputStream 中获取 fis = new FileInputStream("file.txt"); //2 . 创建 FileChannel , 从 FileInputStream 中可以获取到 //FileChannel 是抽象类 , 实际类型是 FileChannelImpl FileChannel fc = fis.getChannel(); //3 . FileChannel 需要通过 缓冲区 Buffer 才能与数据进行读写交互 ByteBuffer buffer = ByteBuffer.allocate(32); //4 . 将 字节缓冲区 ByteBuffer 中的数据写入到 文件通道 FileChannel 中 int len = fc.read(buffer); //5 . 将数据从缓冲区中取出 byte[] stringData = new byte[len]; //注意 : ByteBuffer 需要 flip 翻转后才能读取 buffer.flip(); buffer.get(stringData); //6 . byte 数组数据转为字符串并打印出来 String fileString = new String(stringData); System.out.println(fileString); } catch (IOException e) { e.printStackTrace(); } finally { try { if(fis != null) fis.close(); } catch (IOException e) { e.printStackTrace(); } } } }
、
执行结果 :
Hello World
VII . 文件通道 ( FileChannel ) 使用 缓冲区 拷贝文件 示例代码
1 . 示例需求 : 通过 文件通道 ( FileChannel ) 与 字节缓冲区 ( ByteBuffer ) 进行文件拷贝 ;
① 文件通道 ( FileChannel ) 获取 : NIO 中 , 文件通道 ( FileChannel ) 可以从 文件输入流 ( FileInputStream ) 中进行获取 , 也可以从 文件输出流 ( FileOutputStream ) 中获取 , 其本质是通过文件输入流 , 读取文件中的数据 ;
② 整体流程 :
先通过文件输入流获取 输入文件通道 ( FileChannel ) , 通过文件输出流获取 输出文件通道 ( FileChannel ) ;
文件通道 ( FileChannel ) 读取文件数据到 字节缓冲区 ( ByteBuffer ) 中
输入文件通道读取数文件据到缓冲区中 , 输出文件通道写出缓冲区数据到文件中 ;
2 . 代码示例 :
package kim.hsl.nio; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; public class FileChannelDemo3 { public static void main(String[] args) { FileInputStream fis = null; FileOutputStream fos = null; try { //1 . FileChannel 可以从 FileInputStream 中获取 fis = new FileInputStream("file.txt"); fos = new FileOutputStream("file2.txt"); //2 . 创建 FileChannel , 从 FileInputStream / FileOutputStream 中可以获取到 //FileChannel 是抽象类 , 实际类型是 FileChannelImpl FileChannel fcIn = fis.getChannel(); FileChannel fcOut = fos.getChannel(); //3 . FileChannel 需要通过 缓冲区 Buffer 才能 读写文件 ByteBuffer buffer = ByteBuffer.allocate(1024); //4 . 读取 file.txt 文件数据到 字节缓冲区 ByteBuffer , 并写出到 file2.txt 文件中 //循环退出条件 : 如果 文件 读取完毕, read 方法会返回 -1, 代表读取文件完毕 while ( (fcIn.read(buffer)) >= 0 ){ //将 ByteBuffer 中的数据写出 file2.txt 文件中 //翻转后, 将 position 设置成 0, 才能开始写出 buffer.flip(); fcOut.write(buffer); //重置标志位, 供下一次循环使用 buffer.clear(); } } catch (IOException e) { e.printStackTrace(); } finally { try { if(fis != null) fis.close(); if(fos != null) fos.close(); } catch (IOException e) { e.printStackTrace(); } } } }
执行结果 :