2016-03-04 5 views
3

Я хочу скопировать файл на 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 для просмотра своего файла.
входного файла "в"

Hello World1 
Hello World2 
Hello World3 

выходного файла "Выход"

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

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

ответ

5

Когда вы вызываете 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); 
} 
+0

Спасибо. Оно работает. –

1

Вы пытаетесь скопировать 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(); 
+0

Что произойдет, если размер файла слишком велик? –

+0

Вероятно, это даст вам исключение 'java.lang.OutOfMemoryError'. В этом случае вы все равно можете увеличить память, хотя ... – DDan

0

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

+0

Спасибо, мне это очень помогает. –

 Смежные вопросы

  • Нет связанных вопросов^_^