Запись массива байтов в файл. Не всегда получаешь ожидаемый результат

Я использую Java для записи массива байтов в файл. Когда я открываю свой файл в шестнадцатеричном редакторе, я не всегда вижу те байты, которые я ожидал там увидеть. Вот мой пример кода и содержимое выходного файла:

public static void main(String[] args) 
{
    File file = new File( "c:\\temp\\file.txt" );
    file.delete();
    FileOutputStream outStream = null;
    try 
    {
        file.createNewFile();
    } catch (IOException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try 
    {
        outStream = new FileOutputStream( file );
    } catch (FileNotFoundException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try 
    {
    outStream.write( new byte[] { 0x14, 0x00, 0x1F, 0x50 } );

    } catch (IOException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

Когда я открываю файл в шестнадцатеричном редакторе, я получаю 00 9e f3 04 в качестве содержимого вместо байтов, которые я отправил. Мои результаты кажутся противоречивыми. Иногда я получаю ожидаемый результат, а иногда нет.


Это выведет правильные данные:

outStream.write( new byte[] { 0x14 , 0x00, 0x1F, 0x50, (byte) 0xE0, 0x4F, (byte) 0xD0, 0x20, (byte) 0xEA, 0x3A, 0x69, 0x10, (byte) 0xA2 , (byte) 0xD8, 0x08, 0x00, 0x2B } );

Содержимое файла:

14 00 1f 50 e0 4f d0 20 ea 3a 69 10 a2 d8 08 00 2b

Если я добавлю еще один байт в этот массив, произойдет сбой.

outStream.write( new byte[] { 0x14 , 0x00, 0x1F, 0x50, (byte) 0xE0, 0x4F, (byte) 0xD0, 0x20, (byte) 0xEA, 0x3A, 0x69, 0x10, (byte) 0xA2 , (byte) 0xD8, 0x08, 0x00, 0x2B, 0x30 } );

Содержимое файла теперь:

14 e5 80 9f e4 bf a0 e2 83 90 e3 ab aa e1 81 a9 ed a2 a2 08 e3 80 ab

У меня тоже были проблемы с этим:

outStream.write( new byte[] { 0x4C, 0x00, 0x00, 0x00 } );

Содержимое файла:

4c 00

Последние два байта не записываются.


outStream.write( new byte[] { 0x4C, 0x00, 0x00, 0x00, 0x01 } );

Это даст ожидаемый результат. Содержимое файла:

4c 00 00 00 01

Я чувствую, что мне не хватает чего-то фундаментального в том, как данные записываются в файлы. Как получить согласованные результаты при записи массивов байтов в файл?


person esgeroth    schedule 14.06.2013    source источник
comment
Хотя я не думаю, что это что-то изменит, попробуйте .flush(), затем .close() после того, как .write()...   -  person fge    schedule 14.06.2013
comment
Это очень странно. И это точный код, который вы выполняете? Writer нигде нет? Или String значений? Также: вызов createNewFile() не должен быть необходим.   -  person Joachim Sauer    schedule 14.06.2013


Ответы (2)


Я скомпилировал именно ваш код и в выходном файле получил то, что ожидал. Я думаю, вполне возможно, что ваш блокнот (или любая другая программа, которую вы используете для проверки файла) не показывает вам некоторые байты, которые вы пишете (например, textedit на моем Mac отказывается показывать список возможных байтов) . Если это именно тот метод, который вы используете, я предполагаю, что некоторые другие вещи (например, блокнот) терпят неудачу, а не ваш код. Как вы упомянули, иногда создается впечатление, что некоторые байты вообще не записываются. Возможно, попытка двойного метода public void write(byte[] b, int off, int len) поможет вам определить, сколько байтов нужно ввести.

person 3yakuya    schedule 14.06.2013
comment
В этом была проблема. Я использовал плагин шестнадцатеричного редактора для блокнота ++, чтобы прочитать файл. Я скачал шестнадцатеричный редактор HxD, и теперь содержимое файла читается как положено. - person esgeroth; 14.06.2013

Я проверил ваш код, и он не терпит неудачу для меня. Вы передаете свой файл между серверами? Поскольку это файл .txt, у вас может произойти автоматическое преобразование текста, вы пробовали без расширения?

Кроме того, не забудьте закрыть ресурсы, когда закончите.

person Martin    schedule 14.06.2013