views:

55

answers:

1

Alright, so I'm writing a hex editor in Java and when I load in a file around 2MB or bigger it just freezes. No errors show up though, so I'm not sure whats going on. Can anyone help me? This is the code:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;
import java.util.Vector;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

public class HexEditor extends JFrame{
 JScrollPane hexScroll;
 JScrollPane byteScroll;
 JPanel panel;
 JTextArea hexArea;
 JTextArea byteArea;
 JFileChooser chooser;// = new JFileChooser();
 FileInputStream fin;
 JMenuBar menuBar;
 JMenu file;
  JMenuItem load;

 public HexEditor(){
  super("Cypri's java hex editor");
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

  chooser = new JFileChooser();

  load = new JMenuItem("Load");
   load.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent event) {

     try{

      openFile();
      fin = new FileInputStream(chooser.getSelectedFile());

      int ch;
      StringBuffer strContent = new StringBuffer("");

      for(int i = 0; (ch = fin.read()) != -1; i++){
       String s = Integer.toHexString(ch);

       if(s.length() < 2)
        s = "0" + Integer.toHexString(ch);

       if(i < 10)
        strContent.append(" " + s.toUpperCase());

       else{
        strContent.append(" " + s.toUpperCase() + "\n");
        i = 0;
       }
      }

      hexArea.setText(strContent.toString());

      byte[] b = hexStringToByteArray(strContent.toString().trim());
      char[] chars = new char[b.length];
      String byteText = "";
      int newLine = 0;
      for(int i = 0; i < b.length; i++){
       chars[i] = (char) b[i];
       byteText += chars[i];

       newLine++;
       if(newLine > 10){
        byteText += "\n";
        newLine = 0;
       }
      }

      hexArea.setText(strContent.toString());
      byteArea.setText(byteText);
      packMe();
     }

     catch(Exception e){
      e.printStackTrace();
     }
    }
   });

  file = new JMenu("File");
  file.add(load);

  menuBar = new JMenuBar();

  menuBar.add(file);

  hexArea = new JTextArea();
  byteArea = new JTextArea();

  hexScroll = new JScrollPane(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
  byteScroll = new JScrollPane(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);

  panel = new JPanel();

  panel.add(hexScroll);
  panel.add(byteScroll);
  hexScroll.setViewportView(hexArea);
  byteScroll.setViewportView(byteArea);

  hexArea.setPreferredSize(new Dimension(200,200));
  byteArea.setPreferredSize(new Dimension(200,200));

  hexScroll.setPreferredSize(new Dimension(200,200));
  byteScroll.setPreferredSize(new Dimension(200,200));

  getContentPane().setLayout(new BorderLayout());
  getContentPane().add(BorderLayout.NORTH, menuBar);
  getContentPane().add(BorderLayout.CENTER, panel);
  pack();
  setVisible(true);
 }

 public static byte[] hexStringToByteArray(String s) {
     int len = s.length() -1;
     byte[] data = new byte[(len / 2) + 1];
     for (int i = 0; i < len; i += 2) {
         data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i+1), 16));
     }
     return data;
 }


 public void openFile(){
  chooser.showOpenDialog(null);
 }

 public void packMe(){
  pack();
 }

 public static void main(String[] args){
     HexEditor app = new HexEditor();
 }
}
+1  A: 

2MB would already result in a big String. You need to break the file into pages for display, and only convert a buffer of a few KB at once.

Thilo