2012-01-17 15 views
13

Ho fatto programmazione web da diversi anni e da allora non ho fatto nessuna programmazione per applicazioni desktop, e ho dimenticato tante cose. Per favore sii paziente se questo è troppo semplice.Java: come scrivere file binari?

Ora ho questa situazione:
Sto cercando di memorizzare alcune parole con hash in un file. Penso che dovrei usare file binari per questo (correggimi se sbaglio). Ma non ho idea di come dovrei scrivere le parole nel file. Ho provato molti modi, ma quando rileggo il file e provo a decifrare le parole, ottengo BadPaddingException.

Qualcuno ha qualche idea su come scrivere le parole in un file?

PS: Io uso questo codice per codificare/decodificare le parole (l'ho presa da un altro thread StackOverflow, con alcune modifiche):

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

Hai provato a fare 'System.out.println (decriptare (cifrare ("Hello world"))); '? – bezmax

+0

Sì, e funziona! –

+1

Quindi si prega di incollare anche il codice I/O. – bezmax

risposta

17

Beh, basta usare FileInputStream e FileOutputStream =)

scrittura

Esempio:

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

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

lettura Esempio:

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

Sopra il codice si presuppone che un file contenga un singolo elemento crittografato. Se è necessario contenere più di un elemento nel singolo file, sarà necessario ideare uno schema di formattazione per questo. Ad esempio, è possibile memorizzare il numero di byte nei dati crittografati come 2 byte, prima dei dati stessi. 2 byte per articolo significa che l'elemento crittografato non può essere più lungo di 2^16 byte. Naturalmente, puoi usare 4 byte per la lunghezza.

+0

E per la lettura? Conosce automaticamente la lunghezza dei byte da leggere? –

+0

Per la lettura, utilizzare FileInputStream e il metodo 'avialable()'. Leggi javadoc all'indirizzo: http://docs.oracle.com/javase/6/docs/api/java/io/FileInputStream.html – bezmax

+0

@Ako risposta aggiornata –

0

Il salvataggio come documento di testo sembra avere più senso per me, i dati sono già un non c'è quindi bisogno di convertirlo in un byte[] e se è necessario leggere dal file sarebbe piuttosto conveniente. A meno che tu non lo stia salvando dal web e che stia già arrivando attraverso un socket come byte[]. So che dice di non fornire il proprio parere, ma la sua strettamente una questione di opinione, che era l'unica parte della tua domanda lasciata senza risposta da parte dei due precedenti risposto

+0

Non che io sia necessariamente in disaccordo, ma questo non risponde alla domanda. Questo sarebbe meglio come commento alla domanda originale che una risposta. – David

+0

Oh scusate, sono nuovo di questo sito. In ogni caso, "Penso che dovrei usare file binari per questo (correggimi se sbaglio)." È ciò a cui stavo tentando di rispondere. Mi dispiace per quello –