Java 如何";“有效地”;使用InputStream逐行读取文本文件?
我正在编写一个Java小程序,并试图读取一个220K行(9.2MB)的文本文件,我正在用Java 如何";“有效地”;使用InputStream逐行读取文本文件?,java,applet,inputstream,Java,Applet,Inputstream,我正在编写一个Java小程序,并试图读取一个220K行(9.2MB)的文本文件,我正在用.jar存档该文件。我相信我对文本文件的唯一合理访问是InputStream。为了使用InputStream读取我的文本文件,我滚动了自己的逐行读取程序,如下所示 但是,对我自己的逐行读卡器使用InputStream会导致java.lang.OutOfMemoryError:java堆空间。关于如何读取文本文件(我正试图将其与.jar小程序捆绑在一起)有什么建议吗 下面是我逐行读取InputStream的尝试
.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
。我没有意识到后两个读者是可能的。简单的错误,但是谢谢你的帮助!