Как записать двоичный файл из строки и получить его снова в строку? - PullRequest
0 голосов
/ 13 октября 2018

У меня есть строка, и я хочу сохранить ее в файл и иметь возможность снова извлечь ее в строку.

Что-то не так с моим кодом, потому что предполагается, что я должен написать что-то двоичное, не читаемое, но когда я открываю файл, я могу прочитать это:

Исходная строка:

[{"name":"asdasd","etName":"111","members":[]}]

Сохраненная строка в двоичном файле:

[ { " n a m e " : " a s d a s d " , " e t N a m e " : " 1 1 1 " , " m e m b e r s " : [ ] } ]

Обнаружено две проблемы:

  1. Не сохраняется в двоичном файле!Я могу это прочитать.Предполагается, что это запутанный двоичный текст, не читаемый, но я могу его прочитать.
  2. Когда я получаю его, он получается с таким странным пространством между символами.Так что это не работает.

Это мой код для хранения строки:

public static void storeStringInBinary(String string, String path) {
    DataOutputStream os = null;
    try {
        os = new DataOutputStream(new FileOutputStream(path));        
        os.writeChars(string);
        os.flush();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (os != null) {
            try {
                os.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }        
}

А это мой код для чтения из двоичного файла в строку:

public static String retrieveStringFromBinary(String file) {
    String string = null;
    BufferedReader reader = null;
    try {           
        reader = new BufferedReader(new FileReader (file));
        String line = null;
        StringBuilder stringBuilder = new StringBuilder();      
        while((line = reader.readLine()) != null) {
            stringBuilder.append(line);
        }
        return stringBuilder.toString();
    } catch (Exception e){
        e.printStackTrace();
    } finally {
        if (reader != null) {
            try {               
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return string;
}   

Спасибо.

1 Ответ

0 голосов
/ 13 октября 2018

Во-первых, нет никакого различия между текстовым файлом и двоичным файлом.Текстовый файл - это просто файл, содержимое которого попадает в диапазон значений байтов, соответствующих символам.

Если вы хотите зашифровать содержимое файла, чтобы его нельзя было прочитать, просто перехватив файл, вам понадобитсявыбрать подходящий метод шифрования.

Второе микширование Reader / Writer и Streams в Java никогда не является хорошей идеей, выберите один стиль и придерживайтесь его.

Проблема с вашей функцией, которая сохраняетСтрока в файл означает, что вы используете метод writeChars(), который из документа выполняет следующее:

Записывает символ в нижележащий выходной поток как 2-байтовое значение, старший байт сначала,Если исключение не выдается, записанный счетчик увеличивается на 2.

Поскольку ваша строка состоит из однобайтовых символов, это приводит к заполнению вашей строки нулевыми байтами, которые преобразуютсяк пробелам при чтении обратно. Если вы измените это на writeBytes(), то вы должны получить вывод без дополнительного нулевого байта.

Нулевой байт также остановит работу вашей функции чтения, так как функция readLine() вернетnull при первом вызове из-за 0x00 в файле.

...