2013-06-01 98 views
4

我正在使用Java将文件复制到二进制文件中。接下来的问题是,如何在一个新的文件中写入一个字节,总大小只占用1个字节?我做了下:Java在文件中写入字节

FileOutputStream saveFile=new FileOutputStream("SaveObj3.sav"); 
     // Create an ObjectOutputStream to put objects into save file. 
     ObjectOutputStream save = new ObjectOutputStream(saveFile); 

     save.writeByte(0); 


     save.close(); 
     saveFile.close(); 

也就是说,只有必须写在文件中只有一个字节,但是当我看大小,occups 7个字节。任何人都知道我怎么写一个唯一的字节?有更好的方法吗?

+1

什么平台?你怎么知道它占用7个字节? –

+3

我想说ObjectOutputStream可能会插入关于数据类型的附加信息(这在序列化和反序列化中很有用)。当你使用'saveFile.write(0);'而不是'save.writeByte(0);'时,你的程序如何工作? – Pshemo

+2

+1 @Phemo(谁应该做出答案)。 ObjectOutputStream构造函数的javadoc说:*这个构造函数将序列化流头写入基础流*。 –

回答

2

请勿使用ObjectOutputStream。使用FileOutputStream直接:

FileOutputStream out=new FileOutputStream("SaveObj3.sav"); 
out.write(0); 
out.close(); 
+1

因为[FileOutputStream.write(int b)](http://docs.oracle.com/javase/7/docs/api/java/io/FileOutputStream。)会实际写入一个'int',即四个字节。 html#write(int))方法将被调用。要编写一个'byte',可以使用[FileOutputStream.write(byte [] b)](http://docs.oracle.com/javase/7/docs/api/java/io/FileOutputStream.html#写(byte []))通过将'0'包装在'byte []'中,例如'out.write(new byte [] {0});' – matsev

+0

@matsev谢谢,我解决了它。 – Runemoro

+0

不用担心,不用客气。 – matsev

3

作为JB Nizet注意到的ObjectOutputStream constructor文档指出该目的也

序列化流报头写入到基础流

这解释了附加字节。

为了防止这种行为,你可以使用其他流像FileOutputStream也许DataOutputStream

FileOutputStream saveFile = new FileOutputStream("c:/SaveObj3.sav"); 
DataOutputStream save = new DataOutputStream(saveFile); 

save.writeByte(0); 

save.close(); 
1

您可以使用Java 7中提供文件级的它更容易超出预期。

它可以在一个线路进行:

byte[] bytes = new String("message output to be written in file").getBytes(); 
Files.write(Paths.get("outputpath.txt"), bytes); 

如果你有一个File类,只需更换:

Paths.get("outputpath.txt") 

到:

yourOutputFile.toPath() 

为只写一个字节,只要你想,你可以做到以下几点:

Files.write(Paths.get("outputpath.txt"), new byte[1]); 

in file properties: 
size: 1 bytes