姑苏城外 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
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog