2017-10-15 105 views
1

我是java編程的初學者,我試圖在java中創建十六進制查看器,我的IDE是Netbeans。以下是代碼。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.它不讀取速度不夠快的文件,「這需要一分鐘閱讀200KB的文件」 2.它提供了「內存不足」時,我嘗試了錯誤大文件例如80mb

我想要它做什麼: 1.以秒爲單位顯示所有的十六進制代碼「讀取並顯示任意大小的文件的十六進制」 2.讀取任何大小的文件,沒有錯誤代碼。

問題:

什麼我需要改變或在我的代碼添加到實現上述「我想要它做」?

+0

看看這個[示例](http://www.gubatron.com/blog/2009/04/20/how-to-讓-A-快速髒hexviewer更新的/)。 – DevilsHnd

+0

謝謝@DevilsHnd,我檢查了一下,但代碼是自2009年以來創建的,我認爲有很多改進要做,並且出於什麼原因我無法實現它,請記住我是新手。沒有評論的Java代碼使我很難理解和編輯。 –

+0

爲什麼不使用'out.print()',而不是'sbHex.append()'和'sbResult.append()'?也許使用StringBuilder是不必要的? – gregn3

回答

1

對於這個簡單的例子,關鍵是使用「緩衝」輸入流。 更改此行的代碼:

InputStream is = new FileInputStream(f); 

到:

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

你會得到一個更好的結果。 (但爲了解決內存不足的錯誤,你必須考慮一種不同的方法,因爲目前你正在將所有數據「緩存」到一個字符串中,這將會佔用你所有的內存。也許每個字符串打印/清除字符串生成器時間計數器達到15或更高?您可以嘗試讓我們知道。:)

+0

謝謝@YK S,我按照你的建議做了,但仍然沒有任何改進。記得我是新手。 –

+0

所以我做了一個使用你的代碼和一個文件(約12M)的快速測試,得到了在while循環之前/之後打印的時間戳,這裏是結果: 之前(使用InputStream):59sec之後(使用BufferedInputStream):13秒。 (對不起,我只是要問:你做了改變後是否重新編譯了你的源代碼?有時IDE不會爲你做) –

+0

謝謝@YKS,我重新啓動了IDE並得到了與你一樣的結果。請檢查這個鏈接,十六進制編輯器是在Java中創建的,並讀取一個文件高達9艾字節(http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22com.github。javadev%22%20AND%20a%3A%22hexeditor%22)我只是想能夠查看它,我不想編輯十六進制。那麼,開發人員如何在沒有內存泄漏的情況下打開這種大小的文件,並且它如何快速打開?你可以指給我一些他用來實現它的代碼,以便我可以自己使用它。我知道我在問很多,請幫助我。再次感謝你。 –