Java txt文件代码的结构是从

Java txt文件代码的结构是从,java,file-io,Java,File Io,有人能解释一下为什么在我的代码读取的txt文件中,文本段(标有数字)之间必须有3个空行吗 我有一个从txt文件中读取行的代码。该文件的结构如下: 1 r 文本行 文本行 文本行 文本行 文本行 2 a 文本行 文本行 文本行 文本行 文本行 数字是我用来标识要阅读的部分的标记。当节被标识时,我的代码将读取连续的文本行,并将返回的值分配给字符串变量。 只有在源txt文件中有3个空行分隔文本的每一部分时,所有这些都可以完美地工作。我想知道为什么会这样?多谢各位 下面是我的代码片段: inpSt

有人能解释一下为什么在我的代码读取的txt文件中,文本段(标有数字)之间必须有3个空行吗

我有一个从txt文件中读取行的代码。该文件的结构如下:

1
r
文本行
文本行
文本行
文本行
文本行



2
a
文本行
文本行
文本行
文本行
文本行

数字是我用来标识要阅读的部分的标记。当节被标识时,我的代码将读取连续的文本行,并将返回的值分配给字符串变量。 只有在源txt文件中有3个空行分隔文本的每一部分时,所有这些都可以完美地工作。我想知道为什么会这样?多谢各位

下面是我的代码片段:

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){}

无论你是否需要,你都必须阅读所有的句子。你不能假装你读台词,你没有。您可以在需要的行之后跳过这些行。

这是对readLine()的调用次数和顺序

代码每隔一行读取并检查匹配项。这三个空行并不重要,只是它是一个偶数,因为第一个索引号。它还将与1、5等一起工作

重复读取在每次迭代开始时发生一次,在条件下发生一次

line = reader.readLine();

因此每次迭代跳过两行

我建议将第一个读数移出循环,或更改为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行。 在InputStream对象上调用函数,然后使用该对象调用函数将“流”返回到文件数据

现在可以访问这个流了,您将BufferReader封装在try/catch语句中

第二行。 接下来创建一个读取器参数inpstream和文件编码类型UFT-16

第3-13行 您没有告诉我您在哪里声明了“a”,所以我不能确定,但您正在将整数“a”转换为名为num的字符串。(这很重要,因为它是do语句的终止因子。)我在第一次迭代中假设a=1

现在,它的全部内容是了解文件偏移。 当你说

line=reader.readLine()

这将返回一个包含当前行字符的字符串,并将文件偏移量设置为下一行

您的文件偏移量为“r”(对于第一次迭代)

阅读谁,什么,sat,pow,satNo和cash的方法是一样的

现在,while语句将检查这两个条件是否为真。i、 e线!=num(这是因为在阅读了who、what、sat、pow、satNo和cash之后,您在任何地方都没有重新定义num)以及line=line.readLine()!=null,这也是正确的

但是,这是调用
line=reader.readLine()
的第一个错误,您这样做会使文件偏移量再增加一行。因此,在两次迭代中,除了您期望的内容之外,还将读取两行内容。这打乱了您在do报表中预期的变量的顺序,即谁、什么、sat、pow、satNo和cash等

因此,简而言之,在第一次迭代之后,您将跳过每隔一行。 您需要取消一个readLine调用

重复计算的两项是:

line=inpstream.readLine()

line = reader.readLine()) != null 

谢谢斯塔夫的解释。我不明白,真遗憾:-)我按照你的建议重新做了。不用担心。如果你喜欢这个答案,请投票并接受。
line = reader.readLine()) != null