姑苏城外 2016-11-11 03:34 采纳率: 33.3%
浏览 1104

java swing打开文件的程序,提示内存溢出

 package newtest;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class Test {

    public static void main(String[] args) {
        final Test test = new Test();
        JFrame f= new JFrame();
        JPanel p = new JPanel();
        p.setLayout(new BorderLayout());
        f.setContentPane(p);
        final JTextArea t = new JTextArea();
        JButton b = new JButton("确定");
        b.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                StringBuffer testyy = test.getFileContext("E:\\test.txt");
                t.setText(testyy.toString());
            }
        });
        p.add(t, BorderLayout.CENTER);
        p.add(b, BorderLayout.SOUTH);

        f.setSize(200, 400);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }

    /**
     * 读取文件上下文
     * @param filePath
     *      文件路径
     * @return
     */
    public StringBuffer getFileContext(String filePath) {
        StringBuffer fileContext = new StringBuffer();
        if(filePath != null && !filePath.equals("")) {
            File file = new File(filePath);
            if(file.exists()) {
                if(file.isFile()) {
                    BufferedReader bf = null;
                    InputStreamReader  isr = null;
                    FileInputStream fis = null;
                    try {
                        fis = new FileInputStream(filePath);

                        isr = new InputStreamReader(fis, "GBK");
                        bf = new BufferedReader(isr);
                        String context = null;
                        while ((context=bf.readLine()) != null) {
                            fileContext.append(context);
                            fileContext.append("\n");
                        }
                    } catch (UnsupportedEncodingException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                        System.out.println("获取文件上下文:文件"+filePath+"不支持编码格式");
                    } catch (FileNotFoundException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                        System.out.println("获取文件上下文:文件"+filePath+"未找到");
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                        System.out.println("获取文件上下文:文件"+filePath+"读取失败");
                    } finally {
                        try {
                            if(bf != null) {
                                bf.close();
                            }
                            if(isr != null) {
                                isr.close();
                            }
                            if(fis != null) {
                                fis.close();
                            }
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                } else {
                    System.out.println("文件:"+filePath+"是文件夹无法读取");
                }
            } else {
                System.out.println("文件:"+filePath+"不存在");
            }
        } else {
            System.out.println("获取文件上下文:读取路径为空");
        }
        return fileContext;
    }



}

打开上百兆文件直接提示内存溢出,我用2M小文件测试,用jvisualvm查看发现,内存占用最多的是char[] 和 JTextarea,试了好多方法还是不行,求大神帮帮忙,下图为2M小文件测试的结果:
图片说明
图片说明

  • 写回答

1条回答 默认 最新

  • devmiao 2016-11-11 03:58
    关注
    评论

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?