Если вы читаете / записываете двоичные данные, вы должны использовать байтовые потоки (InputStream / OutputStream) вместо символьных потоков и стараться избегать преобразований между байтами и символами, как вы делали в вашем примере.
Вы можете использовать следующий класс для копирования байтов из InputStream в OutputStream:
public class IoUtil {
private static final int bufferSize = 8192;
public static void copy(InputStream in, OutputStream out) throws IOException {
byte[] buffer = new byte[bufferSize];
int read;
while ((read = in.read(buffer, 0, bufferSize)) != -1) {
out.write(buffer, 0, read);
}
}
}
Вы не даете слишком много подробностей о том, как вы связываетесь с клиентом. Это минимальный пример, показывающий, как передавать несколько байтов клиенту сервлета. (Вам потребуется установить несколько заголовков в ответе и соответствующим образом освободить ресурсы).
public class FileServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Some code before
FileInputStream in = new FileInputStream(resourceLocation);
ServletOutputStream out = response.getOutputStream();
IoUtil.copy(in, out);
// Some code after
}
}