2012-09-01 15 views
5

Potrzebuję przechowywać listę tablic ciągów w pliku przez jej zaszyfrowanie. Następnie odszyfrowuję zawartość pliku i przywracam do listy tablic. Ale kiedy odszyfrowuję treść, w treści znajdują się bloki "Null". Bez bloków "Null" reszta tekstu jest taka sama, jak kodowana.Szyfrowanie i odszyfrowywanie tablicy ArrayList <String>

public static void encryptFile(List<String> moduleList, File fileOut) { 
    try { 
     OutputStream out = new FileOutputStream(fileOut); 
     out = new CipherOutputStream(out, encryptCipher); 
     StringBuilder moduleSet = new StringBuilder(); 
     for (String module : moduleList) { 
      moduleSet.append(module + "#"); 
     } 
     out.write(moduleSet.toString().getBytes(Charset.forName("UTF-8"))); 
     out.flush(); 
     out.close(); 
    } catch (java.io.IOException ex) { 
     System.out.println("Exception: " + ex.getMessage()); 
    } 
} 

public static List<String> decryptFile(File fileIn) { 
    List<String> moduleList = new ArrayList<String>(); 
    byte[] buf = new byte[16]; 

    try { 
     InputStream in = new FileInputStream(fileIn); 
     in = new CipherInputStream(in, decryptCipher); 

     int numRead = 0; 
     int counter = 0; 
     StringBuilder moduleSet = new StringBuilder(); 
     while ((numRead = in.read(buf)) >= 0) { 
      counter++; 
      moduleSet.append(new String(buf)); 
     } 

     String[] blocks = moduleSet.split("#"); 
     System.out.println("Items: " + blocks.length); 

    } catch (java.io.IOException ex) { 
     System.out.println("Exception: " + ex.getMessage()); 
    } 
    return moduleList; 
} 

Próbowałem z UTF-16, ponieważ ciągi są kodowane w java w UTF-16, ale to tylko sprawia, że ​​wyjście najgorsze. Twoje sugestie będą mile widziane ... Dzięki

+6

Nigdy nie rób zdjęć kodu źródłowego i nie publikuj ich. Kopiuj i wklej kod źródłowy do pytania lub poświęć trochę czasu na jego wpisanie. – Jeffrey

+0

Problem może znajdować się na pozycji (242, 137) – Alex

+1

@Jeffrey Jeśli to możliwe, wybrałabym kopiuj/wklej. Gdyby nie było to możliwe, ponieważ byłem na "Kindle" lub w innym, prawdopodobnie opóźniłbym zadawanie pytań, dopóki nie wróciłem do maszyny programistycznej. Zbyt dużo błędów wkradło się podczas (ponownego) wpisywania kodu. –

Odpowiedz

4

bym wyrwać kod gdzie Ci konwertować zawartość listy do i od ciągu znaków i zastąpić go ObjectOutputStream:

FileOutputStream out1 = new FileOutputStream(fileOut); 
CipherOutputStream out2 = new CipherOutputStream(out1, encryptCipher); 
ObjectOutputStream out3 = new ObjectOutputStream(out2); 
out3.writeObject(moduleList); 

Następnie, aby przeczytać back:

FileInputStream in1 = new FileInputStream(fileIn); 
CipherInputStream in2 = new CipherInputStream(in1, decryptCipher); 
ObjectInputStream in3 = new ObjectInputStream(in2); 
moduleList = (Set<String>)in3.readObject() 
+0

Tak, zadziałało. Używając swojej drogi, nie musi przechodzić przez każdy ciąg na liście i wysyłać. Więc nie muszę w ogóle rozważać kodowania. Mogę wysłać to jako obiekt i łatwo go odczytać. redukuje znaczną liczbę linii kodów. Dzięki – Anuruddha

Powiązane problemy