5

文字列の配列リストを暗号化してファイルに保存する必要があります。次に、ファイルの内容を復号化し、配列リストに復元します。しかし、コンテンツを復号化すると、「Null」のブロックがコンテンツ内にあります。「ヌル」ブロックがない場合、残りのテキストはエンコードされたものと同じです。

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

文字列はJavaでUTF-16でエンコードされているため、UTF-16で試しましたが、出力が最悪になるだけです。あなたの提案は高く評価されます...ありがとう

4

1 に答える 1

4

リストの内容を文字列との間で変換するコードを取り除いて、 ObjectOutputStreamに置き換えます。

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

次に、読み返します。

FileInputStream in1 = new FileInputStream(fileIn);
CipherInputStream in2 = new CipherInputStream(in1, decryptCipher);
ObjectInputStream in3 = new ObjectInputStream(in2);
moduleList = (Set<String>)in3.readObject()
于 2012-09-01T16:32:05.543 に答える