簡體   English   中英

如何從Java中的大型文本文件讀取整數/雙精度數

[英]How to read integers/doubles from a large text file in Java

我正在為研究項目制作基於Pi的RNG(隨機數生成器)。 我現在很困惑,因此我似乎無法弄清楚如何從一個相當大的文件(1GB)中讀取數字。 這是輸入:

........

我知道文件很丑...它的Pi達到小數點后10億位。 我沒有詳細說明為什么要這樣做,但這是我的目標。 我希望能夠在開始打印輸出之前跳過x個小數位,我還需要一次能夠讀取y個連續數字,所以如果一次是4,則輸出看起來像:

1111 \\ n 2222 \\ n 3333 \\ n 4444 \\ n ....

我的基本目標是能夠一次打印至少一個數字,因此之后我可以按自己的意願將它們拼湊在一起。因此,基本輸出是:

輸入3.1415 ..我得到.. 3,1,4,1,5 ....

我試過一堆來自Java API的文件流,但它只輸出字節/位...我不知道如何將它們轉換為有意義的東西。

另外,逐行讀取也不是最佳選擇,因此我必須讓我的數字長度相同,並且我覺得逐行讀取會以一種有趣的方式切斷它們。

您需要的是一個字符流 ,基本上是Reader的子類,因此您可以按字符讀取字符,而不是按字節讀取。

為了實現您的需求,您將必須:

  • 項目清單
  • 在包含您輸入數字的文件中打開字符流。 最好使用BufferedReader而不是FileReader來加快I / O速度,因為逐字符讀取char可能非常慢,尤其是對於大文件
  • 您將需要跟蹤先前讀取的字符(如果有),並在適當的數據結構(例如StringBuilder )中將相同字符的字符串分組。
  • 如果需要跳過前n字符,請使用Reader.skip(n); 在開始時

以下代碼完全符合我對您的要求的理解:

public class Test {
  public static void main(String[] args) {
    final char decimalSeparator = ',';
    try (Reader reader = new BufferedReader(new FileReader("pi.txt"))) {
      int prevC = -1; // previous character read from the stream
      int c; // latest character read from the stream
      StringBuilder sb = new StringBuilder();
      while ((c = reader.read()) != -1) {
        // if first digit or same as previous digit
        if ((prevC == -1) || (c == prevC)) {
          sb.append((char) c);
        } else {
          // print the group of digits and reset sb
          if (sb.length() > 0) {
            System.out.println(sb.toString());
            sb = new StringBuilder();
          }
          sb.append((char) c);
        }
        prevC = c;
      }
      // print the last digits group
      if (sb.length() > 0) {
        System.out.println(sb.toString());
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

好的,我已經與CS教授交談過,看來我已經忘記了基本的Java培訓。 1Byte = 1個字符。 在這種情況下,BufferedInputReader會為這些字符吐出ASCII值。 這是簡單的解決方案:

FileInputStream ifs = new FileInputStream(pi); //Input File containing 1 billion digits
BufferedInputStream bis = new BufferedInputStream(ifs);
System.out.println((char)bis.read()); //Build strings or parse chars how you want

..沖洗並重復。 很抱歉浪費時間...但是我希望這能使某人踏上正確的道路。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM