копирование файла в 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 ответа:
Когда вы вызываете
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... варианты)