为什么我制作的基本Java十六进制编辑器会冻结大小在2MB及以上的文件?

为什么我制作的基本Java十六进制编辑器会冻结大小在2MB及以上的文件?,java,swing,hex,Java,Swing,Hex,好的,我正在用Java编写一个十六进制编辑器,当我加载一个2MB或更大的文件时,它就冻结了。但是没有出现错误,所以我不确定发生了什么。有人能帮我吗?代码如下: 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 ja

好的,我正在用Java编写一个十六进制编辑器,当我加载一个2MB或更大的文件时,它就冻结了。但是没有出现错误,所以我不确定发生了什么。有人能帮我吗?代码如下:

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();
 }
}
import java.awt.*;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.*;
导入java.util.Vector;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.InputStream;
公共类HexEditor扩展了JFrame{
JScrollPane;
JScrollPane-byteScroll;
JPanel小组;
JTextareahexarea;
JTextareabytearea;
JFileChooser chooser;//=new JFileChooser();
文件输入流鳍;
梅努巴;
JMenu文件;
项目负荷;
公共编辑(){
超级(“Cypri的java十六进制编辑器”);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
chooser=newjfilechooser();
加载=新项目(“加载”);
load.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件){
试一试{
openFile();
fin=新文件输入流(chooser.getSelectedFile());
int-ch;
StringBuffer strContent=新StringBuffer(“”);
对于(int i=0;(ch=fin.read())!=-1;i++){
字符串s=整数。toHexString(ch);
如果(s.长度()<2)
s=“0”+整数.tohextstring(ch);
如果(i<10)
追加(“+s.toUpperCase());
否则{
strContent.append(“+s.toUpperCase()+”\n”);
i=0;
}
}
setText(strContent.toString());
字节[]b=HextStringToByteArray(strContent.toString().trim());
char[]chars=新字符[b.长度];
字符串byteText=“”;
int newLine=0;
for(int i=0;i10){
byteText+=“\n”;
换行=0;
}
}
setText(strContent.toString());
byteArea.setText(byteText);
packMe();
}
捕获(例外e){
e、 printStackTrace();
}
}
});
文件=新JMenu(“文件”);
文件。添加(加载);
menuBar=newjmenubar();
menuBar.add(文件);
hexArea=新的JTextArea();
byteArea=新的JTextArea();
hexScroll=newJScrollPane(ScrollPaneConstants.VERTICAL\u SCROLLBAR\u ALWAYS,ScrollPaneConstants.HORIZONTAL\u SCROLLBAR\u ALWAYS);
byteScroll=新的JScrollPane(ScrollPaneConstants.VERTICAL\u SCROLLBAR\u ALWAYS,ScrollPaneConstants.HORIZONTAL\u SCROLLBAR\u ALWAYS);
panel=新的JPanel();
面板。添加(十六进制滚动);
面板。添加(byteScroll);
setViewportView(hexArea);
byteScroll.setViewportView(byteArea);
六区域设置首选尺寸(新尺寸(200200));
byteArea.setPreferredSize(新尺寸(200200));
setPreferredSize(新维度(200200));
byteScroll.setPreferredSize(新尺寸(200200));
getContentPane().setLayout(新的BorderLayout());
getContentPane().add(BorderLayout.NORTH,菜单栏);
getContentPane().add(BorderLayout.CENTER,panel);
包装();
setVisible(真);
}
公共静态字节[]hexStringToByteArray(字符串s){
int len=s.length()-1;
字节[]数据=新字节[(len/2)+1];
对于(int i=0;i数据[i/2]=(字节)((Character.digit(s.charAt(i),16)2MB将产生一个大字符串。您需要将文件分成多个页面进行显示,并且一次只转换几KB的缓冲区。

是否需要缓冲FileInputStream?或者操作系统是否已经注意到不是每次读取都会命中磁盘?