Простой способ записать содержимое Java InputStream в OutputStream

Если вы хотите прочитать файл по строкам (здесь разделитель строк == '\n'), просто сделайте это:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv)
{
        FILE *fp;
        char *buffer;
        int ret;

        // Open a file ("test.txt")
        if ((fp = fopen("test.txt", "r")) == NULL) {
                fprintf(stdout, "Error: Can't open file !\n");
                return -1;
        }
        // Alloc buffer size (Set your max line size)
        buffer = malloc(sizeof(char) * 4096);
        while(!feof(fp))
        {
                // Clean buffer
                memset(buffer, 0, 4096);
                // Read a line
                ret = fscanf(fp, "%4095[^\n]\n", buffer);
                if (ret != EOF) {
                        // Print line
                        fprintf(stdout, "%s\n", buffer);
                }
        }
        // Free buffer
        free(buffer);
        // Close file
        fclose(fp);
        return 0;
}

Enjoy:)

410
задан ArtB 21 August 2013 в 19:30
поделиться

5 ответов

PipedInputStream и PipedOutputStream могут быть несколько полезными, поскольку можно подключить тот к другому.

0
ответ дан Arktronic 21 August 2013 в 19:30
поделиться

Нет никакого способа сделать это намного легче с методами JDK, но как Apocalisp уже отметил, Вы не единственный с этой идеей: Вы могли использовать IOUtils от Джакарта Commons IO , он также имеет много других полезных вещей, что IMO должен на самом деле быть частью JDK...

8
ответ дан WMR 21 August 2013 в 19:30
поделиться

Я думаю, что это будет работать, но удостоверяться, что протестировало его... незначительное "улучшение", но это могло бы быть что-то вроде стоимости в удобочитаемости.

byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) != -1) {
    out.write(buffer, 0, len);
}
96
ответ дан Mike Stone 21 August 2013 в 19:30
поделиться

Как WMR упомянула, org.apache.commons.io.IOUtils от Apache имеет метод, названный copy(InputStream,OutputStream) , который делает точно, что Вы ищете.

Так, Вы имеете:

InputStream in;
OutputStream out;
IOUtils.copy(in,out);
in.close();
out.close();

... в Вашем коде.

там причина, которой Вы избегаете IOUtils?

385
ответ дан POSTHUMAN 21 August 2013 в 19:30
поделиться

PipedInputStream и PipedOutputStream должен только использоваться, когда у Вас есть несколько потоков, как отмеченный Javadoc.

кроме того, обратите внимание, что входные потоки и потоки вывода не переносят прерываний потока с IOException с... Так, необходимо рассмотреть слияние политики прерывания к коду:

byte[] buffer = new byte[1024];
int len = in.read(buffer);
while (len != -1) {
    out.write(buffer, 0, len);
    len = in.read(buffer);
    if (Thread.interrupted()) {
        throw new InterruptedException();
    }
}

Это было бы полезным дополнением, если Вы ожидаете использовать этот API для копирования больших объемов данных или данных из потоков, которые застревают в течение невыносимо долгого времени.

16
ответ дан mkobit 22 August 2013 в 06:30
поделиться
  • 1
    Я думаю, что самая интересная часть является тем, что printf делает не , требуют дополнительного параметра для каждого %m. – luiscubal 14 December 2013 в 10:15
Другие вопросы по тегам:

Похожие вопросы: