Получить OuputStream для тела запроса, используя Jersey Client? - PullRequest
3 голосов
/ 02 ноября 2010

Я не хочу публиковать файл CSV в веб-сервисе с использованием клиента Jersey без необходимости буферизовать содержимое CSV в памяти.

Итак, я начал с некоторого кода, похожего на этот:

String csvContent = [the buffered CSV content];
Client c = Client.create();
WebResource r = c.resouce("http://example.com/services/service");
r.type("text/csv").post(csvContent);

Я бы хотел избежать буферизации всего содержимого CSV в памяти перед отправкой на сервер. Мне известно, что я могу отправить объект File с помощью клиента, и трикотаж будет обрабатывать загрузку и отправку файла, однако в этом случае Контент CSV будет сгенерирован автоматически, поэтому мне бы хотелось просто записать его в OutputStream, который направляется непосредственно на сервер, а не в память ... Есть ли способ сделать это с помощью клиента Jersey?

1 Ответ

1 голос
/ 02 ноября 2010

Похоже, Джерси не поддерживает запись непосредственно в 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;

 }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...