我正在尝试将非常大的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
。
让我们尝试更直接的方法,qazxsw poi并尝试使用资源来正确关闭所有内容。
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
在Java 8中,一些信息被添加到BigInteger javadoc中,给出了最小支持范围和当前实现的实际限制:
out.flush(); //flush the stream
fos.getFD().sync(); //sync with the OS
实现说明:当结果超出支持范围-2Integer.MAX_VALUE(不包括)到+ 2Integer.MAX_VALUE(不包括)时,BigInteger构造函数和操作会抛出ArithmeticException。
我会说,字符串大小可能是限制。
您应该能够获得长度为Integer.MAX_VALUE的字符串(Java规范始终为2147483647(231-1),数组的最大大小,String类用于内部存储)或最大堆大小的一半(从每个字符都是两个字节),以较小者为准。
是的,当我们需要具有任意精度的非常大的数字时使用它。重要的是要注意“任意”精度或数字位数并不意味着“无限制”:它意味着计算中精度数字或位数的位数受内存和/或定义的精度限制的限制我们指定的。