I've created a Java program to create a csv
file, write data into it and then send its contents to the server.
Locally, everything works fine. But the problem is that I don't have write access to the server (permission denied problem).
So, I can't do any chmod 777
.
I'm looking for a way to create a csv
file without saving into the file system. Something like write into a flow or a stream. I don't really know how it works.
Any help please ?
This was what I have done so far:
public void exportAllToCSV(@PathVariable int id,HttpServletResponse response) throws IOException
String csvFile="test.csv";
File file = new File("test.csv");
//some treatments to get datas (headers and values)
FileWriter writer = new FileWriter(csvFile);
CsvBuilder.writeLine(writer, headers);
CsvBuilder.writeLine(writer, values);
writer.flush();
writer.close();
response.setContentType("text/csv");
response.setHeader("Content-Disposition", "attachment; filename=" + csvFile);
final BufferedReader br = new BufferedReader(new FileReader(file));
try {
String line;
while ((line = br.readLine()) != null) {
response.getWriter().write(line + "\n");
}
} finally {
br.close();
}
try {
file.delete(); // I delete the file
} catch (Exception e) {
e.printStackTrace();
}
Assuming that CsvBuilder.writeLine(...)
does only accept an instance of java.io.Writer
, why not using java.io.StringWriter
and java.util.Scanner
?
// ...
StringWriter writer = new StringWriter();
CsvBuilder.writeLine(writer, headers);
CsvBuilder.writeLine(writer, values);
writer.flush();
response.setContentType("text/csv");
response.setHeader("Content-Disposition", "attachment; filename=test.csv");
Scanner scanner = new Scanner(new StringReader(writer.toString()));
while (scanner.hasNext()) {
response.getWriter().write(scanner.next() + "\n");
}
// ...
However, I think Andrei Makarevich's answer using response.getWriter()
directly is probably the most forward approach. Although, I'm not sure if the line feeds will be added by CsvBuilder
since your adding them explicitly!?