Как записать один бит в файл в Java - PullRequest
0 голосов
/ 30 марта 2020

Я хотел бы знать, возможно ли записывать файл по частям. У меня есть несколько последовательностей битов, записанных в виде строки

String bitString = "00101101"; // as an example for just one sequence

И когда я пытаюсь записать эту последовательность в файл (txt), она не дает ожидаемого результата. Мой файл весит 8 байт, и мне бы хотелось, чтобы он весил всего 1 байт (8 бит: мой 00101101).

Итак, мой вопрос: какой самый простой способ записи напрямую в виде двоичного файла в файл из строки или целое число?

Заранее спасибо.

РЕДАКТИРОВАТЬ

У меня возникает проблема:

У меня есть строка ввода, которую я читать из входного файла (любой текстовый файл, поэтому я не знаю, какая это будет строка), давайте возьмем пример « Hello World ».

Я использую алгоритм текста сжатие, которое я создал, который использует метод дерева HuffMan. Он возвращает мне последовательность битов, которые соответствуют моему тексту (это для пояснения, нам эта часть не нужна) для моего примера, он дает мне следующую последовательность битов: 00001100 11011011 10000101 11101011, которая легче исходного двоичного файла значение моего текста (11 байтов для оригинала против 4 байтов со сжатием).

Я хотел бы написать новую последовательность в выходном файле, и я хочу, чтобы каждый символ рассматривался как один бит (или каждые 8 ​​символов, которые следует рассматривать как байт), и в результате выходной файл должен быть светлее, чем мой входной файл.

Но проблема в том, что, когда я пытаюсь написать свою новую последовательность, каждый символ рассматривается как байт, а не бит, а выходной файл тяжелее входного.

Я уже пробовал много вещей, таких как FileOutputStream, OutputStream, конвертировать мою строку в байты, конвертировать в целое число , ...

Вот что я пытаюсь сделать:

String optimizedString = "00001100110110111000010111101011";  // size always multiple of 8
byte outputByte = 0;
try (OutputStream fos = new FileOutputStream("textCompressed.txt")) {           
    for (int i = 0; i < optimizedString.length(); ++i) {
        if (optimizedString.charAt(i) == '1') {
            outputByte = (byte) (outputByte << 1 + 1); // add 1 to the sequence
        } else {
            outputByte = (byte) (outputByte << 1 + 0); // add 0 to the sequence
        }

        if ((i+1) % 8 == 0) { // print each byte in the output file
            fos.write(outputByte);
            outputByte = 0; // reset the byte for the next sequence
        }
     }
}

Но в результате outputByte всегда равен 0.

Надеюсь, я прояснил

1 Ответ

1 голос
/ 30 марта 2020

Вы не можете записать меньше байта, и причина, по которой ваш файл составляет 8 байтов, заключается в том, что вы записали в него 8 символов. Если бы у вас был Writer и вы сделали следующее:

writer.write(0b00101101)

, он бы сделал то, что вы хотите. По сути, он использует двоичную нотацию для определения int и записывает это int как один символ, а не как строку двоичного представления.

...