java中的简单流读/写问题

java中的简单流读/写问题,java,io,Java,Io,我试图通过URLConnection上传一个文件,但我需要将其作为二进制文件进行读/写,而不需要任何编码更改 因此,我尝试从文件输入流读取字节[]数组,但现在我遇到了一个问题。我用于输出到服务器的PrintWriter对象不允许我执行writer.write(content)(其中content的类型为byte[])。我怎样才能解决这个问题?或者有没有其他方法可以将二进制数据从文件输入流快速复制到打印写入程序 谢谢您不应该使用PrintWriter,因为它是为文本表示而设计的,您需要二进制。一个

我试图通过URLConnection上传一个文件,但我需要将其作为二进制文件进行读/写,而不需要任何编码更改

因此,我尝试从
文件输入流
读取
字节[]
数组,但现在我遇到了一个问题。我用于输出到服务器的
PrintWriter
对象不允许我执行
writer.write(content)
(其中
content
的类型为
byte[]
)。我怎样才能解决这个问题?或者有没有其他方法可以将二进制数据从
文件输入流
快速复制到
打印写入程序


谢谢

您不应该使用PrintWriter,因为它是为文本表示而设计的,您需要二进制。一个普通的输出流就可以了,就像作家们都在字符上操作一样,本质上就是文本

您希望实现什么?

对象(包括)专门用于输出字符数据。听起来你想要一个而不是
编写器

你的
PrintWriter
来自哪里?如果它是通过使用
OutputStreamWriter
包装某种
OutputStreamWriter
然后使用
PrintWriter
创建的,那么您应该使用原始
write(byte[]b)
方法,而不是尝试使用
Writer

如果要混合字符输出和字节输出,可能需要使用。看看这个例子:

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()”。打印作者来自哪里?

我敢打赌这是对这个问题的后续回答:

如果还想使用
多部分/表单数据上传二进制文件
,则需要将它们写入
输出流
。这是我在上一个示例中发布的代码更改示例,仅更改了
try
块以保留二进制输出流的单独句柄,这样您就可以在不进行任何编码的情况下将任何
InputStream
s写入其中:

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();
}

所有的编写器都用于文本(字符)输出。我希望有一个可以将字符和二进制数据写入的流。基本上,我正在构造一个包含文本参数(表单数据)和二进制数据(文件)的HTTP请求@Marius您实际上想要一个包含编码二进制数据(文本)和未编码二进制数据的流。接收者必须找出哪个是什么。在我看来,您应该更改您的模型并使用消息,例如,使用XML实现,其中包含结构化文本部分和二进制内容的cdata部分。@Marius或者当然,如果该模型更合适,可以使用HTTP并发送一些标题中的文本,以及二进制数据作为内容。@extraneon:接收器没有问题。XML不是一个选项,因为我需要一个任何web服务器都可以处理的符合HTTP协议的POST请求。问题在于将数据写入其中。难道没有任何方法可以将字符和二进制数据输出到同一个输出流吗?但是,我如何将字符数据输出到输出流呢?现在使用println()非常方便。PrintWriter来自:writer=newprintWriter(newOutputStreamWriter(this.conn.getOutputStream(),“UTF-8”)
println()
确实很方便,但不幸的是,它只适用于编码字符数据。如果要推送未编码的字节,则需要使用
write()
而不是
println()
。是否有任何方法将UTF-8编码的字符串传递给write(),例如将其转换为byte[]或类似的内容?这将使我能够使用write()编写文本数据,并解决byte[]数组的问题。请参阅我编辑的答案-我已经在研究解决方案了。:-)PrintWriter来自:writer=新的PrintWriter(新的OutputStreamWriter(this.conn.getOutputStream(),“UTF-8”)@Marius:Writer用于文本数据,对于二进制数据,只使用outstream(Reader/InputStream也是如此)。当你只想传输二进制数据时,你难道不想知道为什么你必须提供编码(
“UTF-8”
)吗?@Joachim Sauer:是的,这就是为什么我来到这个论坛来寻找解决方案,因为sun的文档说明我不需要witers:)不管怎样,问题现在已经解决了,谢谢大家的帮助。@BalusC:你说得对:)我自己设法修改了代码,尽管它现在看起来与你的不同,因为它在一个单独的http连接类中,允许对我需要的进行更多的控制。顺便问一下,println是否依赖于操作系统(不同操作系统的不同端点)?HTTP不需要\r\n行结尾吗?就我所测试的而言,它并不太在意,但仍然。。。如果做得正确就好了。当我有足够的时间以防万一时,我会浏览一下你在另一篇文章中给我的RFC链接。这只是一个开始的例子:)我(我们)不打算用100个类/方法(包括文档等等)以体面的OO方式编程整件事;)那是你的工作。实际上,
\r\n
被指定为行分隔符。您可以自己动手,也可以通过
-Dline.separator=0xA0xD
左右来配置系统默认的行分隔符。是的,是的,我知道,这足够清楚,可以让它成为一个体面的OO;]谢谢你的帮助;]