2017-10-15 1 views
1

나는 자바 프로그래밍의 초보자이고 자바에서 16 진수 뷰어를 만들려고하는데, 나의 IDE는 Netbeans이다. 아래는 코드입니다.16 진수 뷰어 Java에서

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import static java.lang.System.out; 
import javax.swing.JFileChooser; 

public class hope { 

     public static void main(String[] args) throws IOException { 

     JFileChooser open = new JFileChooser(); 
     open.showOpenDialog(null); 
     File f = open.getSelectedFile(); 
     InputStream is = new FileInputStream(f); 

     int bytesCounter = 0; 
     int value = 0; 
     StringBuilder sbHex = new StringBuilder(); 
     StringBuilder sbResult = new StringBuilder(); 

     while ((value = is.read()) != -1) { 
      //convert to hex value with "X" formatter 
      sbHex.append(String.format("%02X ", value)); 

      //if 16 bytes are read, reset the counter, 
      //clear the StringBuilder for formatting purpose only. 
      if (bytesCounter == 15) { 
       sbResult.append(sbHex).append("\n"); 
       sbHex.setLength(0); 
       bytesCounter = 0; 
      } else { 
       bytesCounter++; 
      } 
     } 

     //if still got content 
     if (bytesCounter != 0) { 
      //add spaces more formatting purpose only 
      for (; bytesCounter < 16; bytesCounter++) { 
       //1 character 3 spaces 
       sbHex.append(" "); 
      } 
      sbResult.append(sbHex).append("\n"); 
     } 

     out.print(sbResult); 
     is.close(); 
    } 
} 

문제는 다음과 같습니다 1. 그것은 충분히 빠르게 파일을 읽을 수 없습니다 "그것은 200킬로바이트의 파일을 읽을 분 소요" 2. "메모리 부족"나는 시도 오류를 제공 큰 파일 예 80mb

원하는 작업 : 1. "16 진수 코드를 읽고"모든 파일 크기의 16 진수 표시 " 2. 오류 코드없이 모든 크기의 파일을 읽습니다.

[질문 :

내가 변경하거나 "내가 그것을하고 싶어"위를 달성하기 위해 내 코드에 추가해야합니까?

+0

[예제] (http://www.gubatron.com/blog/2009/04/20/how-to- make-a-quick-dirty-hexviewer 업데이트 /). – DevilsHnd

+0

@DevilsHnd, 고맙습니다.하지만 코드는 2009 년 이후에 만들어졌습니다. 개선해야 할 부분이 많이 있으며, 어떤 이유로 인해 제대로 작동하지 않을지 생각합니다. 초보자라는 것을 기억하십시오. 주석이없는 Java 코드는 이해하고 편집하기가 어렵습니다. –

+0

'sbHex.append()'와'sbResult.append()'대신에'out.print()'만을 쓰는게 어떨까요? 어쩌면 StringBuilder를 사용하는 것은 불필요한 것입니까? – gregn3

답변

1

이 간단한 예제에서 핵심은 "버퍼링 된"입력 스트림을 사용하는 것입니다.

InputStream is = new FileInputStream(f); 

에 : 코드 줄을 변경

InputStream is = new BufferedInputStream(new FileInputStream(f)); 

당신은 훨씬 더 나은 결과를 얻을 것이다.

(그러나 Out of Memory 오류를 수정하려면 현재 모든 데이터를 하나의 문자열로 "캐싱"하여 모든 메모리를 먹을 수 있으므로 다른 방법을 고려해야합니다. 각 문자열 작성기를 인쇄하거나 지우십시오. 카운터가 15 이상이되면? 저희에게 알려주세요 :

+0

@ YK S 고맙습니다. 내가 초보자라는 것을 기억하십시오. –

+0

그래서 코드와 파일 (약 12M)을 사용하여 빠른 테스트를 수행하고 while 루프 이전/이후에 타임 스탬프를 출력하고 결과는 다음과 같습니다. Before (InputStream 사용) : 59sec After (BufferedInputStream 사용) : 13sec . (죄송합니다. 변경을 한 후에 소스 코드를 다시 컴파일 했습니까? 언젠가 IDE가 자동으로 IDE를 사용하지 않을 것입니다.) –

+0

@YKS를 고맙게 생각하며 IDE를 다시 시작하고 동일한 결과를 얻었습니다. 이 링크를 확인해주십시오. 16 진수 편집기는 Java로 작성되었으며 최대 9 엑사 바이트 크기의 파일을 읽습니다 (http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22com.github.javadev % 22 % 20and % 20a % 3A % 22hexeditor % 22) 단지 그것을보고 싶습니다. 16 진수를 편집하고 싶지 않습니다. 그렇다면 개발자는 메모리 누수없이 파일 크기를 열 수 있으며 어떻게 열 수 있습니까? 그가 독자적으로 사용할 수 있도록 코드를 구현할 때 사용한 코드의 일부를 가르쳐 주시겠습니까? 나는 내가 많이 묻는 것을 알고있다, 나를 도와주세요. 다시 감사합니다. –

관련 문제