Если вы хотите прочитать файл по строкам (здесь разделитель строк == '\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:)
PipedInputStream и PipedOutputStream могут быть несколько полезными, поскольку можно подключить тот к другому.
Нет никакого способа сделать это намного легче с методами JDK, но как Apocalisp уже отметил, Вы не единственный с этой идеей: Вы могли использовать IOUtils от Джакарта Commons IO , он также имеет много других полезных вещей, что IMO должен на самом деле быть частью JDK...
Я думаю, что это будет работать, но удостоверяться, что протестировало его... незначительное "улучшение", но это могло бы быть что-то вроде стоимости в удобочитаемости.
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
Как WMR упомянула, org.apache.commons.io.IOUtils
от Apache имеет метод, названный copy(InputStream,OutputStream)
, который делает точно, что Вы ищете.
Так, Вы имеете:
InputStream in;
OutputStream out;
IOUtils.copy(in,out);
in.close();
out.close();
... в Вашем коде.
там причина, которой Вы избегаете IOUtils
?
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 для копирования больших объемов данных или данных из потоков, которые застревают в течение невыносимо долгого времени.
%m
.
– luiscubal
14 December 2013 в 10:15