цель состоит в том, чтобы загрузить файл из URI и сопоставить его с существующей моделью данных. эта модель данных называется FileNode
и имеет свойство типа InputStream
(это InputStream
представляет данные файла). Я не знаю, как это сделать. Я попытался использовать Spring RestTemplate
, но он закрывает ответ InputStream
в своем методе doExecute
(все RestTemplate
шаблонные методы в конечном итоге делегируются этому методу). затем я попытался расширить RestTemplate и прокомментировать код, закрывающий Response InputStream:
@Override
protected <T> T doExecute(URI url, HttpMethod method, RequestCallback requestCallback, ResponseExtractor<T> responseExtractor) throws RestClientException {
Assert.notNull(url, "URI is required");
Assert.notNull(method, "HttpMethod is required");
ClientHttpResponse response = null;
try {
ClientHttpRequest request = createRequest(url, method);
if (requestCallback != null) {
requestCallback.doWithRequest(request);
}
response = request.execute();
handleResponse(url, method, response);
return (responseExtractor != null ? responseExtractor.extractData(response) : null);
}
catch (IOException ex) {
String resource = url.toString();
String query = url.getRawQuery();
resource = (query != null ? resource.substring(0, resource.indexOf('?')) : resource);
throw new ResourceAccessException("I/O error on " + method.name() +
" request for \"" + resource + "\": " + ex.getMessage(), ex);
}
finally {
/**** when to close the response? can I use a proxy for the response's InputStream that closes this response when itself is closed?****/
if(!(responseExtractor instanceof CloseableResponseExtractor)) //?!
if (response != null) {
response.close();
}
}
}
, тогда я подумал, что это должен быть более простой способ, поэтому я отправил этот вопрос.
примечание: Я немедленно отправляю файл посреднику сообщений, то есть мне не нужно сохранять его в памяти. и я не думаю, что это хорошая идея, чтобы сохранить файл в памяти или на диске, а затем выполнить потоковую передачу оттуда, потому что размер файла может быть слишком большим, я не знаю! на самом деле мой код должен быть очень тонким слоем между инфраструктурой (устаревшие коды + брокер сообщений + ...) и остальным API, и я думаю, что если я сначала запишу его на диск, это сильно повлияет на время отклика (мне нужно написать и читать с диска!). Каковы ваши рекомендации?
Какова наилучшая практика для этого сценария и как обычно это делается?
спасибо!