从java中的文件中读取N行?

时间:2015-02-22 10:03:59

标签: java arrays file java.util.scanner bufferedreader

我不太清楚如何解释我的问题,但我会尽力而为。比方说,我有一个包含100个数字的文件,是否可以从这100个数字文件中读取25-50行。

要从开头读取N金额,我会做这样的事情;

ArrayList<Double> array = new ArrayList<Double>();
 Scanner input = new Scanner(new File("numbers.txt"));
 int counter = 0;
 while(input.hasNextLine() && counter < 10)
 {
     array.add(Double.parseDouble(input.nextLine()));
     counter++;
 }

但是我不太确定如何开始从给定的行开始阅读,例如25-50或25-75或75-100等。

非常感谢任何帮助,如果我的问题不明确,请告诉我。

编辑:

文件中的一些数据:

  • 1.45347,1.1545,1.2405
  • 1.467,1.4554,1.2233
  • 1.4728,1.3299,1.1532
  • 1.131,1.5139,1.0044
  • 1.4614,1.7373,1.6235
  • 1.654,1.5544,1.61147

3 个答案:

答案 0 :(得分:3)

使用Java 8,您可以轻松解决问题。请注意,下面的代码不会进行任何类型的边界检查(这是一个练习):

private static final Pattern COMMA = Pattern.compile(",");

public static List<Double> readNumbers(final String file, 
    final int startLine, final int endLine)
    throws IOException
{
    final long skip = (long) (startLine - 1);
    final long limit = (long) (endLine - startLine);
    final Path path = Paths.get(file);

    try (
        final Stream<String> stream = Files.lines(path, StandardCharsets.UTF_8);
    ) {
        return stream.skip(skip).limit(limit)
            .flatMap(COMMA::splitAsStream)
            .map(Double::valueOf)
            .collect(Collectors.toList());
    }
}

似乎问题还不清楚;上面的代码读取给定行范围内的所有双精度数。如果您想要的是从给定的开始读取所有双打&#34;索引&#34;对于给定的结束&#34;索引&#34;,您在上面的代码中所要做的就是将.skip().limit()的展示位置更改为.map()之后。

答案 1 :(得分:3)

byte[] inputBytes = "line 1\nline 2\nline 3\ntok 1 tok 2".getBytes();
Reader r = new InputStreamReader(new ByteArrayInputStream(inputBytes));

BufferedReader br = new BufferedReader(r);
Scanner s = new Scanner(br);

System.out.println("First line:  " + br.readLine());
System.out.println("Second line: " + br.readLine());
System.out.println("Third line:  " + br.readLine());

System.out.println("Remaining tokens:");
while (s.hasNext())
    System.out.println(s.next());

并添加像Astra建议的while循环

答案 2 :(得分:0)

假设每行有多个号码(未知号码数):

int start = 25;
int n finish = 50;
String delimit = ",";
List<Double> array = new ArrayList<Double>(finish - start);
 Scanner input = new Scanner(new File("numbers.txt"));
 int counter = 1;
 while(input.hasNextLine() && counter <= finish)
 {

        String line = input.nextLine();
        String[] splits = line.split(delimit);
        for (int i=0; i<splits.length; i++){
           if (counter >= start && counter <=finish){
               array.add(Double.parseDouble(splits[i]));
            }
            counter++;
         }
 }