I have a Java program that reads some text from a file, line by line, and writes new text to an output file. But not all the text I write to my BufferedWriter
appears in the output file after the program has finished. Why is that?
The details: the program takes a CSV text document and converts it into SQL commands to insert the data into a table. The text file has more than 10000 lines which look similar to following:
2007,10,9,1,1,1006134,19423882
The program seems to work fine except it just stops in the file randomly half way through creating a new SQL statement having printed it into the SQL file. It looks something like:
insert into nyccrash values (2007, 1, 2, 1, 4, 1033092, 259916);
insert into nyccrash values (2007, 1, 1, 1, 1, 1020246, 197687);
insert into nyccrash values (2007, 10, 9, 1
This happens after about 10000 lines but several hundred lines before the end of the file. Where the break happens is between a 1
and a ,
. However, the characters doesn't seem important because if I change the 1
to a 42
the last thing written to the new file is 4
, which is cutting off the 2 from that integer. So it seems like the reader or writer must just be dying after writing/reading a certain amount.
My Java code is as follows:
import java.io.*;
public class InsertCrashData
{
public static void main (String args[])
{
try
{
//Open the input file.
FileReader istream = new FileReader("nyccrash.txt");
BufferedReader in = new BufferedReader(istream);
//Open the output file.
FileWriter ostream = new FileWriter("nyccrash.sql");
BufferedWriter out = new BufferedWriter(ostream);
String line, sqlstr;
sqlstr = "CREATE TABLE nyccrash (crash_year integer, accident_type integer, collision_type integer, weather_condition integer, light_condition integer, x_coordinate integer, y_coordinate integer);\n\n";
out.write(sqlstr);
while((line = in.readLine())!= null)
{
String[] esa = line.split(",");
sqlstr = "insert into nyccrash values ("+esa[0]+", "+esa[1]+", "+esa[2]+", "+esa[3]+", "+esa[4]+", "+esa[5]+", "+esa[6]+");\n";
out.write(sqlstr);
}
}
catch(Exception e)
{
System.out.println(e);
}
}
}
you dint close your BufferedWriter.close it inside a finally block
you dint close your BufferedWriter.close it inside a finally block
This works. I have faced the same issue and this worked for me..Good Luck :)
You need to close your
OutputStream
which will flush the remainder of your data:The default buffer size for
BufferedWriter
is 8192 characters, large enough to easily hold hundreds of lines of unwritten data.Your code does not appear to be closing the writer after you've finished writing to it. Add an
out.close()
(preferably in a finally block) and it should work properly.You must
close()
yourBufferedWriter
. You mustclose()
yourBufferedWriter
because it IS-AWriter
and thus implementsAutoCloseable
, which means (emphasis added) it isSome people say you must first call
flush()
for yourBufferedWriter
before callingclose()
. They are wrong. The documentation forBufferedWriter.close()
notes that it "Closes the stream, flushing it first" (emphasis added).The documented semantics of flushing (
flush()
) areSo, you must
close
, andclose
will flush any buffered output.Your output file does not include all the text you wrote to your
BufferedWriter
because it stored some of that text in a buffer. TheBufferedWriter
never emptied that buffer, passing it through to the file, because you never told it to do so.Since Java 7, the best way to ensure an
AutoCloseable
resource, such as aBufferedWriter
, is closed when it is not longer need is to use automatic resource management (ARM), also known as try-with-resources:You must also
close
yourBufferedReader
when it is no longer need, so you should have nested try-with-resources blocks:Always close your resources (not just files) when you're done with them.
There might be situations when you want to flush the buffer without closing the file. In these situations you can use the flush-method.