簡體   English   中英

使用Java將非常大的BigIntegers打印到文件中

[英]Printing very large BigIntegers to a file in Java

我正在嘗試將非常大的BigInteger打印到.txt文件,但是當數量達到一定大小時,它什么都不打印。 碼:

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沒有大小限制,所以我的問題是:我超出了什么限制,有沒有辦法解決這個問題?

編輯:當嘗試刷新並關閉文件編寫器時,我得到了這個例外:

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

編輯:問題只發生在Eclipse中運行程序時,我嘗試將其導出到外部jar,一切正常。 我正在使用Eclipse Mars.1發行版(4.5.1)和Java jre1.8.0_131和Cp1252編碼。

我大多猜測這里。 我猜這個問題來自BufferWriter

讓我們嘗試更直接的OutputstreamOutputstream並嘗試使用資源來正確關閉所有內容。

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 + "'");
}

我在過去看到過一些操作系統同步問題,但是文件永遠不會丟失數據,數據只是復制了一個小的延遲...但為什么不... write ,只需等待操作系統驗證數據是在文件中刷新(不在OS緩存中)

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

在Java 8中 ,一些信息被添加到BigInteger javadoc中,給出了最小支持范圍和當前實現實際限制

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

實現說明 :當結果超出支持范圍-2Integer.MAX_VALUE(不包括)到+ 2Integer.MAX_VALUE(不包括)時,BigInteger構造函數和操作會拋出ArithmeticException。

我會說,字符串大小可能是限制。

您應該能夠獲得長度為Integer.MAX_VALUE的字符串(Java規范始終為2147483647(231-1),數組的最大大小,String類用於內部存儲)或最大堆大小的一半(從每個字符都是兩個字節),以較小者為准。

是的,當我們需要具有任意精度的非常大的數字時使用它。 重要的是要注意“任意”精度或數字位數並不意味着“無限制”:它意味着計算中精度數字或位數的位數受內存和/或定義的精度限制的限制我們指定的。

暫無
暫無

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

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