Как создать файл для потоковой передачи ответа HTTP - PullRequest
0 голосов
/ 14 сентября 2011

Я пишу веб-приложение и хочу, чтобы пользователь мог щелкнуть ссылку и загрузить файл.

У меня есть интерфейс в сторонней библиотеке, который я не могу изменить:

writeFancyData(File file, Data data);

Есть ли простой способ создания файлового объекта, который я могу передать этому методу, который при записи будет транслироваться в ответ HTTP?

Примечания:

Очевидно, я мог бы просто написать временный файл и затем прочитать его обратно, а затем записать в него поток вывода ответа http. Однако я ищу способ избежать ввода-вывода файловой системы. В идеале, путем создания поддельного файла, который при записи будет записывать в выходной поток ответа http.

1012 *, например *

writeFancyData(new OutputStreamBackedFile(response.getOutputStream()), data);

Мне нужно использовать метод writeFancyData, поскольку он записывает файл в очень специфическом формате, который я не могу воспроизвести.

Ответы [ 3 ]

2 голосов
/ 17 сентября 2011

Если предположить, что writeFancyData - это черный ящик, это невозможно. В качестве мысленного эксперимента рассмотрим реализацию writeFancyData, которая сделала что-то вроде этого:

public void writeFancyData(File file, Data data){
    File localFile = new File(file.getPath());
    ... 
    // process data from file
    ...
}

Учитывая, что единственную вещь, которую вы можете вернуть из любой расширенной версии File, это имя пути, вы просто не сможете получить нужные данные в этот метод. Если бы в подписи был какой-то поток, вы бы оказались в гораздо лучшем положении, но, поскольку все, что вы можете передать, это Файл, это сделать невозможно.

На практике реализация, вероятно, является одним из классов FileInputStream или FileReader, которые действительно используют объект File только для имени, а затем вызывают собственные методы, чтобы получить дескриптор файла и обработать фактический ввод / вывод.

1 голос
/ 17 сентября 2011

Поскольку dlawrence пишет API, невозможно определить, что API делает с файлом.

Не Java-подход заключается в создании именованного канала * 1006.*.Вы можете установить в вашей программе программу чтения канала, создать файл по этому пути и передать его в API.

Прежде чем делать что-либо столь интересное, я бы порекомендовал проанализировать производительность и убедиться, что дисковый ввод-вывод действительноузкое место.

1 голос
/ 17 сентября 2011

Учитывая, что API, лучшее, что вы можете сделать, это дать ему File для файла в файловой системе диска RAM.

И подать отчет об ошибке / дефекте в API, запрашивающий перегрузку,принимает аргумент Writer или OutputStream.

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