我使用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();
}
}
当我在十六进制编辑器中打开文件时,我得到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
如果我再向该数组添加一个字节,那么它就会失败。
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
我也遇到过这个问题:
outStream.write( new byte[] { 0x4C, 0x00, 0x00, 0x00 } );
文件内容为:
4c 00
最后两个字节未写入。
outStream.write( new byte[] { 0x4C, 0x00, 0x00, 0x00, 0x01 } );
这将产生预期的结果。文件内容为:
4c 00 00 00 01
我觉得我遗漏了一些关于数据写入文件的基本方法。将字节数组写入文件时如何获得一致的结果?
答案 0 :(得分:1)
我编译了你的代码,在输出文件中我得到了预期的结果。我认为您的记事本(或用于检查文件的任何其他程序)很可能没有显示您编写的某些字节(例如,Mac上的textedit拒绝显示可能的字节列表) 。
如果这正是您正在使用的方法,我想其他一些事情(比如记事本)会失败而不是您的代码。
正如您所提到的,有时您会得到一些字节根本不会被写入的印象。也许尝试双方法public void write(byte[] b, int off, int len)
可以确保输入多少字节。
答案 1 :(得分:0)
我测试了你的代码,但对我来说并没有失败。您是在服务器之间传输文件吗?因为它是一个.txt文件,你可能会进行一些自动文本转换,你试过没有扩展吗?
此外,请确保在完成后关闭资源。