Python 官方文档:入门教程 => 点击学习
目录bufferedreader的read()与readline()读取出错bufferedReader中的readLine()源码解析bufferedreader的read()与r
以前学习java的时候也没有太在意,直到最近做项目时使用了才发现这个问题,总是第一个字符输不出来
bufferedreader这个类借用别人的话来说,就是一个包装类
它可以包装字符流,将字符流放入缓存里,先把字符读到缓存里,到缓存满了或者你flush的时候,再读入内存,就是为了提高读的效率而设计的。
读取一个txt文件,方法很多种而我使用的是字符流来读取
int c;
FileReader file = new FileReader("D:\\emDemo.java");
BufferedReader br = new BufferedReader(file);
while((c=br.read())!=-1){undefined
System.out.println(br.readLine());
}
发现每行的第一个字符都没有显示出来,后来发现 c=br.read())!=-1 每次都会先读取一个字节出来,所以后面的br.readLine());
读取的就是每行少一个字节
所以,应该使用
String input = null;
while ((input=br.readLine())!=null){undefined
System.out.println(input);
}
这样就能解决了~
String readLine(boolean ignoreLF) throws ioException {
//行(hang)数据的缓冲s
StringBuffer s = null;
int startChar;
synchronized (lock) {
ensureOpen();
boolean omitLF = ignoreLF || skipLF;
bufferLoop:
for (;;) {
//1、如果缓冲数组的数据不足,或者已经读到了数组的末尾时:
//1.1如果下次读取的位置已经到了or超过数组的长度,从流中读数据到缓冲数组cb中
if (nextChar >= nChars)
fill();
if (nextChar >= nChars) {
if (s != null && s.length() > 0)
return s.toString();
else
return null;
}
//2 缓冲数组中有足够的数据时:
boolean eol = false;
char c = 0;
int i;
if (omitLF && (cb[nextChar] == '\n'))
nextChar++;
skipLF = false;
omitLF = false;
charLoop:
for (i = nextChar; i < nChars; i++) {
c = cb[i];
if ((c == '\n') || (c == '\r')) {
eol = true;
break charLoop;
}
}
startChar = nextChar;
nextChar = i;
if (eol) {
String str;
if (s == null)
{
str = new String(cb, startChar, i - startChar);
}
else
{
s.append(cb, startChar, i - startChar);
str = s.toString();
}
//更新下次读取的位置
nextChar++;
if (c == '\r') {
skipLF = true;
}
return str;
}
//2.2如果没有换行符
if (s == null)
//类属性int defaultExpectedLineLength = 80
s = new StringBuffer(defaultExpectedLineLength);
//填充s,从上个换行符到最后
s.append(cb, startChar, i - startChar);
}
}
}
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。
--结束END--
本文标题: 基于bufferedreader的read()与readline()读取出错原因及解决
本文链接: https://lsjlt.com/news/159518.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0