java中的简单流读/写问题
我正在尝试通过URLConnection上传文件,但我需要将其读/写为二进制文件而不进行任何编码更改。
所以我试图从FileInputStream
读取byte[]
数组,但现在我有一个问题。 我用于输出到服务器的PrintWriter
对象不允许我执行writer.write(content)
(其中content
的类型为byte[]
)。 我怎样才能解决这个问题? 或者是否有另一种方法可以快速将二进制数据从FileInputStream
复制到PrintWriter
?
谢谢
Writer
对象(包括PrintWriter
)专门用于输出字符数据。 听起来你想要一个OutputStream
而不是一个Writer
。
您的PrintWriter
来自哪里? 如果它是通过使用OutputStreamWriter
包装某种OutputStreamWriter
然后用PrintWriter
包装它来创建的,那么你应该只使用原始OutputStream
的原始write(byte[] b)
方法,而不是尝试使用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);
(当然,这只有在读取输出的系统理解您正在编写混合字符和原始字节并且知道如何处理发送它的混合数据时才会起作用。)
我打赌这是对这个问题的后续跟进:将文件从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(); }
您可以在URLConnection上使用’getOutputStream()’。 PrintWriter来自哪里?
您不应该使用PrintWriter,因为它是为文本表示而设计的,并且您需要二进制文件。 一个普通的OutputStream应该这样做,因为Writers都在chars上运行,实质上是文本。
你想达到什么目的?