将字节数组写入文件.并不总是得到预期的结果

esg*_*oth 5 java arrays byte file fileoutputstream

我正在使用Java将字节数组写入文件.当我在十六进制编辑器中打开我的文件时,我并不总是看到我期望在那里的字节.这是我的示例代码和输出文件的内容:

public static void main(String[] args) 
{
    File file = new File( "c:\\temp\\file.txt" );
    file.delete();
    FileOutputStream outStream = null;
    try 
    {
        file.createNewFile();
    } catch (IOException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try 
    {
        outStream = new FileOutputStream( file );
    } catch (FileNotFoundException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try 
    {
    outStream.write( new byte[] { 0x14, 0x00, 0x1F, 0x50 } );

    } catch (IOException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

当我在十六进制编辑器中打开文件时,我获取00 9e f3 04内容而不是我发送的字节.我的结果似乎不一致.有时候我会得到预期的结果,有时我却没有.


这将输出正确的数据:

outStream.write( new byte[] { 0x14 , 0x00, 0x1F, 0x50, (byte) 0xE0, 0x4F, (byte) 0xD0, 0x20, (byte) 0xEA, 0x3A, 0x69, 0x10, (byte) 0xA2 , (byte) 0xD8, 0x08, 0x00, 0x2B } );

文件内容是:

14 00 1f 50 e0 4f d0 20 ea 3a 69 10 a2 d8 08 00 2b
Run Code Online (Sandbox Code Playgroud)

如果我再向该数组添加一个字节,那么它就会失败.

outStream.write( new byte[] { 0x14 , 0x00, 0x1F, 0x50, (byte) 0xE0, 0x4F, (byte) 0xD0, 0x20, (byte) 0xEA, 0x3A, 0x69, 0x10, (byte) 0xA2 , (byte) 0xD8, 0x08, 0x00, 0x2B, 0x30 } );

文件内容现在是:

14 e5 80 9f e4 bf a0 e2 83 90 e3 ab aa e1 81 a9 ed a2 a2 08 e3 80 ab
Run Code Online (Sandbox Code Playgroud)

我也遇到过这个问题:

outStream.write( new byte[] { 0x4C, 0x00, 0x00, 0x00 } );
Run Code Online (Sandbox Code Playgroud)

文件内容是:

4c 00
Run Code Online (Sandbox Code Playgroud)

最后两个字节未写入.


outStream.write( new byte[] { 0x4C, 0x00, 0x00, 0x00, 0x01 } );
Run Code Online (Sandbox Code Playgroud)

这将产生预期的结果.文件内容是:

4c 00 00 00 01
Run Code Online (Sandbox Code Playgroud)

我觉得我遗漏了一些关于数据写入文件的基本方法.将字节数组写入文件时如何获得一致的结果?

3ya*_*uya 1

我完全编译了您的代码,并在输出文件中得到了预期的结果。我认为您的记事本(或您用来检查文件的任何其他程序)很可能没​​有显示您编写的一些字节(例如,我的Mac上的textedit拒绝显示可能的字节列表) 。如果这正是您正在使用的方法,我想是其他一些东西(如记事本)失败了,而不是您的代码。正如您所提到的,有时您会觉得有些字节根本没有写入。也许尝试 twin 方法public void write(byte[] b, int off, int len)可以确保您要输入多少字节。