копирование файла в Java с помощью FileStream


Я хочу скопировать файл на Java с помощью FileStream. Это мой код.

FileInputStream infile = new FileInputStream("in");
FileOutputStream outfile = new FileOutputStream("out");

byte[] b = new byte[1024];
while(infile.read(b, 0, 1024) > 0){
    outfile.write(b);
}

infile.close();
outfile.close();

Я использую vim для просмотра моего файла.
Входной файл " in "

Hello World1
Hello World2
Hello World3

Выходной файл "output"

Hello World1
Hello World2
Hello World3
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@...

В выходном файле есть много дополнительных '^@'.
Размер входного файла-39 байт.
А размер выходного файла - 1 КБ.
Почему в выходном файле так много лишних символов?

4 3

4 ответа:

Когда вы вызываете infile.read, возвращаемое значение сообщает вам, сколько элементов вы получаете обратно. Когда вы вызываете outfile.write, вы говорите ему, что буфер заполнен, потому что вы не сохранили количество байтов, которые вы получили обратно от вызова read.

Чтобы исправить эту проблему, сохраните количество байтов, а затем передайте нужное число в write:

byte[] b = new byte[1024];
int len;
while((len = infile.read(b, 0, 1024)) > 0){
    outfile.write(b, 0, len);
}

Вы пытаетесь скопировать 1024 байт из файла в другой. Это плохо сработает. Попробуйте читать по размеру файла.

FileInputStream infile = new FileInputStream("in");
FileOutputStream outfile = new FileOutputStream("out");

byte[] b = new byte[infile.getChannel().size()];
while(infile.read(b, 0, infile.getChannel().size()) > 0){
    outfile.write(b);
}

infile.close();
outfile.close();

Размер массива b [] равен 1 КБ. Дополнительный символ " @ " добавляется, чтобы показать, что в файле все еще есть неиспользуемое пространство. Технически вы копируете файл в массив байтов и записываете массив but в выходной файл. Вот почему возникает эта проблема.

Самый простой способ скопировать файл-это вызов одного метода
1. до Java 7 - с в Google гуава библиотека
кОм.Гугл.общие.Ио.Файлы#копию(файл с, Файл to)
2. на Яве 7 & 8
Ява.НИО.файл.Файлы#copy (источник пути, цель пути, CopyOption... варианты)