Java 以字节[]的形式读取二进制文件,并以字符[]的形式从servlet发送

Java 以字节[]的形式读取二进制文件,并以字符[]的形式从servlet发送,java,Java,我有一个servlet,它读取二进制文件并将其发送给客户端 byte[] binaryData = FileUtils.readFileToByteArray(path); response.getWriter().print(new String(binaryData)); 它适用于非二进制文件。当我有一个二进制文件时,我得到的接收文件长度比原始文件大,或者接收的文件不一样。如何读取和发送二进制数据 谢谢。不是通过作者。编写器用于文本数据,而不是二进制数据。您当前的代码试图使用系统默认编码将

我有一个servlet,它读取二进制文件并将其发送给客户端

byte[] binaryData = FileUtils.readFileToByteArray(path);
response.getWriter().print(new String(binaryData));
它适用于非二进制文件。当我有一个二进制文件时,我得到的接收文件长度比原始文件大,或者接收的文件不一样。如何读取和发送二进制数据

谢谢。

不是通过作者。编写器用于文本数据,而不是二进制数据。您当前的代码试图使用系统默认编码将任意二进制数据解释为文本。那真是个坏主意

您需要一个输出流-因此请使用response.getOutputStream,并将二进制数据写入其中:

response.getOutputStream().write(FileUtils.readFileToByteArray(path));
不是通过作者。编写器用于文本数据,而不是二进制数据。您当前的代码试图使用系统默认编码将任意二进制数据解释为文本。那真是个坏主意

您需要一个输出流-因此请使用response.getOutputStream,并将二进制数据写入其中:

response.getOutputStream().write(FileUtils.readFileToByteArray(path));

不要使用Writer,它将添加字符编码,并且不会像您所经历的那样始终存在1:1映射。而是直接使用OutputStream

如果你不需要立即阅读全部内容,请避免阅读。为许多并行请求提供服务将很快消耗内存。FileUtils有用于此的方法

FileUtils.copyFile(path, response.getOutputStream());

不要使用Writer,它将添加字符编码,并且不会像您所经历的那样始终存在1:1映射。而是直接使用OutputStream

如果你不需要立即阅读全部内容,请避免阅读。为许多并行请求提供服务将很快消耗内存。FileUtils有用于此的方法

FileUtils.copyFile(path, response.getOutputStream());

这是我第二个问题的答案,关于在标题中自动添加字符集。谢谢这是我第二个问题的答案,关于在标题中自动添加字符集。谢谢