0

暗号化されたファイルを読み取って、その復号化された内容をリストに入れようとしていますが、最後の行の一部がランダムに分割されるか、新しい行の途中で分割されます。なぜそれがこれをしているのか、何か考えはありますか?(復号化方式で)。ところで、それが役立つ場合、バッファは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;
}
4

1 に答える 1

1

readメソッドは、バッファにStreamいくつかのsを読み込むだけです。Byteしたがって、コードは1024のサイズのチャンクでファイルを読み取り、読み取られた各チャンクをに保存しますList

行ごとに読む方法はいくつかありますがStreamBufferedReader

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();
}

何度も私を捕らえていることに注意することの1つは、からへInputStreamReaderの暗黙の変換を行うことです。これにはエンコードが必要です。デフォルトではプラットフォームエンコーディングが使用されます。これは、コードがプラットフォームに依存することを意味します。プラットフォームエンコーディングをデフォルトで使用するのと同じことが元のコードにも当てはまります。ByteStringnew String(byte[])

常にエンコーディングを明示的に指定することをお勧めします。

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

またはStringコンストラクターの場合

new String(bytes, "UTF-8")

String同じことが、File:にを書き込むすべてのコードにも当てはまります。

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();
}

UTF-8このようにして、各ファミリが異なるデフォルトのエンコーディング( Linux、ISO-8859-1Windows、およびMacRomanMac)を使用するため、異なるOSでアプリケーションを実行する際の厄介な驚きを回避できます。

Streamもう1つの注意点は、 (または現在)を閉じないことです。Readerこれは必要です。Java6のafinallyで、またはJava7の新しいtry-with-resources構成を使用して行うことができます。

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);
    }
}
于 2013-03-23T10:53:52.373 に答える