while 循环中使用的 BufferedReader readLine
BufferedReader readLine used in while loop
我看到 BufferedReader 使用 while 循环遍历文件的内容,代码大致如下:
try {
FileReader fr = new FileReader(file);
Buffered Reader br = new BufferedReader(fr);
String line;
while ( (line = br.readLine()) != null ) {
// do something
}
} catch () {}
我不明白的是 while 循环如何在内部递增其计数器,直到它读取了文档中的所有行。对我来说,上面的 while 循环意味着 "if the first line (line[0]) is not null, do something (presumably an infinite number of times)",并且永远不会超过文档的第一行。我对 BufferedReader 或 .readLine() 方法有什么不了解?
以下 while 循环的大括号内的行:
while ( (line = br.readLine()) != null )
是
(line = br.readLine()) != null
并且方法 readLine()
将继续从文件中读取下一行,一旦到达文件末尾,它 returns null
。所以它是这样工作的。
附带说明一下,while 循环的计数器没有限制,它只需要一个计算结果为 true 或 false 的布尔表达式。
检查代码
while ( (line = br.readLine()) != null ) {
// do something
}
首先将 line
分配给任何 br.readLine() returns,然后将 line
与 null 进行比较。括号强制执行该操作顺序。
随着程序循环遍历文件中的所有行,变量line
将继续取下一行文本的值,直到到达文件末尾。此时 line
被赋值 null,然后终止循环。
what I don't understand is how the while loop is internally incrementing its counter
此循环没有计数器。循环终止条件是line == null
(另一种说法是一直循环whileline != null
)。当 line
为空时循环结束。
To me, the while loop above means "if the first line (line[0]) is not null
不,行不是数组。它是一个字符串,表示文件的一行,并且随着从文件中读取每一行而更新该值。
.NET 中有一个 different method
string[] allLines = File.ReadAllLines(path);
这种不同的方法是一次将文件的所有行读入内存。该方法对于读取小文件很方便,而您提供的方法内存效率更高。它流文件的内容,只为当前行分配内存。这种方法对于大文件来说要好得多。
请注意,缓冲 reader 在循环语义中没有任何作用。 它只是一种更有效地从磁盘读取文件的机制(或 perhaps unnecessary overhead).
首先,有必要了解一下Filereader和Buffered的区别Reader。
Buffered Reader 从字符输入流中读取文本,缓冲字符以便有效地读取字符、数组和行。
而 FileReader 读取一行 text.A 行被认为由一个换行符或 return 终止。
请记住,当文件中的第一行不是 empty.Even 时,While 将执行,如果那里有一个点,它会读取它。
希望它现在有所帮助。 :)
在下面评论以获取更多详细信息。
祝你有个愉快的一天。
希望我能正确回答您的问题。您想知道 BufferedReader 如何在没有计数变量的情况下确定在循环中的何处继续读取?
如果您查看 BufferedReader.class
内部,您会看到一个 private int pos;
计数器,每次从流中读取一个字符时该计数器都会递增,例如在 public int read()
。 readLine()
中也发生了同样的情况,不同之处在于 pos
递增直到到达行尾。
您可以使用reset()
功能重置内部计数器(这是到最后一个标记位置,详见here)。
我看到 BufferedReader 使用 while 循环遍历文件的内容,代码大致如下:
try {
FileReader fr = new FileReader(file);
Buffered Reader br = new BufferedReader(fr);
String line;
while ( (line = br.readLine()) != null ) {
// do something
}
} catch () {}
我不明白的是 while 循环如何在内部递增其计数器,直到它读取了文档中的所有行。对我来说,上面的 while 循环意味着 "if the first line (line[0]) is not null, do something (presumably an infinite number of times)",并且永远不会超过文档的第一行。我对 BufferedReader 或 .readLine() 方法有什么不了解?
以下 while 循环的大括号内的行:
while ( (line = br.readLine()) != null )
是
(line = br.readLine()) != null
并且方法 readLine()
将继续从文件中读取下一行,一旦到达文件末尾,它 returns null
。所以它是这样工作的。
附带说明一下,while 循环的计数器没有限制,它只需要一个计算结果为 true 或 false 的布尔表达式。
检查代码
while ( (line = br.readLine()) != null ) {
// do something
}
首先将 line
分配给任何 br.readLine() returns,然后将 line
与 null 进行比较。括号强制执行该操作顺序。
随着程序循环遍历文件中的所有行,变量line
将继续取下一行文本的值,直到到达文件末尾。此时 line
被赋值 null,然后终止循环。
what I don't understand is how the while loop is internally incrementing its counter
此循环没有计数器。循环终止条件是line == null
(另一种说法是一直循环whileline != null
)。当 line
为空时循环结束。
To me, the while loop above means "if the first line (line[0]) is not null
不,行不是数组。它是一个字符串,表示文件的一行,并且随着从文件中读取每一行而更新该值。
.NET 中有一个 different method
string[] allLines = File.ReadAllLines(path);
这种不同的方法是一次将文件的所有行读入内存。该方法对于读取小文件很方便,而您提供的方法内存效率更高。它流文件的内容,只为当前行分配内存。这种方法对于大文件来说要好得多。
请注意,缓冲 reader 在循环语义中没有任何作用。 它只是一种更有效地从磁盘读取文件的机制(或 perhaps unnecessary overhead).
首先,有必要了解一下Filereader和Buffered的区别Reader。 Buffered Reader 从字符输入流中读取文本,缓冲字符以便有效地读取字符、数组和行。 而 FileReader 读取一行 text.A 行被认为由一个换行符或 return 终止。 请记住,当文件中的第一行不是 empty.Even 时,While 将执行,如果那里有一个点,它会读取它。 希望它现在有所帮助。 :) 在下面评论以获取更多详细信息。 祝你有个愉快的一天。
希望我能正确回答您的问题。您想知道 BufferedReader 如何在没有计数变量的情况下确定在循环中的何处继续读取?
如果您查看 BufferedReader.class
内部,您会看到一个 private int pos;
计数器,每次从流中读取一个字符时该计数器都会递增,例如在 public int read()
。 readLine()
中也发生了同样的情况,不同之处在于 pos
递增直到到达行尾。
您可以使用reset()
功能重置内部计数器(这是到最后一个标记位置,详见here)。