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

在java中从文件中读取N行?,java,arrays,file,java.util.scanner,bufferedreader,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

我不太清楚如何解释我的问题,但我会尽我最大的努力。例如,我有一个包含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++;
 }
ArrayList数组=新的ArrayList();
扫描仪输入=新扫描仪(新文件(“numbers.txt”);
int计数器=0;
while(input.hasNextLine()&计数器<10)
{
add(Double.parseDouble(input.nextLine());
计数器++;
}
但我不太确定如何开始阅读给定的行,例如第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

假设每行上有多个数字(未知数字):

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++;
         }
 }
int start=25;
内表面光洁度=50;
字符串分隔符=“,”;
列表数组=新数组列表(完成-开始);
扫描仪输入=新扫描仪(新文件(“numbers.txt”);
int计数器=1;

while(input.hasNextLine()&&counter假设每行有多个数字(未知数字):

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++;
         }
 }
int start=25;
内表面光洁度=50;
字符串分隔符=“,”;
列表数组=新数组列表(完成-开始);
扫描仪输入=新扫描仪(新文件(“numbers.txt”);
int计数器=1;

虽然(input.hasNextLine()&&counter使用Java 8,您有一个简单的解决方案。请注意,下面的代码没有进行任何类型的边界检查(这只是一个练习):

private静态最终模式逗号=Pattern.compile(“,”);
公共静态列表读取编号(最终字符串文件,
最终整型线,最终整型终点线)
抛出IOException
{
最终长跳跃=(长)(startLine-1);
最终长限=(长)(终点线-终点线);
最终路径路径=Path.get(文件);
试一试(
最终流=Files.lines(路径,StandardCharsets.UTF_8);
) {
返回流.跳过(跳过).限制(限制)
.flatMap(逗号::splitAsStream)
.map(Double::valueOf)
.collect(Collectors.toList());
}
}


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

使用Java 8,您有一个简单的解决方案。请注意,下面的代码没有进行任何类型的边界检查(这只是一个练习):

private静态最终模式逗号=Pattern.compile(“,”);
公共静态列表读取编号(最终字符串文件,
最终整型线,最终整型终点线)
抛出IOException
{
最终长跳跃=(长)(startLine-1);
最终长限=(长)(终点线-终点线);
最终路径路径=Path.get(文件);
试一试(
最终流=Files.lines(路径,StandardCharsets.UTF_8);
) {
返回流.跳过(跳过).限制(限制)
.flatMap(逗号::splitAsStream)
.map(Double::valueOf)
.collect(Collectors.toList());
}
}

问题似乎也不清楚;上面的代码读取给定行范围内的所有双精度。如果您想要读取从给定开始“索引”到给定结束“索引”的所有双精度,那么在上面的代码中您所要做的就是将
.skip().limit()
的位置更改为
.map()
之后

并像Astra建议的那样添加一个while循环



并添加一个类似Astra建议的while循环

每行是否包含一个数字?抱歉,我误解了你的问题,每行包含三组以逗号分隔的数字。例如:1.4352,1.1749,1.5531你不能从中间开始阅读。你必须从开始开始阅读,但不存储任何内容&因为第25行开始存储/使用值是的。每行是否包含一个数字?抱歉,我误解了你的问题,每行包含三组以逗号分隔的数字。例如:1.4352、1.1749、1.5531你不能从中间开始阅读。你必须从开始开始开始,阅读,但不存储任何内容&因为第25行开始存储/使用值。嗨,谢谢你的回答,我会给出它一次尝试。但是我的文件每行包含3组数字。例如,1.4352,1.1749,1。5531@Henry,这很重要,分隔符是什么,例如逗号?空格?它像23.34265.7693.7吗?请提供一个示例(始终提供一个数据示例)抱歉,我没有给出示例,数据仅用逗号分隔,没有空格,例如1.664,1.3844,1。2133@Henry,更新的答案。您可以在一条直线上有任意数量的数字a,它不是逐行读取,而是逐行读取数字。例如,它不是读取第25行,而是用逗号分隔每一个双精度数字,并读取第25个双精度数字。您好,谢谢s谢谢你的回答,我会试一试。但是我的文件每行包含3组数字。例如1.4352,1.1749,1。5531@Henry,这很重要,分隔符是什么,例如逗号?空格?它像23.34265.7693.7吗?请提供一个示例(始终提供一个数据示例)抱歉,我没有给出示例,数据仅用逗号分隔,没有空格,例如1.664,1.3844,1。2133@Henry,更新的答案。你可以在一条直线上有任意数量的数字a,它不是逐行读取,而是逐行读取数字。例如,它不是读取第25行,而是用逗号分隔每一个双精度数字,并读取第25个双精度数字。Hi fge,w你说的边界是什么意思,谢谢你的回答。好吧,我不检查开始是否小于结束之类的东西。另外,请参阅后期编辑。我可以更改检查开始是否小于结束。谢谢,这正符合我的需要。再次感谢。唯一的问题是
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());