李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
07.NIO之FileChannel练习
Leefs
2022-05-27 PM
1359℃
0条
> 将数据写入指定文件 ```java import lombok.extern.slf4j.Slf4j; import java.io.File; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.nio.charset.StandardCharsets; import java.nio.file.StandardOpenOption; /** * Created by lilinchao * Date 2022/5/27 * Description channel Demo */ @Slf4j public class channelDemo01 { public static void main(String[] args) throws IOException { // 获得一个根据指定文件路径的读写权限文件通道 FileChannel fileChannel = FileChannel.open(new File("datas/data.txt").toPath(), StandardOpenOption.WRITE,StandardOpenOption.READ); //获得一段有指定内容的缓冲区 ByteBuffer source = ByteBuffer.wrap("helloWorld,Scala,Java".getBytes(StandardCharsets.UTF_8)); ByteBuffer target = ByteBuffer.allocate(50); log.info("fileChannel.position():{}",fileChannel.position()); //将缓冲区中的内容写入文件通道 fileChannel.write(source); //通道大小 log.info("fileChannel.position():{}", fileChannel.position()); //设置读写位置 fileChannel.position(0); //将通道中的内容写到空缓冲区 fileChannel.read(target); //转换缓冲区读写模式 target.flip(); log.info("target:{}", new String(target.array(), 0, target.limit())); //关闭资源 fileChannel.close(); } } ``` > 数据读写 ```java import lombok.extern.slf4j.Slf4j; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.nio.charset.StandardCharsets; /** * Created by lilinchao * Date 2022/5/27 * Description 数据读写 */ @Slf4j public class channelDemo02 { public static void main(String[] args) throws IOException { //获取输出流 FileOutputStream outputStream = new FileOutputStream("datas/data.txt"); //根据输出流获得一个"写"权限的通道 FileChannel outChannel = outputStream.getChannel(); //获得一个有指定内容的缓冲区 ByteBuffer source = ByteBuffer.wrap("HelloWorld".getBytes(StandardCharsets.UTF_8)); //将缓冲区内容写入到通道 outChannel.write(source); //获取输入流 FileInputStream fileInputStream = new FileInputStream("datas/data.txt"); //根据输入流获得一个"读"权限的通道 FileChannel inChannel = fileInputStream.getChannel(); //获得一个空内容的缓冲区 ByteBuffer target = ByteBuffer.allocate(50); //将通道中的内容读到缓冲区 inChannel.read(target); //转换缓冲区读写模式 target.flip(); //读出缓冲区中的内容 log.info("target:{}", new String(target.array(), 0, target.limit())); //关闭资源 outChannel.close(); inChannel.close(); } } ``` > 超过 2g 大小的文件传输 ```java import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.channels.FileChannel; /** * Created by lilinchao * Date 2022/5/27 * Description 超过 2g 大小的文件传输 */ public class TestFileChannelTransferTo { public static void main(String[] args) { try ( FileChannel from = new FileInputStream("datas/data.txt").getChannel(); FileChannel to = new FileOutputStream("datas/to.txt").getChannel() ) { // 效率高,底层会利用操作系统的零拷贝进行优化 long size = from.size(); // left 变量代表还剩余多少字节 for (long left = size; left > 0; ) { System.out.println("position:" + (size - left) + " left:" + left); left -= from.transferTo((size - left), left, to); } } catch (IOException e) { e.printStackTrace(); } } } ``` > FileChannel Demo 改变子缓冲区内容 ```java import java.io.File; import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.IntBuffer; import java.nio.channels.FileChannel; import java.nio.charset.StandardCharsets; /** * Created by lilinchao * Date 2022/5/27 * Description FileChannel Demo */ public class TestFileChannelDemo { public static void main(String[] args) throws Exception { // testSlice(); // testFileChannel(); // testIntBuffer(); // writeFileChannel(); testFileChannelTransfer(); } /** * 切片:改变缓冲区的内容 */ public static void testSlice() throws Exception { //获取通道 RandomAccessFile accessFile = new RandomAccessFile(new File("datas/data.txt"),"rw"); FileChannel channel = accessFile.getChannel(); //缓冲区 ByteBuffer buffer = ByteBuffer.allocate(9); //将数据读入缓冲区 channel.read(buffer); buffer.position(3); buffer.limit(7); //用于创建一个新的字节缓冲区,其内容是给定缓冲区内容的共享子序列。 ByteBuffer slice = buffer.slice(); //改变子缓冲区内容 for (int i = 0;i
0){ System.out.println(buffer.get()); } } /** * fileChannel读文件 */ public static void testFileChannel() throws Exception { RandomAccessFile accessFile = new RandomAccessFile(new File("datas/data.txt"),"rw"); FileChannel channel = accessFile.getChannel(); //缓冲区 ByteBuffer buffer = ByteBuffer.allocate(1024); //将数据读入缓冲区 //返回的值表示读取到的字节数,如果读到了文件末尾,返回值为 -1 int read = channel.read(buffer); while (read != -1){ System.out.println("file长度:"+read); buffer.flip(); while (buffer.hasRemaining()){ System.out.println((char) buffer.get()); } //切换到写模式,position=0,limit变为capacity buffer.clear(); read = channel.read(buffer); } accessFile.close(); System.out.println("end"); } /** * intBuffer */ public static void testIntBuffer(){ //用于在现有缓冲区旁边分配一个新的int缓冲区 IntBuffer buffer = IntBuffer.allocate(1024); buffer.put(new int[]{1,2,3}); buffer.flip(); while (buffer.hasRemaining()){ System.out.println(buffer.get()); } } /** * fileChannel写文件 */ public static void writeFileChannel() throws Exception { RandomAccessFile rw = new RandomAccessFile("datas/data.txt","rw"); FileChannel channel = rw.getChannel(); ByteBuffer buffer = ByteBuffer.allocate(1024); buffer.put("欢迎来到李林超博客!!!".getBytes(StandardCharsets.UTF_8)); buffer.flip(); while (buffer.hasRemaining()){ channel.write(buffer); } channel.close(); } //fileChannel通道之间传输 public static void testFileChannelTransfer() throws Exception { RandomAccessFile accessFileA = new RandomAccessFile("datas/data.txt","rw"); FileChannel channelFrom = accessFileA.getChannel(); RandomAccessFile accessFileB = new RandomAccessFile("datas/dataB.txt","rw"); FileChannel channelTo = accessFileB.getChannel(); //from 的内容传输到 channelTo channelTo.transferFrom(channelFrom,0,channelFrom.size()); accessFileA.close(); accessFileB.close(); } } ``` *附参考文章链接:* *https://blog.csdn.net/qq_38745846/article/details/120786800* *https://juejin.cn/post/7030802468552474637*
标签:
Netty
,
NIO
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/2092.html
上一篇
06.NIO之FileChannel介绍
下一篇
08.NIO之Path介绍
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
RSA加解密
SpringCloud
ajax
数据结构
持有对象
LeetCode刷题
ClickHouse
Jenkins
高并发
递归
pytorch
DataWarehouse
Thymeleaf
SQL练习题
Tomcat
稀疏数组
机器学习
Python
FastDFS
DataX
Stream流
Eclipse
并发编程
CentOS
链表
nginx
BurpSuite
JVM
Ubuntu
Scala
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭