黑马程序员技术交流社区
标题:
为什么数据获取不完全,最后一行没获取到呢?
[打印本页]
作者:
陈延真
时间:
2013-6-1 12:19
标题:
为什么数据获取不完全,最后一行没获取到呢?
本帖最后由 陈延真 于 2013-6-2 20:08 编辑
//需求:模拟LineNumberReader类
/*
模拟除了有readLine()方法和close()方法外。还应该有获取和设置行号的功能。
*/
import java.io.IOException;
import java.io.Reader;
public class MyLineNumberReader {
private Reader r;
private int lineNumber;
public MyLineNumberReader(Reader r) {
this.r = r;
}
public int getLineNumber() {
return lineNumber;
}
public void setLineNumber(int lineNumber) {
this.lineNumber = lineNumber;
}
// 模拟readLine()方法
public String readLine() throws IOException {
lineNumber++;
// 定义一个容器
StringBuilder sb = new StringBuilder(); // sb
int ch = 0;
while ((ch = r.read()) != -1) {
// ch是不是就是读取到的字符
if (ch == '\r') {
continue;
}
if (ch == '\n') {
return sb.toString(); // hello
} else {
sb.append((char) ch); // hello java
}
}
return null;
}
// 释放资源
public void close() throws IOException {
r.close();
}
}
//下面是测试类
import java.io.FileReader;
import java.io.IOException;
public class MyLineNumberReaderTest {
public static void main(String[] args) throws IOException {
MyLineNumberReader mlnr = new MyLineNumberReader2(new FileReader(
"a.txt"));
mlnr.setLineNumber(10);
String line = null;
while ((line = mlnr.readLine()) != null) {
System.out.println(mlnr.getLineNumber() + ":" + line);
}
mlnr.close();
}
}
作者:
骑上最爱
时间:
2013-6-1 12:40
最后一行没有读取到换行符,在判断一下如果没有换行符且是读取返回的为-1就把读取的字符添加到集合中
作者:
littlefoxtail
时间:
2013-6-1 12:46
本帖最后由 littlefoxtail 于 2013-6-1 12:47 编辑
public String readLine() throws IOException这个方法中的
因为最后一行没有回车符号,所以不会 return sb.toString();方法直接返回了null
在return null前;得加一句这个
if(sb.length()!=0)
return sb.toString();
作者:
黑马-许鹏
时间:
2013-6-1 13:49
本帖最后由 黑马-许鹏 于 2013-6-1 13:50 编辑
最后一行没有读取到是因为最后一行可能没有回车换行符,那么当执行while ((ch = r.read()) != -1) 判断时,不满足,那么就会return null,所以在执行while ((ch = r.read()) != -1) 不成立时也就是 r.read() = -1时,判断一下字符串缓冲区sb是不是为空,为空则返回null,不为空则返回里面的字符串。代码如下:
import java.io.IOException;
import java.io.Reader;
public class MyLineNumberReader {
private Reader r;
private int lineNumber;
public MyLineNumberReader(Reader r) {
this.r = r;
}
public int getLineNumber() {
return lineNumber;
}
public void setLineNumber(int lineNumber) {
this.lineNumber = lineNumber;
}
// 模拟readLine()方法
public String readLine() throws IOException {
lineNumber++;
// 定义一个容器
StringBuilder sb = new StringBuilder(); // sb
int ch = 0;
while ((ch = r.read()) != -1) {
// ch是不是就是读取到的字符
if (ch == '\r') {
continue;
}
if (ch == '\n') {
return sb.toString(); // hello
} else {
sb.append((char) ch); // hello java
}
}
if(sb.length()==0)
return null;
else
return sb.toString();
}
// 释放资源
public void close() throws IOException {
r.close();
}
}
复制代码
作者:
殇_心。
时间:
2013-6-1 18:06
如果问题已解决,请及时修改分类,否则继续提问,谢谢合作!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2