2012-01-17 92 views
13

我一直在做网络编程好几年了,从那以后我还没有做桌面应用任何编程,我已经忘记了很多事情。如果这太简单,请耐心等待。Java:如何编写二进制文件?

现在我有这种情况:
我想在文件中存储一些散列的单词。我想我应该使用二进制文件(如果我错了,请纠正我)。但我不知道应该如何将文字写入文件。我尝试了很多方法,但是当我读回文件并尝试解密这些文字时,我得到了BadPaddingException

没有人有任何想法如何写的字到一个文件?

PS:我使用的加密/解密的话(我是从另一个StackOverflow的线程,有一些修改)这个代码:

public static byte[] encrypt(String property) throws GeneralSecurityException, UnsupportedEncodingException { 
     SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); 
     SecretKey key = keyFactory.generateSecret(new PBEKeySpec(password)); 
     Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES"); 
     pbeCipher.init(Cipher.ENCRYPT_MODE, key, new PBEParameterSpec(salt, 20)); 
     return pbeCipher.doFinal(property.getBytes("UTF-8")); 
    } 

    public static String decrypt(byte[] property) throws GeneralSecurityException, IOException { 
     SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); 
     SecretKey key = keyFactory.generateSecret(new PBEKeySpec(password)); 
     Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES"); 
     pbeCipher.init(Cipher.DECRYPT_MODE, key, new PBEParameterSpec(salt, 20)); 
     return new String(pbeCipher.doFinal(property)); 
    } 
+0

你有没有尝试过做'的System.out.println(解密(加密(“Hello world”)));'? – bezmax 2012-01-17 13:10:38

+0

是的,它的工作原理! – 2012-01-17 13:11:34

+1

然后请粘贴您的I/O代码。 – bezmax 2012-01-17 13:13:25

回答

17

那么,就用FileInputStreamFileOutputStream =)

样品写作:

// encrypted data in array 
byte[] data = ... 

FileOutputStream fos = ... 
fos.write(data, 0, data.length); 
fos.flush(); 
fos.close(); 

样品阅读:

File inputFile = new File(filePath); 
byte[] data = new byte[inputFile.length()]; 
FileInputStream fis = new FileInputStream(inputFile); 
fis.read(data, 0, data.length); 
fis.close(); 

以上代码假定一个文件包含单独的加密项。如果您需要在单个文件中保存多个项目,则需要为此设计一些格式方案。例如,您可以在数据本身之前将加密数据中的字节数存储为2个字节。每个项目2个字节表示加密项目不能超过2^16个字节。当然,你可以使用4个字节的长度。

+0

并回读? 它会自动知道要读取的字节长度吗? – 2012-01-17 13:17:25

+0

用于回读使用FileInputStream和它的方法'avialable()'。在阅读的javadoc:http://docs.oracle.com/javase/6/docs/api/java/io/FileInputStream.html – bezmax 2012-01-17 13:23:35

+0

@Ako FileOutputStream中更新的答案 – 2012-01-17 13:23:53

0

保存为文本文件对我来说似乎更有意义,数据已经是一个了,所以不需要将其转换为byte[],并且如果您需要从文件中读取,则会非常方便。除非你将它从网络上保存下来,并且它已经通过套接字作为byte[]来了。我知道它说,不提供你的意见,但其严格见仁见智,那是你的问题的唯一部分由前两个没有答案回答

+0

不是我一定不同意,但这不能回答这个问题。作为对原始问题的评论而不是答案,这会更好。 – David 2012-11-03 14:19:09

+0

对不起,我是新来这个网站。无论如何,“我认为我应该使用二进制文件(如果我错了,请纠正我)。”是我试图回应的。对于那个很抱歉。 – 2012-11-03 14:32:13