Похоже, Джерси не поддерживает запись непосредственно в OutputStream, однако после долгих копаний и слияний нескольких разных мыслей я узнал, как мне удалось придумать этот класс.
Джерси поддерживает передачу InputStream в метод post на WebResource, который читается, а содержимое записывается в тело запроса.
Я создаю файл CSV из ResultSet, поэтому я написал класс, которыйрасширяет InputStream, и когда вызывается read (), он получает запись из ResultSet и строит строку файла CSV и возвращает только один символ из строки.Каждый раз, когда вызывается read (), возвращается следующий символ, пока не будет возвращена вся строка, и в этот момент следующая запись будет считана из базы данных, и процесс повторяется до тех пор, пока не останется записей.
Я используюбиблиотека под названием OpenCSV для построения строк файла CSV
public class ResultSetCsvInputStream extends InputStream {
private ResultSet rs;
private int columns;
private int ch;
private byte[] line;
/**
* Construct a new SchemaInputStream
* @param rs
* @throws SQLException
*/
public ResultSetCsvInputStream(ResultSet rs) throws SQLException {
this.rs = rs;
// write column names
ResultSetMetaData meta = rs.getMetaData();
columns = meta.getColumnCount();
String[] colNames = new String[columns];
for(int i = 0; i < colNames.length; i++) {
colNames[i] = meta.getColumnName(i+1);
}
writeLine(colNames);
}
private void writeLine(String[] ln) {
StringWriter strWriter = new StringWriter();
CSVWriter csv = new CSVWriter(strWriter);
csv.writeNext(ln);
line = strWriter.toString().getBytes(Charset.forName("UTF8"));
ch = 0;
}
@Override
public int read() throws IOException {
if(rs == null)
return -1;
// read the next line
if(line == null || ch >= line.length) {
// query next line
try {
if(rs.next()) {
String[] record = new String[columns];
for(int i = 0; i < record.length; i++) {
record[i] = rs.getString(i+1);
}
writeLine(record);
}
else {
rs = null;
return -1;
}
} catch (SQLException e) {
throw new IOException(e);
}
}
// read next character
return line[ch++] & 0xFF;
}
}