当前位置: 代码迷 >> J2SE >> BufferedReader有关问题
  详细解决方案

BufferedReader有关问题

热度:56   发布时间:2016-04-24 01:03:48.0
BufferedReader问题
Java code
            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("c:/temp")));            String line = null;            while ((line = br.readLine()) != null) {                this.jTextArea1.append(line);                this.jTextArea1.append("\n");            }            br.close();

请问上面这段代码 读取文件放到TextArea上面的操作,文件稍大,就会内存溢出,
BufferedReader是如何对内存进行操作的?

改用FileChannel 和 MappedByteBuffer就不会产生该问题,请问各位为什么呀?

------解决方案--------------------
又试了下,选了temp文件大小是11213650 bytes

Java code
import java.io.BufferedReader;import java.io.FileInputStream;import java.io.InputStreamReader;import java.io.RandomAccessFile;import java.nio.CharBuffer;import java.nio.MappedByteBuffer;import java.nio.channels.FileChannel;import java.nio.charset.Charset;import java.nio.charset.CharsetDecoder;import javax.swing.JTextArea;public class Test {        public static void main(String[] args) throws InterruptedException {        long startFreeMemory = Runtime.getRuntime().freeMemory();        System.out.println("start free memory is: " + startFreeMemory);        try {            new Test().go1();                        long endFreeMemory = Runtime.getRuntime().freeMemory();            System.out.println("end free memory is: " + endFreeMemory);        } catch (Exception e) {            long endFreeMemory = Runtime.getRuntime().freeMemory();            System.out.println("end free memory is: " + endFreeMemory);                        e.printStackTrace();        }    }        public void go1() throws Exception {        FileChannel fChannel = new RandomAccessFile("temp", "r").getChannel();        MappedByteBuffer mByteBuffer = fChannel.map(FileChannel.MapMode.READ_ONLY, 0, fChannel.size());        Charset charset = Charset.forName("iso-8859-1");        CharsetDecoder decoder = charset.newDecoder();        CharBuffer charBuffer = CharBuffer.allocate(1024);        charBuffer = decoder.decode(mByteBuffer);        JTextArea jta = new JTextArea();        System.out.println("set text length = " + new String(charBuffer.array(), 0, charBuffer.limit()).length());                jta.setText(new String(charBuffer.array(), 0, charBuffer.limit()));        fChannel.close();    }        public void go2() throws Exception {        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("temp")));        String line = null;        JTextArea jta = new JTextArea();        while ((line = br.readLine()) != null) {            jta.append(line);            System.out.println(line);            jta.append("\n");        }        br.close();    }}