如何使用Java从文本文件中读取奇数行?

如何使用Java从文本文件中读取奇数行?,java,bufferedreader,Java,Bufferedreader,我有一个文本文件,其中每一个奇数行都有一个整数(当然是字符串,因为它在文本文件中),偶数行有一个时间。我只想读取数字,因此从文本文件中读取奇数行。我该怎么做 import java.io.*; public class File { BufferedReader in; String read; int linenum =12; public File(){ try { in = new BufferedReader(new FileReader("MAP_allData.t

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

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(); 
} 
}
import java.io.*;
公共类文件{
缓冲读取器;
字符串读取;
int-linenum=12;
公共文件(){
试试{
in=新的BufferedReader(新的文件阅读器(“MAP_allData.txt”);

对于(linenum=0;linenum读取所有行,并忽略其他行

int lineNum = 0;
String line = null;
while ( (line = reader.readLine() ) != null ) {
   lineNum++;
 if ( lineNum % 2 == 0 ) continue;
   //else deal with it
}
或者每个循环只调用
readLine()
两次,忽略第二次,并避免使用计数器(安全,因为所有对readLine的调用在到达流结束后返回null)


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

读取所有行,并忽略其他行

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)
或类似的方法来有效地跳过您不关心的行。

for
循环结束之前,在.readLine()
中放入一个简单的
,肯定会解决这个问题吗

i、 e:


for(linenum=0;linenum在
for
循环结束之前,在.readLine()
中放入一个简单的
,肯定会解决这个问题吗

i、 e:


for(linenum=0;linenum您已经有了一个linecounter,因此如果您想每隔一行使用一次,请使用模数检查

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

您已经有一个linecounter,因此如果要每隔一行使用一次,请使用模数检查

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

每次阅读一行内容时,只需执行以下操作:

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
}
String str=read;
char[]all=str.toCharArray();
bool-isInt=true;
for(int i=0;i

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

每次读取一行内容时,只需执行以下操作:

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
}
String str=read;
char[]all=str.toCharArray();
bool-isInt=true;
for(int i=0;i

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

不定
while
循环比
for
-循环要好得多!@Philip:老实说,我通常仍然使用for循环来正确地限定
行的范围:
for(String line=null;(line=reader.readLine())!=null;){…
但是你的观点还是很好的。不确定的
while
循环比
for
-循环好得多!@Philip:老实说,我通常还是使用for循环来正确地定义
行:
for(String line=null;(line=reader.readLine())!=null;){…
但是你的观点还是说得很好。如果文本文件格式发生变化,我希望我的代码中断。谁知道语义是否真的发生了变化,在这种情况下不中断会导致模糊的错误?这是真的。如果是我和我采取这种方法,我可能会倾向于将行传递到
Integer.parseInt()
Integer.valueOf()
并捕获任何
NumberFormatException
。无论如何,您最终都会希望这样做,将输入转换为int/Integer。这种方法既冗长又脆弱。例如,您的方法不允许负数。我正在考虑parseInt()通过尝试,最终捕获。这种方式可能更好。此外,还有一个微妙的缺陷使其根本不起作用。您应该在找到非数字后打破循环。在这种实现中,只要最后一个字符是数字,整个输入就被视为整数。这可能甚至无法将其与大多数d区分开来ate格式。如果文本文件格式发生变化,我希望我的代码中断。谁知道语义是否真的发生了变化,在这种情况下不中断会导致模糊的错误?这是真的。如果是我和我采取这种方法,我可能会倾向于将行传递到
Integer.parseInt()
Integer.valueOf()
并捕获任何
NumberFormatException
。无论如何,您最终都会希望这样做,将输入转换为int/Integer。这种方法冗长且脆弱。例如,您的方法不允许负数。我在考虑parseInt()通过尝试,最终捕获。这种方式可能更好。此外,还有一个微妙的缺陷使其根本不起作用。您应该在找到非数字后打破循环。在这种实现中,只要最后一个字符是数字,整个输入就被视为整数。这可能甚至无法将其与大多数d区分开来ate格式。