2017-11-17 33 views
3

非常に大きなBigIntegerを.txtファイルに印刷しようとしていますが、数値が一定のサイズに達すると何も印刷されません。コード:非常に大きなBigIntegerをJavaのファイルに出力する

BigInteger bi = new BigInteger("16777216"); 
int exponent = 1000000; 
bi = bi.pow(exponent); 

String txtToPrint = bi.toString(); 
sendToFile(txtToPrint, "output.txt"); 

private static void sendToFile(String txtToPrint, String fileName) { 

     try { 

      FileWriter fileWriter = new FileWriter(fileName); 
      BufferedWriter bufferedWriter = new BufferedWriter(fileWriter); 
      bufferedWriter.write(txtToPrint); 

      bufferedWriter.close(); 
     } 
     catch(IOException e) { 
      System.out.println("Error writing to file '" + fileName + "'"); 
     } 

} 

指数が566より大きい場合は常に、数値を含む代わりに出力ファイルが空になります。目標は1 000 000、またはそれ以上の指数を持つことです。

私はBigIntegerにサイズ制限がないと思ったので、私の質問は次のとおりです。これを超えると、この問題を解決する方法はありますか?

EDIT:フラッシュしてFileWriterを閉じようとすると、私はこの例外を得た:

java.io.IOException: Stream closed 
at sun.nio.cs.StreamEncoder.ensureOpen(Unknown Source) 
at sun.nio.cs.StreamEncoder.flush(Unknown Source) 
at java.io.OutputStreamWriter.flush(Unknown Source) 
at PrintInt.main(PrintInt.java:4 

EDIT:Eclipseでプログラムを実行するときに問題が発生し、私は外部のjarファイルにエクスポートしようとした、とすべてがうまくいった。私はEclipse Mars.1 Release(4.5.1)とJava jre1.8.0_131とCp1252エンコーディングを使用しています。

+0

FYI(いないOSのキャッシュに)ファイル内のflushです:_Iはとても '整数、BigIntegerのサイズは、配列の大きさには限界があるlimit_持っていなかったと思いました。 MAX_VALUE'(ある値からマイナス)桁です。しかし、その指数で、あなたはOKであるべきです... – AxelH

+0

私はあなたのコードをテストし、私のファイルはcorrect.7056KBです... – AxelH

+0

@AxelHなぜそれがあなたのためではなく、私のために働いているのか分かりますか? – Rudy

答えて

0

私は、文字列のサイズはおそらく限界であると言います。

あなたにInteger.MAX_VALUE長さの文字列を取得することができなければならない(常に2147483647(231 - Java仕様、Stringクラスは、内部ストレージに使用するアレイの最大サイズにより、1))又は半最大ヒープサイズ(各文字は2バイトなので)のいずれか小さい方。

BigInteger must support values in the range -2Integer.MAX_VALUE (exclusive) to +2Integer.MAX_VALUE (exclusive) and may support values outside of that range. 

実装注

1

は、Java 8において、いくつかの情報は、サポートされる最小範囲と現在の実装の実際の限界を与えて、BigIntegerのJavadocを加えたBigInteger結果が-2Integer.MAX_VALUE(これを含まない)から+ 2Integer.MAX_VALUE(これを含まない)の範囲外にある場合、ArithmeticExceptionがスローされます。

+0

本当ですが、ここでは問題ではありません。ここの値はそれほど大きくありません。 'BigInteger'が正しく計算されました – AxelH

+1

返事ありがとうございます。スローされた例外は印刷されますか?プログラムを実行したときにエラーは表示されませんでした。 – Rudy

+0

@Rudy私の考えは、実際の文字列サイズが問題かもしれないということでしょう。誰かがすぐ下にそれを言いましたが、ヒープサイズの1/2のチャンスが2バイトごとにすべての文字を保持するのに十分ではありませんか?もしそれが制限要因であれば、例外も出力もないでしょう。 – G2M

0

はいこれは、任意の精度で非常に大きな数値が必要な場合に使用されます。 「任意の」精度または桁数は、「無制限」を意味するわけではないことに注意することが重要です。つまり、計算での精度の桁数または桁数は、メモリおよび/または定義された限界から精度に制限されます。私たちが指定します。

2

私はここでほとんど推測しています。私は問題がBufferWriterから来たと思います。

より直接的にお答えください。Outputstreamを試してみて、すべてを適切に終了するようリソースを試してみましょう。

File f = new File(fileName); 
try (
     FileOutputStream fos = new FileOutputStream(f); 
     OutputStreamWriter os = new OutputStreamWriter(fos); 
     Writer out = new BufferedWriter(os) 
){ 
    out.write(txtToPrint); 
} catch(IOException e) { 
    System.out.println("Error writing to file '" + fileName + "'"); 
} 

私は過去にいくつかのOSの同期の問題を、それを見てきましたが、ファイルは、データを失うことはありません、データは単に遅れて、小さなにコピーされます...しかし、なぜ... write後、待つだけではありませんデータを検証するためにOSのため

out.flush(); //flush the stream 
fos.getFD().sync(); //sync with the OS 
+0

ありがとう。私はこれを試してみましたが、残念なことに結果は同じでした。また、出力をコンソールに出力することもできません。 – Rudy

+0

@Rudy、コンソールについては、[Eclipseの制限](https://stackoverflow.com/questions/34535561/not-able-to-print-very-large-strings-in-java-neither-in-eclipse- ) – AxelH

+0

それは意味がありますが、数値はコンソールに出力を停止し、同じ指数で出力します(0126)。 – Rudy

関連する問題