OpenCSV Avoid using FileWriter and return InputStream
Solution 1
Write to an OutpuStreamWriter
itself writing to a ByteArrayOutputStream
, and in the end, you'll have a byte array in memory (by calling getBytes()
on the ByteArrayOutputStream
).
You can then read from this byte array by opening a ByteArrayInputStream
on the byte array.
Solution 2
To supplement the answer JB Nizet gave:
public static byte[] getBeansAsByteArray(final List<YourBean> beans) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
OutputStreamWriter streamWriter = new OutputStreamWriter(stream);
CSVWriter writer = new CSVWriter(streamWriter);
StatefulBeanToCsv<YourBean> beanToCsv = new StatefulBeanToCsvBuilder(writer).build();
beanToCsv.write(beans);
streamWriter.flush();
return stream.toByteArray();
}
Solution 3
This is correct implementation
public static byte[] getBeansAsByteArray(List<YourBean> beans) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
OutputStreamWriter streamWriter = new OutputStreamWriter(stream);
CSVWriter writer = new CSVWriter(streamWriter);
StatefulBeanToCsv<YourBean> beanToCsv = new StatefulBeanToCsvBuilder(writer).build();
beanToCsv.write(beans);
streamWriter.flush();
return stream.toByteArray();
}
Solution 4
Grab a working snippet without StatefulBeanToCsv which I do not prefer.
String[] headers = { "id", "result", "searchTerm"};
ByteArrayOutputStream stream = new ByteArrayOutputStream();
OutputStreamWriter streamWriter = new OutputStreamWriter(stream);
CSVWriter writer = new CSVWriter(streamWriter);
writer.writeNext(headers);
// listOfRows -> business logic collection containing data for csv rows, as you can see I've separated the declaration of headers
listOfRows.forEach(it -> {
writer.writeNext(new String[] {it.getId().toString(), it.getResult(), it.getSearchTerm()});
});
streamWriter.flush();
byte[] byteArrayOutputStream = stream.toByteArray();
Aniks
Updated on June 13, 2022Comments
-
Aniks almost 2 years
I am using OpenCsv and the
new CSVWriter()
method takes a Writer as an argument.What I am trying to achieve is that to avoid writing to the file system and instead return an
InputStream
. I am not sure how to go about this. Not very familiar withStreams
also I am usingJAVA 7
.Is it possible that I could make the writeValues method return an InputStream and avoid writing the output on file system.
This is my working implementation:
private static void writeValues(String[][] cellValues) throws IOException { CSVWriter writer = new CSVWriter(new FileWriter("/tmp/myfile.csv")); for(String[] row : cellValues) { writer.writeNext(row); } writer.close(); }
This is what I want to achieve. How to Convert the above method to avoid using a FileWriter.
private static InputStream writeValues(String[][] cellValues) throws IOException { InputStream inputStream = ?; CSVWriter writer = new CSVWriter(?); for(String[] row : cellValues) { writer.writeNext(row); } writer.close(); return inputStream; }
-
Yogesh D about 5 yearsCan you share your code here as to how you used OutputStreamWriter? I am in the same boat trying to avoid writing to a file and directly return InputStream.
-
Majutharan Majutharan over 3 years@MichaelKemmerzell, see this line CSVWriter writer = new CSVWriter(streamWriter);