该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
LZ,对于你提的问题,很明显应该使用BufferedReader类是最好的.
"当.nextLine()读取到TMES的时候,让读取的行返回到00000000,4"
BufferedReader有个readLine()方法,就是每次都读一行的意思(当然,首先在写readLine()方法之前要写上一个while循环或者是for循环.).
还有个mark()方法,作用是: 如果你想读完某一行后又想在后续的过程再返回到这一行再重新读,就要用到这个方法了.有一点需要注意的是,假如你是要读第4行,那么在第三行的readLine()方法后,马上写上一个mark()方法,这样就可以在第四行起始位置打上个标记.
还有个reset()方法,其作用是: 回到调用mark()方法时打上的标记处,后面的步骤就看你想如何实现了:
1 如果你想在该标记处继续将后面的字符全部打印出来,就在上一个while语句结束后,再写一个whlie循环.
2 如果你想将该标记处当前行读取出来,或者也读取出后面的某几行,或者是读取后面的某一行,就看你如何写判断语句,说白了,考验的就是你的逻辑思维能力了.
下面写个示例代码,你就明白了.
No.1
00000000,4
----------------
TMES
----------------
TMES
----------------
假如你想程序打印完Tmes后,要重新从00000000,4开始往后读取,就要这样写代码:
BufferedReader br = null;
String str = "";
try {
br = new BufferedReader(new FileReader("src/新建 文本文档 (3).txt"));
while (null != (str = br.readLine())) {
if ("No.1".equals(str)) {
// 当前行读取的内容如果为"No.1",就必须要调用好mark()方法.
// 8192是一个BufferedReader被初始化时的默认缓冲大小.
// mark(8192)方法的意思是: 从当前的标记位置(读取到"No.1"后,下一行的起始位置)
// 处开始计算,然后会在后面调用reset()方法,再调用readlin()方法来接着读取数据.
// 8192就是接着读取要读取字符的长度限制,也就是说如果接着要读取的字符的长度
// 大于8192(从调用mark()方法时的位置开始算,直到调用了reset()方法,
// 或者不再调用read()方法也就是说"while循环退出了",这期间总计读取的数据长度
// 不能大于8192个字节),在调用reset()方法处会抛出一个IO异常.
// 所以mark()方法里的参数,要传一个大一点的整数,可以传入比默认缓冲的数值更大的数.
// 不过如果传入比默认缓冲区的值更大的数,系统就会用这个传入的值的大小,
// 重新为BufferedReadr实例分配一个新的缓冲区,这样会造成不必要的系统资源开销.
// 所以用默认长度的大小: 8192就可以了.
// 关于这些知识,API文档里有详细说明.
br.mark(9999); // 如果你想把文件的内容全部读取出来后,再跳到前面去从上一次打好标记的位置开始读取.
// 就不要写break语句,该怎么写,完全取决于自己的项目需求.
break;
}
} // 将读取指针返回到打上标记时的位置
br.reset(); while (null != (str = br.readLine())) {
// 接着上一次打好标记的位置,继续往下读取数据.
System.out.println(str);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (null != br) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}