Java 写入文件时在末尾获取NULL值

Java 写入文件时在末尾获取NULL值,java,io,Java,Io,我在写入文件时遇到问题。我想将输入文件的内容写入输出文件,但在写入文件时,在文件末尾写入的值为空 这背后的原因是什么 我的代码是: import java.io.BufferedReader; import java.io.DataInputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.

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

这背后的原因是什么

我的代码是:

 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();

}

 }

您总是要写出完整的缓冲区,即使您只读取了部分缓冲区,因为
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
  • 考虑使用包含实用方法的或类似的第三方库来完成所有这一切

read方法返回实际读取的字节数,如果到达流的末尾,则返回-1。因此,您应该只写入ss字节,而不写入len字节:

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

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

您是指字节0x00还是字符串“NULL”?这是检查输入文件大小与输出文件大小的sage提醒。