Получение значения NULL в конце при записи в файл - PullRequest
0 голосов
/ 27 ноября 2011

У меня проблема при записи в файл.Я хочу записать содержимое моего входного файла в выходной файл, но при записи в файл я получаю значение NULL, записанное в конце файла.

В чем причина этого?

Myкод:

 import java.io.BufferedReader;
 import java.io.DataInputStream;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStreamReader;


 public class FileReading {

/**
 * @param args
 * @throws IOException 
 */
public static void main(String[] args) throws IOException {
    // TODO Auto-generated method stub

    FileInputStream fi=new  
  FileInputStream("E:\\Tejas\\NewData_FromNov\\New_Folder\\bb.txt");
    DataInputStream di=new DataInputStream(fi);

    BufferedReader buf=new BufferedReader(new InputStreamReader(di));
    FileOutputStream fout=new FileOutputStream("E:\\Tejas\\NewData_FromNov\\New_Folder\\Out_bb.txt");
    int ss;

    byte[] input=new byte[500];
    int len=input.length;

    while((ss=di.read(input,0,len))!=-1)
    {
        System.out.println(ss);
        //fout.write(ss);
        fout.write(input,0,len);

    }
    fout.close();

}

 }

Ответы [ 2 ]

4 голосов
/ 27 ноября 2011

Вы всегда записываете полный буфер, даже если вы читаете только его часть, потому что третий аргумент write равен len (длина буфера) вместо ss (числопрочитанных байтов).Ваш цикл должен выглядеть следующим образом:

int bytesRead; // Easier to understand than "ss"
byte[] buffer = new byte[500];

while((bytesRead = di.read(buffer, 0, buffer.length)) != -1)
{
    System.out.println(bytesRead);
    fout.write(buffer, 0, bytesRead);
}

Дополнительно:

  • Вы должны закрыть оба входных и выходных потока в блоках finally, чтобы они всегда были закрыто (даже если есть исключение).
  • Вам не нужен DataInputStream - просто FileInputStream здесь хорошо.
  • Вы не используете свой BufferedReader вообще.
  • Попробуйте использовать Guava или аналогичную стороннюю библиотеку, которая содержит служебные методы для всего этого.
3 голосов
/ 27 ноября 2011

Метод read возвращает количество фактически прочитанных байтов или -1, если достигнут конец потока. Поэтому вы должны писать только ss байтов, а не len байтов:

while ((ss = di.read(input, 0, len)) != -1) {
    System.out.println(ss);
    fout.write(input, 0, ss);
}

Обратите внимание, что DataInputStream и BufferedReader здесь совершенно не нужны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...