淘先锋技术网

首页 1 2 3 4 5 6 7

我正在尝试将很大的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