【问题标题】:How to read N amount of lines from a file?如何从文件中读取 N 行?
【发布时间】:2014-11-25 15:01:05
【问题描述】:

我正在尝试练习从 java 文件中读取文本。我不知道如何读取 N 行,比如文件中的前 10 行,然后将这些行添加到 ArrayList 中。

比如说文件包含1-100个数字,像这样;

- 1 
- 2 
- 3 
- 4 
- 5 
- 6 
- 7 
- 8 
- 9 
- 10 
- ....

我想读取前 5 个数字,即 1、2、3、4、5 并将其添加到数组列表中。到目前为止,这是我设法做到的,但我被卡住了,不知道现在该做什么。

ArrayList<Double> array = new ArrayList<Double>();
InputStream list = new BufferedInputStream(new FileInputStream("numbers.txt"));

for (double i = 0; i <= 5; ++i) {
    // I know I need to add something here so the for loop read through 
    // the file but I have no idea how I can do this
    array.add(i); // This is saying read 1 line and add it to arraylist,
    // then read read second and so on

}

【问题讨论】:

标签: java for-loop arraylist bufferedreader fileinputstream


【解决方案1】:

您可以尝试使用扫描仪和计数器:

     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++;
     }

只要文件中有更多输入,这应该循环 10 行,将每一行添加到数组列表中。

【讨论】:

    【解决方案2】:

    看到这个How to read a large text file line by line using Java?

    我认为这会奏效:

    BufferedReader br = new BufferedReader(new FileReader(file));
        String line;
        int i = 0;
        while ((line = br.readLine()) != null)
        {
            if (i < 5)
            {
                // process the line.
                i++;
            }
        }
        br.close();
    

    【讨论】:

      【解决方案3】:
      ArrayList<String> array = new ArrayList<String>();
      //ArrayList of String (because you will read strings)
      BufferedReader reader = null;
      try {
          reader = new BufferedReader(new FileReader("numbers.txt")); //to read the file
      } catch (FileNotFoundException ex) { //file numbers.txt does not exists
          System.err.println(ex.toString());
          //here you should stop your program, or find another way to open some file
      }
      String line; //to store a read line
      int N = 5; //max number of lines to read
      int counter = 0; //current number of lines already read
      try {
          //read line by line with the readLine() method
          while ((line = reader.readLine()) != null && counter < N) { 
          //check also the counter if it is smaller then desired amount of lines to read
              array.add(line); //add the line to the ArrayList of strings
              counter++; //update the counter of the read lines (increment by one)
          }
          //the while loop will exit if:
          // there is no more line to read (i.e. line==null, i.e. N>#lines in the file)
          // OR the desired amount of line was correctly read
          reader.close(); //close the reader and related streams
      } catch (IOException ex) { //if there is some input/output problem
          System.err.println(ex.toString());
      }
      

      【讨论】:

      • 为什么要使用ArrayList&lt;String&gt;
      • @LuiggiMendoza 因为他的问题是读取 N 行文本文件,独立于文件本身的内容。我认为他说明数字只是为了给我们举个例子
      • 我不这么认为。 OP的意图非常明确。 OP无法实现的唯一部分是读取文件的内容。剩下的代码只是在等待那个缺失的部分来解决这个难题。
      【解决方案4】:
      List<Integer> array = new ArrayList<>();
      try (BufferedReader in = new BufferedReader(
              new InputStreamReader(new FileInputStream("numbers.txt")))) {
          for (int i = 0; i < 5; ++i) { // Loops 5 times
              String line = in.readLine();
              if (line == null) [ // End of file?
                  break;
              }
              // line does not contain line-ending.
              int num = Integer.parseInt(line);
              array.add(i);
          }
      } // Closes in.
      System.out.println(array);
      

      【讨论】:

        【解决方案5】:
        ArrayList<Double> myList = new ArrayList<Double>();
        int numberOfLinesToRead = 5;
        File f = new File("number.txt");
        Scanner fileScanner = new Scanner(f);
        for(int i=0; i<numberOfLinesToRead; i++){
            myList.add(fileScanner.nextDouble());
        }
        

        确保文件中有“numberOfLinesToRead”行。

        【讨论】:

          【解决方案6】:
            BufferedReader br = new BufferedReader(new FileReader(file));
            List<String> nlines = IntStream.range(0, hlines)
              .mapToObj(i -> readLine(br)).collect(Collectors.toList());
          
            String readLine(BufferedReader reader) { 
              try { 
                return reader.readLine();
              } catch (IOException e) { 
                throw new UncheckedIOException(e);
              }
            } 
          

          【讨论】:

          • 你也可以选择 .filter(line -> line != null)
          【解决方案7】:

          你可以这样做:

          try (BufferedReader reader = Files.newBufferedReader(Paths.get("numbers.txt"))) {
              List<String> first10Numbers = reader.lines().limit(10).collect(Collectors.toList());
              // do something with the list here
          }
          

          作为 JUnit 测试的完整示例:

          public class ReadFirstLinesOfFileTest {
          
              @Test
              public void shouldReadFirstTenNumbers() throws Exception {
                  Path p = Paths.get("numbers.txt");
                  Files.write(p, "0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n".getBytes());
          
                  try (BufferedReader reader = Files.newBufferedReader(Paths.get("numbers.txt"))) {
                      List<String> first10Numbers = reader.lines().limit(10).collect(Collectors.toList());
                      List<String> expected = Arrays.asList("0", "1", "2", "3", "4", "5", "6", "7", "8", "9");
                      Assert.assertArrayEquals(expected.toArray(), first10Numbers.toArray());
                  }
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2015-04-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-08-15
            • 2010-12-18
            • 1970-01-01
            • 2019-02-28
            相关资源
            最近更新 更多