如何在Java中从大型文本文件中读取整数/双精度

如何在Java中从大型文本文件中读取整数/双精度,java,file,input,pi,Java,File,Input,Pi,我正在为一个研究项目制作一个基于Pi的RN Grandom数字生成器。我在这一点上被难住了,因此我似乎不知道如何读取一个相当大的1GB文件中的数字。以下是输入: ……15926535897932384626433832795028841971693993751058209749445230781640628620892803482534211706782148086513230664709384460955058231725359408128284811174508270193852110555

我正在为一个研究项目制作一个基于Pi的RN Grandom数字生成器。我在这一点上被难住了,因此我似乎不知道如何读取一个相当大的1GB文件中的数字。以下是输入:

……15926535897932384626433832795028841971693993751058209749445230781640628620892803482534211706782148086513230664709384460955058231725359408128284811174508270193852110555964462294930381964410975663344461285683862803482534211707982148086513206647093844609550822317272535941281288181817171717171717190909091456464646464646464646464646464646464646464646464646464646464646464646464646464646484844545438282231535373737171717171717171717171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912983367336244065664308602139494639522473719070217986094370277053921717629317675238467481846766940513200056812714526356082778577134275778960917363717872146844090122495343014654958537105079227968925892354201995611212902196086403441815981362977477130996051870721134999999837297804995105973173281609631859502445945534690830264252230825334468503526193118817101000313783875288658753320838142061717766914730359825349042875546873115956286388235378759375195778185778053217122680661300192787661119590921642019893809525720106548586327886593615338182....

文件很难看我知道。。。它的圆周率是小数点后10亿位。我不会详细说明我为什么要这样做,但这是我的目标。在开始打印输出之前,我希望能够跳过x位小数,我还需要能够一次读出y位连续数字,就像每次输出4位一样:

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

我的基本目标是一次能够打印至少一个数字,因此之后我可以按照我的意愿将它们拼凑在一起。。。因此,基本输出是:

对于输入3.1415。。我得到。。 3,1,4,1,5

我尝试了Java API中的大量文件流,但它只打印字节/位。。。我不知道如何把它们转化成有意义的东西

此外,逐行读取不是最优的,因此我必须让我的数字具有相同的长度,而且我觉得逐行读取会以一种有趣的方式将它们截断。

您需要的是字符流,基本上是的子类,因此您可以逐字符读取,而不是逐字节读取

要实现您的需求,您必须:

列表项 打开包含输入数字的文件的字符流。与文件读取器相比,更喜欢使用BufferedReader来加速I/O,因为逐字符读取可能非常慢,尤其是对于大型文件 您需要跟踪以前读取的字符(如果有),并将相同字符的字符串分组到适当的数据结构(例如StringBuilder)中 如果需要跳过前n个字符,请使用Reader.skipn;一开始 以下代码完全符合我对您的需求的理解:

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培训。1字节=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

..冲洗并重复。抱歉浪费时间。。。但我希望这会让某人找到正确的方向。

为什么你不能读入字节,然后将其转换为字符串?这就是我遇到的问题。ApacheCommons有一组ioutil,它有一个接受字节流的toString方法。这将由您决定何时要切断它,并且它需要一个文件编码。不过我会看看这个。。。从文件中读取数字??假设该文件只包含ASCII数字:、新的Stringbytes、StandardCharsets.US\u ASCII…相当大的文件*。简单的打字错误。文件必须按顺序而不是随机访问,因此这是使用另一个Sudo RNG,这不是我的目标。如果您想在1 GB文件中的任意位置读取,我认为可以查找的随机访问文件是更好的选择。同样,我不能使用任何RNG,我必须按顺序读取数据。@pirate694抱歉,我误解了。我以为您希望从随机选择的点开始读取文件中的数字。请记住,您的解决方案适用于这种情况,因为您正在处理数字。正如大卫·康拉德所说,差异编码是学术性的。与真实人物打交道完全是另一回事。祝你上课好运!是的,我的解决方案就是我想要的。其他任何事情都不在我的问题范围之内。非常感谢。