在写入文件时最后获取NULL值

时间:2011-11-27 09:09:23

标签: java io

写入文件时遇到问题。我想将输入文件的内容写入输出文件,但在写入文件时,我在文件末尾写入了NULL值。

背后的原因是什么?

我的代码是:

 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 个答案:

答案 0 :(得分:4)

你总是写出完整的缓冲区,即使你只是读取了它的一部分,因为write的第三个参数是len(缓冲区的长度)而不是{{ 1}}(读取的字节数)。你的循环应如下所示:

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
  • 考虑使用Guava或类似的包含实用程序方法的第三方库来完成所有这些工作。

答案 1 :(得分:3)

read方法返回实际读取的字节数,如果已到达流的末尾,则返回-1。所以你应该只编写ss字节,而不是len字节:

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

注意这里完全不需要DataInputStream和BufferedReader。