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