2013-03-23 3 views
0

내 암호화 된 파일을 읽고 해독 된 내용을 목록에 넣으려는 중, 끝에있는 일부 줄이 임의로 또는 새 줄의 중간에 나뉘어 있습니다. 왜 이런 짓을 한거야? (해독 방법에서). Btw 버퍼가 1024이면 도움이된다.파일을 목록으로 해독 할 때 줄을 분할하는 중

public Crypto() { 
    try { 
     PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray()); 
     SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); 
     SecretKey key = keyFactory.generateSecret(keySpec); 
     ecipher = Cipher.getInstance("PBEWithMD5AndDES"); 
     dcipher = Cipher.getInstance("PBEWithMD5AndDES"); 
     byte[] salt = new byte[8]; 
     PBEParameterSpec paramSpec = new PBEParameterSpec(salt, 100); 
     ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec); 
     dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec); 
     } catch (Exception e) { 
    } 
} 

@SuppressWarnings("resource") 
public static List<String> decrypt(String file) { 
    List<String> list = new LinkedList<String>(); 
    try { 
     InputStream in = new CipherInputStream(new FileInputStream(file), dcipher); 
     int numRead = 0; 
     while ((numRead = in.read(buffer)) >= 0) { 
      list.add(new String(buffer, 0, numRead); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return list; 
} 
+0

의 새로운 try-with-resources 구조를 사용 할 수 있습니다, 필요 이것은 실제 코드가 될 수 없습니다. –

+0

문자열을 1024 바이트 길이의'List' 문자열로 읽는 중입니다. - 한 줄씩 읽으려는 경우,'list.add (new String (buffer, 0, numRead); 새로운 BufferedReader (새로운 InputStreamReader (새로운 CipherInputStream (새로운 FileInputStream (file), dcipher)))'가이 트릭을 수행해야합니다. –

+0

정말 고마워요. !!! 그것은 xD를 작동합니다. – CBennett

답변

1

Streamread 방법은 버퍼에 Byte S의 개수를 판독한다. 따라서 코드는 크기가 1024 인 청크로 파일을 읽고 각각의 청크를 List에 저장합니다.

라인에 의한 Stream 라인을 읽을 수있는 방법에는 여러 가지가있다, 나는 점에 유의하는 BufferedReader

final List<String> list = new LinkedList<String>(); 
try { 
    final BufferedReader reader = new BufferedReader(new InputStreamReader(new CipherInputStream(new FileInputStream(file), dcipher))); 
    String line; 
    while ((line = reader.readLine()) != null) { 
     list.add(line); 
    } 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

한 가지를 추천하는 것은 많은 경우에 저를 잡았다는 InputStreamReaderByte에서 암시 적 변환을 수행한다는 것입니다 String - 인코딩이 필요합니다. 기본적으로 플랫폼 인코딩이 사용됩니다. 즉, 플랫폼에 따라 코드가 달라집니다. new String(byte[])도 기본값 인 플랫폼 인코딩을 사용하므로 원래 코드도 마찬가지입니다.

final BufferedReader reader = new BufferedReader(new InputStreamReader(new CipherInputStream(new FileInputStream(file), dcipher), "UTF-8")); 

또는

new String(bytes, "UTF-8") 

동일 String 생성자에 대한 StringFile A를 쓰는 코드에 간다 :

나는 명시 적으로 인코딩을 지정 항상를 추천 할 것입니다

try { 
    try (final BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new CipherOutputStream(new FileOutputStream(file), dcipher), "UTF-8"))) { 
     writer.append(data); 
    } 
} catch (IOException ex) { 
    e.printStackTrace(); 
} 

이렇게하면 각 패밀리마다 다른 기본 인코딩 (Linux의 경우 UTF-8, Windows의 경우 ISO-8859-1, Mac의 경우 MacRoman)을 사용하여 다른 OS에서 애플리케이션을 실행할 때 불쾌감을 피할 수 있습니다.

또 다른 참고 닫으하지 않는 것이 당신의 Stream (또는 지금 Reader) -이가 자바 6에서 finally에서 수행 또는 자바 7

try (final BufferedReader reader = new BufferedReader(new InputStreamReader(new CipherInputStream(new FileInputStream(file), dcipher), "UTF-8"))) { 
    String line; 
    while ((line = reader.readLine()) != null) { 
     list.add(line); 
    } 
}