2012-01-17 68 views
13

Tôi đã và đang lập trình web trong nhiều năm và kể từ đó tôi chưa thực hiện bất kỳ chương trình nào cho các ứng dụng dành cho máy tính để bàn và tôi đã quên rất nhiều thứ. Hãy kiên nhẫn nếu điều này quá đơn giản.Java: Cách ghi tệp nhị phân?

Bây giờ tôi có tình huống này:
Tôi đang cố gắng lưu trữ một số từ được băm trong tệp. Tôi nghĩ rằng tôi nên sử dụng các tập tin nhị phân cho điều này (xin vui lòng sửa tôi nếu tôi sai). Nhưng tôi không biết làm thế nào tôi nên viết các từ vào tập tin. Tôi đã thử nhiều cách, nhưng khi tôi đọc lại tệp và cố gắng giải mã các từ, tôi nhận được BadPaddingException.

Có ai có ý tưởng nào về cách viết các từ vào một tệp không?

PS: Tôi sử dụng mã này để mã hóa/giải mã những lời (tôi đã nhận nó từ một thread StackOverflow, với một vài sửa đổi):

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

Bạn đã thử thực hiện 'System.out.println (giải mã (mã hóa) ("Xin chào thế giới"))); '? – bezmax

+0

Có, và nó hoạt động! –

+1

Sau đó, vui lòng dán mã I/O của bạn. – bezmax

Trả lời

17

Vâng, chỉ cần sử dụng FileInputStreamFileOutputStream =)

mẫu viết:

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

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

Sample đọc:

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

Mã trên giả định rằng một tệp chứa mục được mã hóa duy nhất. Nếu bạn cần giữ nhiều mục trong một tệp, bạn sẽ cần phải đưa ra một số lược đồ định dạng cho điều đó. Ví dụ, bạn có thể lưu trữ số byte trong dữ liệu được mã hóa dưới dạng 2 byte, trước chính dữ liệu. 2 byte cho mỗi mục có nghĩa là mục được mã hóa không thể dài hơn 2^16 byte. Tất nhiên, bạn có thể sử dụng 4 byte cho chiều dài.

+0

Và để đọc lại? Liệu nó có tự động biết độ dài của các byte để đọc không? –

+0

Để đọc lại, sử dụng FileInputStream và phương thức 'avialable()'. Đọc javadoc tại: http://docs.oracle.com/javase/6/docs/api/java/io/FileInputStream.html – bezmax

+0

@Ako câu trả lời cập nhật –

0

Lưu dưới dạng tài liệu văn bản có vẻ hợp lý hơn với tôi, dữ liệu đã là vậy nên không cần phải chuyển đổi thành số byte[] và nếu bạn cần đọc từ tệp thì khá thuận tiện. Trừ khi bạn đang lưu nó từ web và nó đã đi qua một ổ cắm như là một byte[]. Tôi biết nó nói không cung cấp ý kiến ​​của bạn, nhưng đó là phần duy nhất của câu hỏi của bạn không được trả lời bởi hai câu trả lời trước đây

+0

Không nhất thiết tôi không đồng ý, nhưng điều này không trả lời được câu hỏi. Điều này sẽ tốt hơn như một bình luận về câu hỏi ban đầu hơn là một câu trả lời. – David

+0

Xin lỗi tôi mới vào trang này. Ở mức nào, "Tôi nghĩ rằng tôi nên sử dụng các tập tin nhị phân cho điều này (xin vui lòng sửa tôi nếu tôi sai)." Là những gì tôi đã cố gắng để đáp ứng. Xin lỗi vì điều đó. –

Các vấn đề liên quan