Простой поток чтения / записи вопроса в Java - PullRequest
4 голосов
/ 19 марта 2010

Я пытаюсь загрузить файл через URLConnection, но мне нужно прочитать / записать его как двоичный файл без каких-либо изменений кодировки.

Итак, я попытался прочитать массив byte[] из FileInputStream, но теперь у меня проблема. Объект PrintWriter, который я использую для вывода на сервер, не позволяет мне делать writer.write(content) (где content имеет тип byte[]). Как я могу это исправить? Или есть другой способ быстро скопировать двоичные данные из FileInputStream в PrintWriter?

Спасибо

Ответы [ 4 ]

6 голосов
/ 19 марта 2010

Могу поспорить, что это продолжение этого вопроса: Загрузка файлов из Java-клиента на HTTP-сервер

Если вы хотите также загрузить двоичные файлы, используя multipart/form-data, тогда вам нужно вместо этого записать их в OutputStream.Вот измененный пример кода, который я опубликовал в предыдущем примере, только блок 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();
}
2 голосов
/ 19 марта 2010

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

(Конечно, это будет работать, только если система, которая читает ваш вывод, понимает, что вы пишете смесь символов и необработанных байтов, и знает, как обрабатывать смешанные данные, которые вы отправляете.)

2 голосов
/ 19 марта 2010

Вы можете использовать getOutputStream () в вашем URLConnection. Откуда приходит PrintWriter?

1 голос
/ 19 марта 2010

Не следует использовать PrintWriter, так как он предназначен для представления text , и вам нужен двоичный файл. Простой OutputStream должен делать, так как все Writers оперируют символами, по сути, текстом.

Чего вы хотите достичь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...