Will Print Writer, возвращенный HttpServletResponse, использует BufferedWriter - PullRequest
0 голосов
/ 06 апреля 2020

Я работаю над приложением Spring Boot 2.2 и хочу предоставить Rest API для загрузки CSV-файла. Я записываю свои данные CSV в Writer, возвращаемое HttpServletResponse.

    @RequestMapping(value = "/api", method = RequestMethod.GET)
    public void messages(HttpServletResponse response) throws IOException {
        PrintWriter writer = response.getWriter();
        CSVWritter.write(writer, dataService.fetchAllUsers());
        writer.flush();
    }

В соответствии с HttpServletResponse API Java do c метод записи возвращает PrintWriter. Но при загрузке Spring Ссылка не относится к классу PrintWriter, если она была org.springframework.security.web.util.OnCommittedResponseWrapper $ SaveContextPrintWriter [делегат = org. apache .catalina.connector. CoyoteWriter@37ef8360]

Я хочу, чтобы данные записывались в браузер порциями, т.е. они сбрасываются в браузер только при заполнении буфера. Таким образом, средство записи, возвращаемое объектом ответа, является средством записи с буферизацией или использует внутренне средство записи с буферизацией?

1 Ответ

0 голосов
/ 06 апреля 2020

Документы ServletResponse не являются явными, но наличие методов flushBuffer(), getBufferSize() и setBufferSize() строго подразумевает, что выходной поток / средство записи действительно буферизовано.

С практической точки зрения необходимо установить Content-Length (или поддерживать чанкированное кодирование, когда длина содержимого неизвестна заранее).

NB: PrintWriter - декоратор ; это не внутренне буферизовано, но может украсить писателя, который буферизован. Ссылки на «очищение» в его документах касаются того, вызывает ли он явно flush() на украшенном Writer после каждой записи.

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