缓冲区

缓冲区其实是一个用来存储基本数据类型的一个容器, 类似于一个数组。
缓冲区, 可以按照存储的数据类型不同, 将缓冲区分为:
ByteBuffffer、 ShortBuffffer、IntBuffffer、LongBuffffer、FloatBuffffer、DoubleBuffffer、
CharBuffffer
但是, 要注意, 并没有BooleanBuffffer
capacity: 容量。 代表一个缓冲区的最大的容量, 缓冲区一旦开辟完成, 将无法修改。
limit: 限制。 表示缓冲区中有多少数据可以操作。
position: 位置。 表示当前要操作缓冲区中的哪一个下标的数据。
mark: 标记。 在缓冲区中设计一个标记, 配合 reset() 方法使用, 修改position的值。
mark <= position <= limit <= capacity
public class Demo2 { public static void main(String[] args) { /** 在创建buffer对象的时候传递的参数就是capacity * 容量为1024的缓冲区 * 此时buffer的limit和capacity都为1024 * 此时的position是0 */ ByteBuffer buffer = ByteBuffer.allocate(1024);//开辟容量1024字节System.out.println("position:"+buffer.position());//0System.out.println("limit:"+buffer.limit());//1024 /** position是5,说明写入了5个字节,position指向的是当前内容的结尾,方便接 着往下写 */buffer.put("hello".getBytes()); System.out.println(buffer.position());//5System.out.println(buffer.limit());//1024//可以继续写buffer.put("world".getBytes());System.out.println(buffer.position());//10//切换为读模式/*这一步很重要 flip可以理解为模式切换 之前的代码实现的是写入操作*当调用这个方法后就变成读取操作,那么position和limit的值就要发生变换*此时capacity为1024不变*此时limit就移动到原来position所在的位置,相当于把buffer中没有数据的空 间*"封印起来"从而避免读取Buffer数据的时候读到null值*相当于 limit = position limit = 10*此时position的值相当于 position = 0* */buffer.flip();System.out.println("3:"+buffer.position());//0         System.out.println("3:"+buffer.limit());//10//获取单个字节//buffer.get();//获取多个字节byte[] data=new byte[buffer.limit()];buffer.get(data);System.out.println("data:"+new String(data));System.out.println("读取data后:"+buffer.position());//从0变成了 10,position相当于读字节的指针,内容读完了指到了结尾System.out.println("读取data后:"+buffer.limit());//将position设回0,所以你可以重读Buffer中的所有数据。limit保持不变,仍 然表示能从Buffer中读取多少个元素// buffer.rewind();// byte[] data1=new byte[buffer.limit()];// buffer.get(data1);// System.out.println(new String(data1));// System.out.println(buffer.position());//从0变成了10,position相当于读 字节的指针,内容读完了指到了结尾// System.out.println(buffer.limit());/** clear():* API中的意思是清空缓冲区,但是实际是没有删除缓冲区数据的 * 而是将缓冲区中limit和position恢复到初始状态 * 即limit和capacity都为1024 position是0 * 此时可以完成写入模式 */ // buffer.clear();   // System.out.println("clear后:"+buffer.position()); // System.out.println("clear后:"+buffer.limit()); //可以继续写 // buffer.put("temp".getBytes()); //继续读 // buffer.flip(); // byte[] arr = new byte[buffer.limit()]; // buffer.get(arr); // System.out.println("temp:"+new String(arr)); }
}

通道

通道Channel, 就是文件和程序之间的连接。 在NIO中, 数据的传递, 是由缓冲区实现的,
通道本身并不负责数据的传递。
1. 可以使用支持通道的类, getChannel()方法获取通道。
1. 本地文件: FileInputStream、FileOutputStream
2. 网络文件: Socket、ServerSocket、DatagramSocket
2. 在NIO.2中, 使用FileChannel.open()方法打开通道。
3. 在NIO.2中, 使用Files工具类newXXX()方法打开通道。
使用FileChannel读写数据
在使用FileChannel之前,必须先打开它。但是,我们无法直接打开一个FileChannel,需要
通过使用一个InputStream、OutputStream的getChannel()方法来返回对应的Channel

写数据

public class Demo3 { public static void main(String[] args) throws IOException { /** 写入文本文件 */ //创建文件写出流 FileOutputStream fileOutputStream = new FileOutputStream("temp1.txt"); //获取通道 FileChannel fileChannel = fileOutputStream.getChannel(); //创建缓冲流 ByteBuffer buffer = ByteBuffer.allocate(1024); //向缓冲流中放入数据 buffer.put("helloworld".getBytes()); //转换模式为读取内容 buffer.flip(); //利用通道写入 fileChannel.write(buffer); //关闭资源fileChannel.close(); fileOutputStream.close();System.out.println("写入完毕");}
}

读数据

public class Demo4 {public static void main(String[] args) throws IOException {/** 文件读取*///创建文件输入流FileInputStream fileInputStream = new FileInputStream("temp1.txt");//获取通道FileChannel fileChannel = fileInputStream.getChannel();//创建缓冲流对象ByteBuffer buffer = ByteBuffer.allocate(1024);//利用通道读取内容int num = fileChannel.read(buffer);System.out.println(num);//转换模式为读取模式buffer.flip();//利用缓冲流读取数据到控制台System.out.println(new String(buffer.array(),0,num));//关闭资源fileChannel.close();fileInputStream.close();System.out.println("读完了"); }
}

分散聚合

将文件中的数据分散的写入到多个缓冲区, 这些缓冲区按照一定的顺序进行数据的写入。 在
读取的时候, 也按照相同的顺序进行数据的读操作。
public class Program2 {public static void main(String[] args) {try (FileChannel srcChannel = FileChannel.open(Paths.get("file\\day28\\src\\src"), StandardOpenOption.READ);FileChannel dstChannel = FileChannel.open(Paths.get("file\\day28\\src\\target"), StandardOpenOption.WRITE, StandardOpenOption.APPEND, StandardOpenOption.CREATE)) { // 做多个缓冲区,存入一个数组中ByteBuffer[] buffers = new ByteBuffer[4]; for (int i = 0; i < buffers.length; i++) { buffers[i] = ByteBuffer.allocate(128);}while (srcChannel.read(buffers) != -1) {// 从源文件读取数据for (ByteBuffer buffer : buffers) { buffer.flip();}dstChannel.write(buffers);// 重置状态for (ByteBuffer buffer : buffers) {buffer.clear();} }} catch (IOException e) { e.printStackTrace(); } }
}

Files

public class FilesUsage { public static void main(String[] args) throws IOException { // 1. 创建一级文件夹(如果这个文件夹存在,会抛异常) // Files.createDirectory(Paths.get("C:\\Users\\luds\\Desktop\\abc"));// 2. 创建多级文件夹(如果需要创建的文件夹存在,不会抛出异常) // Files.createDirectories(Paths.get("C:\\Users\\luds\\Desktop\\abc\\a\\b\\c") ); // 3. 创建一个文件(如果这个文件已存在,重复创建会异常) // Files.createFile(Paths.get("C:\\Users\\luds\\Desktop\\abc\\file")); // 4. 删除一个文件或者空文件夹(如果要删除的文件或空文件夹不存在,会抛异 常;如果删除的不是一个空文件夹也会抛异常) // Files.delete(Paths.get("C:\\Users\\luds\\Desktop\\abc\\file")); // 5. 删除一个文件或者空文件夹(如果删除失败,不会抛异常,返回false) // Files.deleteIfExists(Paths.get("C:\\Users\\luds\\Desktop\\abc\\file")); // 6. 移动文件(重命名) // Files.move(Paths.get("file\\day28\\source"), Paths.get("file\\day28\\dst\\source")); // 7. 拷贝文件 Files.copy(Paths.get("file\\day28\\dst\\source"), Paths.get("file\\day28\\source")); }
}

NIO2
public class Demo7 { public static void main(String[] args) throws IOException { //Path就是用来替代File //构建Path对象的两种方式 //传一个路径 Path path1 = Paths.get("D:\\123"); //第一个参数是盘符 ,第二个参数是可变参数 下面有多少文件路径就写多少 Path path2 = Paths.get("D:\\", "123","456.txt"); //Path是结合Files工具类使用的 //创建目录 Files.createDirectories(path1); //判断文件是否存在 if(!Files.exists(path2)) { //创建文件 Files.createFile(path2); }//复制文件 //第一个参数原文件路径, 第二个参数目标文件路径 // Files.copy(new FileInputStream(new File("D:\\123\\456.txt")), Paths.get("D:\\", "123","222.txt")); // Files.copy(path2, new FileOutputStream(new File("D:\\123\\789.txt"))); // Files.copy(path2, Paths.get("D:\\", "123","111.txt")); //一次读取文件中所有的行 List<String> readAllLines = Files.readAllLines(Paths.get("src/com/qiangfeng/test/Demo1.java")); for (String str : readAllLines) { System.out.println("haha:"+str); }//将集合中的内容写入到文件中 Files.write(Paths.get("D:\\", "123","Demo.java"), readAllLines); /*static BufferedReader newBufferedReader(Path path) 打开一个文件进行读取,返回一个 BufferedReader以有效方式从文件中读取文 本。 static BufferedReader newBufferedReader(Path path, Charset cs) 打开一个文件进行读取,返回一个 BufferedReader可以用来有效方式从文件中读 取文本。 static BufferedWriter newBufferedWriter(Path path, Charset cs, OpenOption... options) 打开或创建一个文件写入,返回一个 BufferedWriter,可以有效的方式将文件写 入文本。 static BufferedWriter newBufferedWriter(Path path, OpenOption... options)打开或创建一个文件写入,返回一个 BufferedWriter能够以有效的方式的文件写 入文本。 直接创建缓冲流对象 可以执行 字符集 和访问权限 */ }
}

缓冲区、通道、Files、NIO2相关推荐

  1. 【Netty】NIO 选择器 ( Selector ) 通道 ( Channel ) 缓冲区 ( Buffer ) 网络通信案例

    文章目录 I . NIO 通信 服务器端 流程说明 II . NIO 通信 服务器端代码 III . NIO 通信 客户端 流程说明 IV . NIO 通信 客户端代码 V . NIO 通信 示例运行 ...

  2. Go 语言编程 — 并发 — Channel 通道

    目录 文章目录 目录 Channel 通道缓冲区 遍历通道与关闭通道 Channel channel(通道)是用来传递数据的一个数据结构. 通道可用于两个 goroutine 之间通过传递一个指定类型 ...

  3. Go学习笔记—Channel通道

    Go并发通信--Channel ​ Go语言的并发模型是CSP(Communicating Sequential Processes),提倡通过通信共享内存而不是通过共享内存而实现通信.(DO NOT ...

  4. Golang通道(chan,协程交互数据)

    通道(channel)是用来传递数据的一个数据结构. 通道可用于两个 goroutine 之间通过传递一个指定类型的值来同步运行和通讯.操作符 <- 用于指定通道的方向,发送或接收.如果未指定方 ...

  5. 高速串行总线设计基础(七)揭秘SERDES高速面纱之时钟校正与通道绑定技术

    文章目录 前言 时钟校正 接收和发送缓冲区 通道绑定 参考文献 前言 上篇文章讲了高速串行总线中的数据包核参考时钟的相关内容,见:高速串行总线设计基础(六)揭秘SERDES高速面纱之数据包与参考时钟要 ...

  6. Channel 通道详解

    目录 一.通道介绍 1.声明通道 2.创建通道 二.channel操作 1.发送 2.接收 3.关闭 三.无缓冲通道 四.有缓冲的通道 五.循环读取信道 六.关闭通道 七.单向通道 一.通道介绍 单纯 ...

  7. golang中Channel通道(二)

    golang中Channel通道(二) 一.带缓冲和不带缓冲的通道的区别 1.非缓冲通道 一次发送操作对应一次接收操作,对于一个goroutine来讲,它的一次发送,在另一个goroutine接收之前 ...

  8. go 通道(channel),go 线程间通信

    go 通道(channel)是用来传递数据的一个数据结构. 通道可用于两个 goroutine 之间通过传递一个指定类型的值来同步运行和通讯.操作符 <- 用于指定通道的方向,发送或接收. pa ...

  9. golang学习笔记(进阶篇)

    四.Golang进阶部分(并发) 并发编程在当前软件领域是一个非常重要的概念,随着CPU等硬件的发展,我们无一例外的想让我们的程序运行的快一点.再快一点.Go语言在语言层面天生支持并发,充分利用现代C ...

  10. Java NIO 之Channel

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

最新文章

  1. Qt 【widget如何铺满窗口】
  2. 严正声明:微信上假冒“科研星球”公众号,请勿关注
  3. IOS之SplitViewController的使用
  4. mysql数据库的总结
  5. http header 设置编码_【译】http.client
  6. 2017年预测:突破性创意工作站、物联网
  7. X86 CPU特性之(3)-kaiser
  8. Kendo Web UI Grid里时间格式转换
  9. Dxperience 7.3.4 简体中文本地化
  10. 云计算项目实战——系统API模块
  11. 2021-06-0贪吃蛇练习
  12. 解压文件--linux
  13. java简历自我评价_java程序员简历自我评价怎么写
  14. 内存条带宽的换算方法以及DDR4内存理论带宽
  15. 一键加速,华为云CDN加速满足多行业需要
  16. Python模块之Pandas模块学习笔记
  17. x265-1.8版本-common/wavefront.h注释
  18. 计算机考研360能去哪里,考研360分是什么水平
  19. 网络(Network)
  20. 组合数C(n,m)的四种计算方法

热门文章

  1. 如何在3dmax中断开当前选中的链接
  2. supervisor 提示:xxx: ERROR (no such process)
  3. 电子签章过程中的原始数据处理
  4. 带着老娘和女儿看《孔子》
  5. Titan漫谈(一)
  6. 台积电偷笑:就算Intel技术牛我也要赶超你
  7. 2019-2020 ICPC Asia Hong Kong Regional Contest
  8. 《笼中鸟——精神病人的生存现状》观后的一点思考
  9. dart sqlite 嵌入式数据库 sqflite教程
  10. Mqtt ----心跳机制 长链接 ping