txt文件代码的结构是从中读取的

时间:2014-08-18 20:51:54

标签: java file-io

任何人都可以解释为什么在我的代码正在读取的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){}

3 个答案:

答案 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)

让我们逐行分解您的代码并进行分析。

第1行。

您在InputStream对象上调用getClass()函数,而该对象又用于调用getStreamResource()函数以返回" stream"到您的文件数据。

现在可以访问此流,将BufferReader放在try / catch语句中。

线路2。

接下来,使用Reader参数inpstream和文件编码类型UFT-16创建BufferReader

第3-13行

你还没有告诉我你在哪里宣布过' 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