2012-09-01 49 views
5

Tôi cần lưu trữ một danh sách chuỗi các chuỗi trong một tệp bằng cách mã hóa nó. Và sau đó tôi giải mã nội dung tập tin và khôi phục chúng vào một danh sách mảng. Nhưng khi tôi giải mã nội dung, các khối 'Null' nằm bên trong nội dung. Không có khối 'Null', phần còn lại của văn bản giống như tôi được mã hóa.Mã hóa và giải mã một 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; 
} 

Tôi đã thử với UTF-16 vì chuỗi được mã hóa bằng java trong UTF-16, Nhưng nó chỉ làm cho đầu ra tồi tệ nhất. gợi ý của bạn sẽ được đánh giá cao ... Cảm ơn

+6

Không bao giờ chụp ảnh mã nguồn và đăng chúng. Hoặc là sao chép + dán mã nguồn vào câu hỏi của bạn hoặc dành thời gian để gõ nó lên. – Jeffrey

+0

Vấn đề có thể được đặt tại vị trí (242, 137) – Alex

+1

@ Jeffrey Nếu có thể, tôi sẽ đi với bản sao/dán. Nếu điều đó là không thể bởi vì tôi đã 'trên Kindle' hoặc một số như vậy, tôi có lẽ sẽ trì hoãn hỏi một câu hỏi cho đến khi tôi trở lại máy tính để bàn phát triển. Quá nhiều lỗi leo trong khi (lại) gõ mã. –

Trả lời

4

tôi sẽ rip ra mã nơi bạn chuyển đổi nội dung danh sách của bạn đến và đi từ một chuỗi, và thay thế bằng ObjectOutputStream:

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

Sau đó, để đọc trở lại:

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

Có nó hoạt động. Bằng cách sử dụng theo cách của bạn, nó không cần phải đi qua từng chuỗi trong danh sách và gửi. Vì vậy, tôi không cần phải xem xét về công cụ mã hóa ở tất cả. Tôi có thể gửi nó như một đối tượng và đọc nó một cách dễ dàng. nó làm giảm số lượng đáng kể các dòng mã. Cảm ơn – Anuruddha