任何人都可以解释为什么在我的代码正在读取的txt文件中,文本部分(用数字标记)之间必须有3个空行?
我有一个从txt文件中读取行的代码。该文件的结构如下:
1
[R
文字行
文字行
文字行
文字行
文字行
2
一个
文字行
文字行
文字行
文字行
文字行
数字是用于标识要读取的部分的标记。当识别出section时,我的代码会读取连续的文本行,并将返回的值赋给String变量。 所有这些只能完美地工作,并且只有当每个文本部分分别有3个空行时才是源txt文件。我想明白为什么会这样?非常感谢你
以下是我的代码片段:
inpStream = getClass().getResourceAsStream("/resources/myFile.txt");
try (BufferedReader reader = new BufferedReader(new InputStreamReader(inpStream,"UTF-16BE"))){
do{
num = Integer.toString(a);
line = reader.readLine();
if(line.equals(num)){
who = reader.readLine();
what = reader.readLine();
sat = reader.readLine();
pow = reader.readLine();
satNo = reader.readLine();
cash = reader.readLine();
break;
}
} while(!line.equals(num) && (line = reader.readLine()) != null );
}
catch(IOException e){}
答案 0 :(得分:1)
调用readLine()的次数和顺序。
您的代码会读取并检查其他所有行是否匹配。这三个空白行并不重要,只是因为它是第一个索引号以来的偶数。它也适用于一个,五个等。
双重读取在每次迭代开始时发生一次,一次发生在条件中。
line = reader.readLine();
和
while(... && (line = reader.readLine()) != null
从而每次迭代都跳过两行。
我建议将第一个读出移出循环,或者改为while循环:
String line;
while ((line = reader.readLine() != null) {
if (line.equals(num){
...
break;
}
}
这将读取每一行,检查每行的num。
定义num
也可以移出循环,因为循环内部不会改变。给出一个完整的例子:
InputStream inpStream = getClass().getResourceAsStream("/resources/myFile.txt");
try (BufferedReader reader = new BufferedReader(new InputStreamReader(inpStream, "UTF-8"))) {
num = Integer.toString(a);
String line;
while ((line = reader.readLine()) != null) {
if (line.equals(num)) {
who = reader.readLine();
what = reader.readLine();
sat = reader.readLine();
pow = reader.readLine();
satNo = reader.readLine();
cash = reader.readLine();
break;
}
}
} catch (IOException e) {
}
注意:此示例使用UTF-8。
答案 1 :(得分:0)
无论您是否需要,都必须阅读所有行。你不能假装你读行,你没有。你可以在你需要的之后跳过这些行。
答案 2 :(得分:0)
让我们逐行分解您的代码并进行分析。
您在InputStream对象上调用getClass()函数,而该对象又用于调用getStreamResource()函数以返回" stream"到您的文件数据。
现在可以访问此流,将BufferReader放在try / catch语句中。
接下来,使用Reader参数inpstream和文件编码类型UFT-16创建BufferReader。
你还没有告诉我你在哪里宣布过' a'所以我无法确定,但你正在转换一个整数' a'到名为num的字符串。 (这很重要,因为它是你的do语句的终止因素。)我在第一次迭代中假设a = 1.
现在全面了解文件偏移。 当你说
line=reader.readLine();
返回包含当前行字符的String,并将文件偏移量设置为下一行。
您的文件偏移量为' r' (第一次迭代)。
阅读who,what,sat,pow,satNo&现金。
现在你的while语句检查两个条件是否都为真。 ie line!= num(因为你在阅读who,what,sat,pow,satNo& cash之后没有在任何地方重新定义数字。)而且line = line.readLine()!= null这也是真正。
然而,这是你第一次错误调用line=reader.readLine()
的方式,这会使文件偏移量增加一行。因此,在两次迭代中,除了您期望的内容之外,还会读取两行。这弄乱了你设想你的变量的顺序,即who,what,sat,pow,satNo&你的做法陈述中的现金等。
因此,简而言之,您在第一次迭代后跳过所有其他行。 你需要摆脱一个readLine调用。
两次重复计算是:
line = inpstream.readLine()
和
line = reader.readLine()) != null