我正在尝试将很大的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时,输出文件为空,而不是包含数字.目标是拥有1000000,甚至更大的指数.
我以为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.
让我们尝试使用更直接的方法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 + "'");
}
我在过去曾见过一些操作系统同步问题,但文件从不丢失数据,只是复制了一些延迟的数据……但是为什么不……在写完之后,只需等待操作系统验证数据在文件中刷新(不在操作系统缓存中)
out.flush(); //flush the stream
fos.getFD().sync(); //sync with the OS
标签:biginteger,limit,size,java
来源: https://codeday.me/bug/20191110/2014903.html