1

我正在尝试读取文件,我想读取文件的某些部分并跳过某些部分,直到我到达文件末尾。这就是我所拥有的,但我没有得到我想要的结果。这个想法是通读所有行并检查它是否以“CH”或“CL”开头,如果直到文件末尾才移动到下一行并存储所有符合条件的行

 new BufferedReader (new FileReader ("c:\\demo5.properties\\"));
    while(( br.readLine()) != null ){
        if (br.readLine().startsWith("CH") ||  br.readLine().startsWith("CL")) {
        buf = new StringBuffer();
        buf.append( br.readLine());

        while (br.readLine()!= null && !br.readLine().startsWith("#") &&  !br.readLine().contains("claimID")){
            buf.append( br.readLine()).append( "\n" );
        }
         z = buf.toString();

         System.out.println(z);

        s3+= z;
    }
        br.readLine();

文件格式

 CH.field 
 CH.field
 CH.field
 CH.field
 CH.field
 #CH.field
 #CH.field
 #CH.field
 #CH.field
 *********
 **
 *********
 CL1.field
 CL1.field
 CL1.field
 CL1.field
 CL1.field
 *****************
#Result.CL1.field
#Result.CL1.field
#Result.CL1.field
Result.CL1.field
*********
CL4.field
CL4.field
CL4.field
#CL4.field
#CL4.field
#CL4.field
***********

   #Result.CL4
  #Result.CL4
  #Result.CL4
  #Result.CL
 Result.CL4
  CL5.field
 CL5.field
 CL5.field
 #CL5.field
 #CL5.field

输出

CH.fieldCH.field

CL1.field#Result.CL1.field
CL4.field
CL4.field

#CL4.field

CL5.fieldCL5.field
4

4 回答 4

1

看看这个循环:

while (br.readLine()!= null 
       && !br.readLine().startsWith("#")
       &&  !br.readLine().contains("CH.field.claimID")){
    buf.append( br.readLine()).append( "\n" );
}

你打了readLine() 4 次电话。这将读取四个不同的行。你想要这样的东西:

String line;
while ((line = br.readLine()) != null &&
       !line.startsWith('#') &&
       !line.contains("CH.field.claimID")) {
    buf.append(line).append("\n");
}    

至少,我认为这就是您想要的 - 我发现描述有点混乱。无论如何,这将读取每一行,当它到达文件末尾以“#”开头的行包含“CH.field.claimID”的行时停止......但建立一个StringBuffer包含之前所有行的观点。

于 2013-03-19T15:22:13.710 回答
0

从您的问题中,我了解到您想要存储以“CH”或“CL”开头的所有行并忽略其余行。

所有 br.readline 调用都将该文件读取器指针移动到下一行。

格式对我来说看起来很奇怪,也许试试这个:

    String input = "";
    buf = new StringBuffer();
    new BufferedReader (new FileReader ("c:\\demo\\TestIL_Cross_000005.properties\\"));

    // read in the line to "input" if it exists
    while((input = br.readLine()) != null ){
        // check for starting string match
        if (input.startsWith("CH") ||  input.startsWith("CL")) { 
            // append to whatever data struct here since it matches       
            buf.append(input + "\n");
           // print "input" here for testing
        }
    }
于 2013-03-19T15:34:50.250 回答
0

这是您在代码中犯的一个非常基本的错误。您必须将 readLine() 方法返回的数据存储在 String 变量中,并将其用于进一步的操作。您每次都在调用 readLine() 方法,您想对接收到的 String 执行操作,结果它每次都获取新数据并且以前的数据都丢失了。

您的代码的修改版本:

         new BufferedReader (new FileReader ("c:\\demo\\TestIL_Cross_000005.properties\\"));
     String line = null;

        while(( line= br.readLine()) != null ){
            if (line.startsWith("CH") ||  v.startsWith("CL")) {
            buf = new StringBuffer();
            buf.append(line);

            while (line!= null && !line.startsWith("#") &&  !line.contains("CH.field.claimID")){
                buf.append( line).append( "\n" );
            }
             z = buf.toString();

             System.out.println(z);

            s3+= z;
        }

}

在这里,我刚刚从 String 引用中的 readLine() 方法收集了数据,并用于执行不同的检查。

于 2013-03-19T15:35:31.050 回答
0

对 readLine() 的调用将读取以 '\n' 结尾的一行,然后文件指针将指向下一行(或者更准确地说,它将指向 '\n' 之后的任何内容)。

例如

在 readLine() 之前:

filePointer --> 这是第一行 \n

----------------- 这是第二行 \n

在 readLine() 之后:

------------------这是第一行\n

filePointer --> 这是第二行 \n

您多次调用 readLine() 认为它指的是同一行。这就是你出错的地方。

于 2013-03-19T15:32:29.790 回答