Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何";“有效地”;使用InputStream逐行读取文本文件?_Java_Applet_Inputstream - Fatal编程技术网

Java 如何";“有效地”;使用InputStream逐行读取文本文件?

Java 如何";“有效地”;使用InputStream逐行读取文本文件?,java,applet,inputstream,Java,Applet,Inputstream,我正在编写一个Java小程序,并试图读取一个220K行(9.2MB)的文本文件,我正在用.jar存档该文件。我相信我对文本文件的唯一合理访问是InputStream。为了使用InputStream读取我的文本文件,我滚动了自己的逐行读取程序,如下所示 但是,对我自己的逐行读卡器使用InputStream会导致java.lang.OutOfMemoryError:java堆空间。关于如何读取文本文件(我正试图将其与.jar小程序捆绑在一起)有什么建议吗 下面是我逐行读取InputStream的尝试

我正在编写一个Java小程序,并试图读取一个220K行(9.2MB)的文本文件,我正在用
.jar
存档该文件。我相信我对文本文件的唯一合理访问是
InputStream
。为了使用
InputStream
读取我的文本文件,我滚动了自己的逐行读取程序,如下所示

但是,对我自己的逐行读卡器使用
InputStream
会导致
java.lang.OutOfMemoryError:java堆空间
。关于如何读取文本文件(我正试图将其与
.jar
小程序捆绑在一起)有什么建议吗

下面是我逐行读取
InputStream
的尝试:

public class InputStreamUtil {
    private static final int _CR = 13;
    private static final int _LF = 10;
    private int _last = -1; // The last char we've read
    private int _ch = -1; // currently read char
    private InputStream in;

    public InputStreamUtil(InputStream i) {
        in = i;
    }

    /**
     * Read a line of data from the underlying inputstream
     * 
     * @return a line stripped of line terminators
     */
    public String readLine() throws IOException {
        StringBuffer sb = new StringBuffer("");
        if (_last != -1)
            sb.append((char) _last);
        _ch = in.read();
        while (_ch != _CR && _ch != _LF) {
            sb.append((char) _ch);
            _ch = in.read();
        }
        // Read the next byte and check if it's a LF
        _last = in.read();
        if (_last == _LF) {
            _last = -1;
        }
        return (new String(sb));
    }
}
以下是小程序控制台的完整错误:

ed reader.
Read file input lines...
Exception caught: java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:3326)
    at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:137)
    at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:121)
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:622)
    at java.lang.StringBuffer.append(StringBuffer.java:383)
    at utilities.InputStreamUtil.readLine(InputStreamUtil.java:28)
    at utilities.CensusResultsCalculator.parseCensusData(CensusResultsCalculator.java:216)
    at utilities.CensusResultsCalculator.getResultsSequentially(CensusResultsCalculator.java:101)
    at logic.PopulationCalculatorVersion1.<init>(PopulationCalculatorVersion1.java:33)
    at logic.InteractionHandler.preprocess(InteractionHandler.java:101)
    at visualization.USMaps.pqPreprocess(USMaps.java:575)
    at visualization.MapPane.update(MapPane.java:328)
    at java.util.Observable.notifyObservers(Observable.java:159)
    at java.util.Observable.notifyObservers(Observable.java:115)
    at visualization.InteractionPane.initMapGrid(InteractionPane.java:233)
    at deploy.WebApplet.init(WebApplet.java:206)
    at deploy.WebApplet$1.run(WebApplet.java:67)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:301)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:744)
    at java.awt.EventQueue.access$400(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:697)
    at java.awt.EventQueue$3.run(EventQueue.java:691)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:714)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
ed阅读器。
读取文件输入行。。。
捕获到异常:java.lang.OutOfMemoryError:java堆空间
java.lang.OutOfMemoryError:java堆空间
位于java.util.Arrays.copyOf(Arrays.java:3326)
位于java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:137)
位于java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:121)
位于java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:622)
位于java.lang.StringBuffer.append(StringBuffer.java:383)
在utilities.InputStreamUtil.readLine(InputStreamUtil.java:28)
在utilities.CensusResultsCalculator.parseCensusData(CensusResultsCalculator.java:216)上
在utilities.CensusResultsCalculator.GetResultsSequential(CensusResultsCalculator.java:101)中
位于logic.PopulationCalculatorVersion1.(PopulationCalculatorVersion1.java:33)
位于logic.InteractionHandler.preprocess(InteractionHandler.java:101)
位于visualization.USMaps.pqPreprocess(USMaps.java:575)
在visualization.MapPane.update(MapPane.java:328)上
在java.util.Observable.notifyObservators(Observable.java:159)
在java.util.Observable.notifyObservators(Observable.java:115)
位于visualization.InteractionPane.initMapGrid(InteractionPane.java:233)
位于deploy.WebApplet.init(WebApplet.java:206)
在deploy.WebApplet$1.run(WebApplet.java:67)
在java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:301)中
位于java.awt.EventQueue.dispatchEventImpl(EventQueue.java:744)
在java.awt.EventQueue.access$400(EventQueue.java:97)
位于java.awt.EventQueue$3.run(EventQueue.java:697)
位于java.awt.EventQueue$3.run(EventQueue.java:691)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
位于java.awt.EventQueue.dispatchEvent(EventQueue.java:714)
位于java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
在java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)中
位于java.awt.EventDispatchThread.PumpeEventsforHierarchy(EventDispatchThread.java:105)
位于java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
位于java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
在java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
我相信我对文本文件的唯一合理访问是InputStream

为什么?

使用BufferedReader。每秒数百万行


而且你自己的代码中没有bug,值得注意的是,您没有在可能出现的任何地方检查流结束。

为什么不使用BufferedReader?我错误地排除了
BufferedReader
,因为
FileInputStream
InputStreamReader
BufferedReader
的典型链接不适用于小程序。相反,我将
URL
链接到
InputStream
InputStreamReader
BufferedReader
。我没有意识到后两个读者是可能的。简单的错误,但是谢谢你的帮助!