【问题标题】:How to read odd number of lines from a text file using Java?如何使用Java从文本文件中读取奇数行?
【发布时间】:2010-11-01 19:57:12
【问题描述】:

我有一个文本文件,其中每个奇数行都包含一个整数(字符串当然是因为它在文本文件中),偶数行有一个时间。我只想读取数字,因此是文本文件中的奇数行。我该怎么做?

import java.io.*; 

public class File { 

BufferedReader in; 
String read; 
int linenum =12;


public File(){ 
try { 
in = new BufferedReader(new FileReader("MAP_allData.txt")); 

for (linenum=0; linenum<20; linenum++){

read = in.readLine();
if(read==null){} 
else{
System.out.println(read);  }
}
in.close(); 
}catch(IOException e){ System.out.println("There was a problem:" + e); 

} 
} 

public static void main(String[] args){ 
File File = new File(); 
} 
}

到目前为止,它将读取所有(奇数和偶数)行,直到不再从(null)读取为止

由于我的偶数行是像13:44:23 这样的时间戳,所以我可以做类似的事情

if(read==null 或者如果 read 包含一个 时间或分号){} else { SOP(读取);}

【问题讨论】:

    标签: java bufferedreader


    【解决方案1】:

    阅读所有行,忽略其他行。

    int lineNum = 0;
    String line = null;
    while ( (line = reader.readLine() ) != null ) {
       lineNum++;
     if ( lineNum % 2 == 0 ) continue;
       //else deal with it
    }
    

    或者每次循环调用readLine() 两次,忽略第二次,并避免使用计数器(安全,因为在到达流结束后对 readLine 的所有调用都返回 null)。

    编辑如果效率绝对是关键并且日期行具有固定长度格式,您可以使用skip(15) 或类似的方法来有效地跳过您不关心的行。

    【讨论】:

    • 无限的while 循环比for-loop 更好!
    • @Philip:老实说,我仍然通常使用 for 循环来正确确定 line 的范围:for (String line = null; (line = reader.readLine()) != null; ) {... 但无论如何你的观点说得很好。
    【解决方案2】:

    确定在for-loop 结束之前放置一个简单的in.readLine () 可以解决这个问题吗?

    即:

    for (linenum=0; linenum<20; linenum++) {
    
        read = in.readLine();
        if(read==null){} 
        else{
            System.out.println(read);  
        }
        in.readLine ();
    }
    

    【讨论】:

      【解决方案3】:

      你已经有一个行计数器,所以如果你想使用每隔一行,使用模检查

      if((linenum % 2) == 1){
           System.out.println(read);
      }
      

      【讨论】:

        【解决方案4】:

        每次阅读一行时都执行这样的操作:

        String str = read;
        char[] all = str.toCharArray();
        bool isInt = true;
        for(int i = 0; i < all.length;i++) {
            if(!Character.isDigit(all[i])) {
                isInt = false;
            }
            else {
                isInt = true;
            }
        }
        if isInt {
            //INTEGER LINE
        } else {
            //DO SOMETHING WITH THE TIME
        }
        

        这使代码动态化。如果文本文件发生更改,而整数出现在不同编号的行上,则您的代码可以保持不变。

        【讨论】:

        • 如果文本文件格式发生变化,我希望我的代码中断。谁知道是否真的是语义发生了变化,在这种情况下不破坏会导致晦涩的错误?
        • 确实如此。如果是我并且我要采用这种方法,我可能倾向于将线路传递给Integer.parseInt()Integer.valueOf() 并抓住任何NumberFormatException。无论如何,您最终都会想要将输入转换为 int/Integer。这种方式既冗长又脆弱。例如,您的方法不允许负数。
        • 我在想 parseInt() ,最后尝试一下。那样可能会更好。
        • 另外,还有一个微妙的错误使它根本无法工作。找到非数字后,您应该跳出循环。有了这个实现,只要最后一个字符是数字,整个输入就被认为是一个整数。这可能甚至无法将其与大多数日期格式区分开来。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-24
        • 1970-01-01
        • 2019-01-14
        相关资源
        最近更新 更多