Java: Как писать бинарные файлы? - PullRequest
16 голосов
/ 17 января 2012

Я занимаюсь веб-программированием уже несколько лет, и с тех пор я не занимался программированием для настольных приложений, и я забыл так много вещей. Пожалуйста, будьте терпеливы, если это слишком просто.

Теперь у меня такая ситуация:
Я пытаюсь сохранить некоторые хешированные слова в файле. Я думаю, что я должен использовать двоичные файлы для этого (пожалуйста, исправьте меня, если я не прав). Но я понятия не имею, как мне записать слова в файл. Я пробовал много способов, но когда я читаю обратно файл и пытаюсь расшифровать слова, я получаю BadPaddingException.

Кто-нибудь знает, как записать слова в файл?

P.S .: Я использую этот код для шифрования / дешифрования слов (я получил его из другого потока StackOverflow, с некоторыми изменениями):

public static byte[] encrypt(String property) throws GeneralSecurityException, UnsupportedEncodingException {
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
        SecretKey key = keyFactory.generateSecret(new PBEKeySpec(password));
        Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");
        pbeCipher.init(Cipher.ENCRYPT_MODE, key, new PBEParameterSpec(salt, 20));
        return pbeCipher.doFinal(property.getBytes("UTF-8"));
    }

    public static String decrypt(byte[] property) throws GeneralSecurityException, IOException {
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
        SecretKey key = keyFactory.generateSecret(new PBEKeySpec(password));
        Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");
        pbeCipher.init(Cipher.DECRYPT_MODE, key, new PBEParameterSpec(salt, 20));
        return new String(pbeCipher.doFinal(property));
    }

Ответы [ 2 ]

20 голосов
/ 17 января 2012

Ну, просто используйте FileInputStream и FileOutputStream =)

Пример записи:

// encrypted data in array
byte[] data = ...

FileOutputStream fos = ...
fos.write(data, 0, data.length);
fos.flush();
fos.close();

Пример чтения:

File inputFile = new File(filePath);
byte[] data = new byte[inputFile.length()];
FileInputStream fis = new FileInputStream(inputFile);
fis.read(data, 0, data.length);
fis.close();

Приведенный выше код предполагает, чтоодин файл содержит один зашифрованный элемент.Если вам нужно хранить более одного элемента в одном файле, вам нужно будет разработать для этого схему форматирования.Например, вы можете хранить количество байтов в зашифрованных данных как 2 байта перед самими данными.2 байта на элемент означает, что зашифрованный элемент не может быть длиннее 2 ^ 16 байт.Конечно, вы можете использовать 4 байта для длины.

0 голосов
/ 03 ноября 2012

Мне кажется, что сохранение в виде текстового документа имеет больше смысла, данные уже есть, поэтому нет необходимости преобразовывать их в byte[], и если вам нужно читать из файла, это будет довольно удобно.Если вы не сохраняете его из Интернета, а он уже идет через сокет как byte[].Я знаю, это говорит, что не высказывайте свое мнение, но это строго вопрос мнения, это была единственная часть вашего вопроса, оставленная без ответа предыдущими двумя ответами

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...