java文件读取 while ((len = reader.read(buffer)) != -1){}的理解

简介: 本文解释了Java中使用`InputStreamReader`和`read(buffer)`方法循环读取文件内容的机制,强调了如何正确理解读取循环和处理读取到的数据,以及如何处理字符编码和换行符。

源文件

InputStreamReader reader=new InputStreamReader(new FileInputStream(file),"UTF-8");
                            //读入缓冲区
                         char[] buffer = new char[1024];
                            //读入结果
                         StringBuffer result = new StringBuffer();
                            //每次读入缓冲区的长度
                         int len;
                            //从读入流中读取文件内容并形成结果
                         while ((len = reader.read(buffer)) != -1) {
                              result.append(buffer, 0, len);
                            }

.read(buffer)的意思就是一次性读取1024个数据,返回值是一个int,就是返回的是读取的指针的下标,当指针为-1时,就代表读取完成。

每次读取时,指针都会往下移1024个数据。

接下来就是拼接字符串,如果你是字节型的数据的话,就调用new String(byte [])这个方法来转化,将字节转化为字符。

这里面还有一个问题就是如果你使用字符读取流读取中文乱码的话,就要使用

InputStreamReader这个类来转换一下编码格式。.read(buffer)就是将文件数据一次性读取1024读取到buffer中,然后继续while循环,直到读到文件末尾。用Stringbuffer在while循环中不断的拼接,最后循环结束在一次性输出去。

不要使用

println,因为这就意味着,每次输出就换行,即使在循环结束后再使用println,它还是会输出完再换一行,如果在while循环里面,就意味着每1024个数据就要换行。

文件里面的格式和java读取到的格式是一样的,所以不要管文件本身的格式。比如说:

asdas
sakdba
asdbsaklfna
a

这些文件里面的换行根本就不需要考虑。

如果是输出流,注意每次都要flush,清空“管道”

如果是缓存流,它循环一次,一次读取一行,并且不带换行的,那种才需要带println的

目录
相关文章
|
1月前
|
Java
让星星⭐月亮告诉你,Java NIO之Buffer详解 属性capacity/position/limit/mark 方法put(X)/get()/flip()/compact()/clear()
这段代码演示了Java NIO中`ByteBuffer`的基本操作,包括分配、写入、翻转、读取、压缩和清空缓冲区。通过示例展示了`position`、`limit`和`mark`属性的变化过程,帮助理解缓冲区的工作原理。
30 2
|
6月前
|
Java 索引
📌 Java NIO Buffer
Java NIO缓冲区在与NIO通道交互时使用。数据从通道读取到缓冲区,然后从缓冲区写入通道。 缓冲区本质上是一块内存,可以在其中写入数据,然后再进行读取。这个内存块被封装在一个NIOBuffer对象中,该对象提供了一组方法,可以更容易地使用内存块。
|
存储 网络协议 Java
Netty入门到超神系列-Java NIO 三大核心(selector,channel,buffer)
选择器,也叫多路复用器,Java的NIO通过selector实现一个线程处理多个客户端链接,多个channel可以注册到同一个Selector,Selector能够监测到channel上是否有读/写事件发生,从而获取事件和对事件进行处理,所以Selector切到哪个channel是由事件决定的。当线程从某个客户端通道未读取到数据时,可以把空闲时间用来做其他任务,性能得到了提升。
154 0
|
弹性计算 Java API
Netty入门到超神系列-Java NIO 三大核心(selector,channel,buffer)
理解Selector 和 Channel Selector 选择器,也叫多路复用器,可以同时处理多个客户端连接,多路复用器采用轮询机制来选择有读写事件的客户端链接进行处理。 通过 Selector ,一个 I/O 线程可以并发处理 N 个客户端连接和读写操作,这解决了传统同步阻塞 I/O 一连接一线程模型,架构的性能、弹性伸缩能力和可靠性都得到了极大的提升。 由于它的读写操作都是非阻塞的,这就可以充分提升 IO 线程的运行效率,避免由于频繁 I/O 阻塞导致的线程挂起。
253 0
|
Java
快速使用Graphviz实现简单的图论绘制【java辅助文件读取】
快速使用Graphviz实现简单的图论绘制【java辅助文件读取】
122 0
Java:文件io流继承体系文件读取文件写入
Java:文件io流继承体系文件读取文件写入
Java面试:请手写一个文件读取的方法
Java面试:请手写一个文件读取的方法
261 0
|
存储 JSON JavaScript
如何使用 Java 将 JSON 文件读取为字符串?这三种方法很管用!
如何使用 Java 将 JSON 文件读取为字符串?这三种方法很管用!
270 0
|
Java Spring
Java: SpringBoot配置文件读取-数组
Java: SpringBoot配置文件读取-数组
461 0