尝试部分阅读此文件。阅读部分内容并跳过一些内容

时间:2013-03-19 15:17:48

标签: java

我正在尝试读取文件,我想阅读文件的某些部分并跳过某些部分,直到我到达文件的末尾。这就是我所拥有的,但我没有得到我想要的结果。想法是读取所有行并检查它是否以“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 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

例如

在readLine()之前:

filePointer - >这是第一行\ n

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

readLine()之后:

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

filePointer - >这是第二行\ n

您多次调用readLine(),认为它引用了同一行。哪个是你出错的地方。

答案 2 :(得分: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
        }
    }

答案 3 :(得分: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()方法的数据,并用于执行不同的检查。