2017-11-17 18 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에 크기 제한이 없다고 생각하여 제 질문은 다음과 같습니다. 어떤 제한을 초과하고이 문제를 해결할 수있는 방법이 있습니까?

편집 : 플러시와 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 

편집 : Eclipse에서 프로그램을 실행할 때 문제가 발생, 내가 외부 항아리에 수출을 시도하고, 모든 것이 잘 작동했습니다. Eclipse Mars.1 Release (4.5.1) 및 Java jre1.8.0_131 및 Cp1252 인코딩을 사용하고 있습니다.

+0

FYI (안 OS 캐시) 파일의 높이가 : _i 그래서'정수, BigInteger를이 크기가 배열의 크기에 제한이 있습니다 limit_하지 않았다 생각했다. MAX_VALUE' (일부 값 빼기) 숫자입니다. 그러나 그 지수로, 당신은 괜찮을 것입니다 ... – AxelH

+0

나는 당신의 코드를 테스트했고 나의 파일은 correct.7056KB입니다 ... – AxelH

+0

@AxelH 왜 그것이 당신을 위해, 그리고 나를 위해 일하지 않는지 아십니까? – Rudy

답변

0

나는 문자열 크기가 아마도 제한이라고 말할 것이다.

당신에 Integer.MAX_VALUE 길이의 문자열을 얻을 수 있어야합니다 (항상 2,147,483,647 (231 - 자바 사양, 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

자바 8 일부 정보는 지원되는 최소 범위와 현재 구현의 실제 제한을주는이 BigInteger Javadoc을 첨가 BigInteger를 결과가 -2Integer.MAX_VALUE (이것을 포함하지 않는다) ~ + 2Integer.MAX_VALUE (이것을 포함하지 않는다)의 서포트되고있는 범위를 넘으면, 생성자와 오퍼레이션은 ArithmeticException를 Throw합니다.

+0

사실 그렇지만 여기에는 문제가 없습니다. 여기 값은 그리 크지 않습니다. 'BigInteger'가 올바르게 계산되었습니다 – AxelH

+1

답장을 보내 주셔서 감사합니다. 던져진 예외는 인쇄 되겠습니까? 프로그램을 실행할 때 오류가 인쇄되지 않았습니다. – Rudy

+0

@Rudy 내 생각에 실제 String 크기가 문제 일 수 있습니다. 누군가가 바로 아래에 그것을 언급했지만 기회가 2 분의 1 바이트에있는 모든 문자를 개최하는 힙 크기가 충분하지 않습니다? thats 제한 요소 거기에 아무 예외도없고 내가 가정하는 출력. – 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, 콘솔의 경우 [일식 제한] (https://stackoverflow.com/questions/34535561/not-able-to-print-very-large-strings-in-java-neither-in-eclipse- nor-in-cmd), 아마 유일한 IDE가 아닙니다.) – AxelH

+0

숫자가 콘솔에 출력을 멈추고 같은 지수로 출력을 멈 춥니 다. (567) – Rudy