Read file

A

Anabolik

I try to read the content of file text.txt. The size of this file is
26 Mb. And always I have the error:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2882)
at java.lang.AbstractStringBuilder.expandCapacity
(AbstractStringBuilder.java:100)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:
390)
at java.lang.StringBuffer.append(StringBuffer.java:224)

at lines contents.append(text).append(System.getProperty
("line.separator"));

How can I read and save the content of file. The content of file I
need then in the program to show it in some dialog.

public static void main(String[] args) {
File file = new File("D:\\work\\text.txt");
StringBuffer contents = new StringBuffer();
BufferedReader reader = null;

try {
reader = new BufferedReader(new FileReader(file));
String text = null;

// repeat until all lines is read
while ((text = reader.readLine()) != null)
{
contents.append(text).append(System.getProperty
("line.separator"));
}
} catch (FileNotFoundException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
} finally
{
try
{
if (reader != null)
{
reader.close();
}
} catch (IOException e)
{
e.printStackTrace();
}
}

// show file contents here
System.out.println(contents.toString());
}
 
L

Lew

Anabolik said:
I try to read the content of file text.txt. The size of this file is
26 Mb. And always I have the error:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2882)
at java.lang.AbstractStringBuilder.expandCapacity
(AbstractStringBuilder.java:100)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:
390)
at java.lang.StringBuffer.append(StringBuffer.java:224)

at lines contents.append(text).append(System.getProperty
("line.separator"));

In addition to what others have said, you can use memory more efficiently.
Preallocate the size of the 'contents' object; right now, it has to copy
itself to a larger buffer every time it grows to accomodate more text. You
know you have a 26 MB file but you initially allocate only 16 characters.

Also, use 'StringBuilder' unless you truly need the thread safety of
'StringBuffer'. It doesn't look like you do.

There are other minor ways to improve your code on which I'll comment in line.
How can I read and save the content of file. The content of file I
need then in the program to show it in some dialog.

You're going to show 26 MB in a dialog?
public static void main(String[] args) {
File file = new File("D:\\work\\text.txt");
StringBuffer contents = new StringBuffer(); // StringBuilder
BufferedReader reader = null;

An alternative is to initialize 'reader' in a separate 'try' block so you
don't have to check for 'null' in the later 'finally'. This is just a matter
of style.
try {
reader = new BufferedReader(new FileReader(file));
String text = null;

OTOH, this 'null' initialization is truly redundant. And unnecessary.
Superfluous, even. Plus the scope of 'text' is wider than it need be.
// repeat until all lines is read

This comment doesn't add any clarity or explanation.
while ((text = reader.readLine()) != null)

An alternative idiom that limits the scope of 'text':

for ( String text; (text = reader.readLine()) != null; )
{
contents.append(text).append(System.getProperty
("line.separator"));

Since it's unlikely that this system property will change during the loop, you
could define a variable outside the loop to hold it.
 
R

RedGrittyBrick

Anabolik said:
I try to read the content of file text.txt. The size of this file is
26 Mb.

[snip: Out of Memory]
How can I read and save the content of file. The content of file I
need then in the program to show it in some dialog.

If the only purpose of reading this large text file is to *show* it to a
user, I'd consider reading it in chunks. Each chunk being large enough
to fill the available display space (plus some margin or factor). Then
I'd only read other chunks as needed.

I expect this isn't trivial if you want to be able to wrap lines, scroll
backwards and show scroll-bars that reflect the file size but I imagine
that the standard libraries or third-party libraries have classes that
facilitate or support this.

If the text file is strongly structured I'd consider pre-indexing it or
loading it's content into a DBMS instead.
 
R

Roedy Green

I try to read the content of file text.txt. The size of this file is
26 Mb. And always I have the error:

Exception in thread "main" java.lang.OutOfMemoryError

First try allocating a 100 MB byte array and see if that will fit.

If it does not, you need to either redo your code so that you allocate
nothing but one big 26 MB buffer, or process your file in chunks. You
might do that by scanning your file to find the offsets of the start
of each line, then create an index of the offsets by line number. You
can then read each line given just the line number, with
RandomAccessFile.

--
Roedy Green Canadian Mind Products
http://mindprod.com

"Patriotism is fierce as a fever, pitiless as the grave, blind as a stone, and as irrational as a headless hen."
~ Ambrose Bierce (born: 1842-06-24 died: 1914 at age: 71)
 
A

Arne Vajhøj

Lew said:
An alternative idiom that limits the scope of 'text':

for ( String text; (text = reader.readLine()) != null; )

The while loop version is rather standard in Java for
good or for worse.

Arne

PS: I agree with all the other advice.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,982
Messages
2,570,190
Members
46,736
Latest member
zacharyharris

Latest Threads

Top