Не делайте этого для больших файлов:
byte[] bytesToSend = myFile.getBytes();
Это неэффективно, и вам нужно место в куче для хранения данных всего файла.Вы теряете много места в куче, когда сначала полностью читаете файл, а потом пишете его полностью.
Вместо этого читайте / записывайте данные файла кусками определенного размера из файла непосредственно в ответ.Вы можете написать код самостоятельно или просто использовать служебный класс, такой как IOUtils
из Apache Commons IO.
Важно не читать весь файл, прежде чем писать его.Вместо этого делайте это небольшими кусками.Используйте здесь потоки и избегайте всего, что связано с byte [], за исключением буферизации и небольших фрагментов.
Редактировать: Вот код с Apache IO ...
public static void main(String[] args) {
HttpExchange exchange = ...;
OutputStream responseBody = null;
try {
File file = new File("big-file.txt");
long bytesToSkip = 4711; //detemine how many bytes to skip
exchange.sendResponseHeaders(200, file.length() - bytesToSkip);
responseBody = exchange.getResponseBody();
skipAndCopy(file, responseBody, bytesToSkip);
}
catch (IOException e) {
// handle it
}
finally {
IOUtils.closeQuietly(responseBody);
}
}
private static void skipAndCopy(File src, @WillNotClose OutputStream dest, long bytesToSkip) throws IOException {
InputStream in = null;
try {
in = FileUtils.openInputStream(src);
IOUtils.skip(in, bytesToSkip);
IOUtils.copyLarge(in, dest);
}
finally {
IOUtils.closeQuietly(in);
}
}