[英]Simple stream read/write question in java
我正在尝试通过URLConnection上传文件,但我需要将其读/写为二进制文件而不进行任何编码更改。
所以我试图从FileInputStream
读取byte[]
数组,但现在我有一个问题。 我用于输出到服务器的PrintWriter
对象不允许我执行writer.write(content)
(其中content
的类型为byte[]
)。 我怎样才能解决这个问题? 或者是否有另一种方法可以快速将二进制数据从FileInputStream
复制到PrintWriter
?
谢谢
我打赌这是对这个问题的后续跟进:将文件从Java客户端上传到HTTP服务器
如果要使用multipart/form-data
上传二进制文件,则需要将它们写入OutputStream
。 这是我在上一个示例中发布的代码更改示例,只更改了try
块以保留二进制输出流的单独句柄,这样您就可以将任何InputStream
写入其中,而无需任何编码难度:
OutputStream output = null;
PrintWriter writer = null;
try {
output = connection.getOutputStream();
writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8"), true); // true = Autoflush, important!
writer.println("--" + boundary);
writer.println("Content-Disposition: form-data; name=\"paramToSend\"");
writer.println("Content-Type: text/plain; charset=UTF-8");
writer.println();
writer.println(paramToSend);
writer.println("--" + boundary);
writer.println("Content-Disposition: form-data; name=\"fileToUpload\"; filename=\"" + fileToUpload.getName() + "\"");
writer.println("Content-Type: " + URLConnection.guessContentTypeFromName(fileToUpload.getName());
writer.println("Content-Transfer-Encoding: binary");
writer.println();
InputStream input = null;
try {
input = new FileInputStream(fileToUpload);
byte[] buffer = new byte[1024];
for (int length = 0; (length = input.read(buffer)) > 0;) {
output.write(buffer, 0, length);
}
output.flush();
} finally {
if (input != null) try { input.close(); } catch (IOException logOrIgnore) {}
}
writer.println();
writer.println("--" + boundary + "--");
} finally {
if (writer != null) writer.close();
}
Writer
对象(包括PrintWriter
)专门用于输出字符数据。 听起来你想要一个OutputStream
而不是Writer
。
您的PrintWriter
来自哪里? 如果它被包裹某种创建OutputStream
与OutputStreamWriter
,然后包装,与一个PrintWriter
,那么你应该只使用原来write(byte[] b)
方法从原来OutputStream
,而不是试图用一个Writer
。
如果要混合字符输出和字节输出,可能需要使用String.getBytes()
。 看看这个例子:
OutputStream o = this.conn.getOutputStream(); // Based on your comment
String s = "Hello, world!";
byte[] b = ...; // These are the raw bytes that you want to write
o.write(s.getBytes("UTF-8"));
o.write(b);
(当然,这只有在读取输出的系统理解您正在编写混合字符和原始字节并且知道如何处理您发送它的混合数据时才会起作用。)
您可以在URLConnection上使用'getOutputStream()'。 PrintWriter来自哪里?
您不应该使用PrintWriter,因为它是为文本表示而设计的,并且您需要二进制文件。 一个普通的OutputStream应该这样做,因为Writers都在chars上运行,实质上是文本。
你想达到什么目的?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.