2012-04-01 2 views
1

Я не могу понять, как работать с I/O.Чтение из файла (по бит), а затем снова запись в файл

Я использую этот код для чтения из файла:

if (file.length() > Integer.MAX_VALUE) { 
    throw new IllegalArgumentException("File is too large: " + file.length()); 
} 

int len = (int) file.length(); 
System.out.println("failo dydis yra = "+len); 
FileInputStream inputStream = new FileInputStream(file); 

try { 
    byte[] fileBits = new byte[len]; 
    for (int pos = 0; pos < len;) { 
     int n = inputStream.read(fileBits, pos, len - pos); 

     if (n < 0) { 
      throw new EOFException(); 
     } 
     pos += n; 

    } 
    for(int q=0; q<len; q++){ 
     char ch = (char)fileBits[q]; 
     int sk = (int)ch; 
     System.out.println("symbol = "+fileBits[q]+" - "+ch+" - "+sk); 
    } 

Когда я прочитал текстовый файл, то все это хорошо, но когда я читать не TXT, например, изображения я получить подобный результат:

symbol = -78 - ᄇ - 65458 
symbol = 52 - 4 - 52 
symbol = -91 - ᆬ - 65445 
symbol = 80 - P - 80 
symbol = -118 - ハ - 65418 
symbol = 76 - L - 76 
symbol = 122 - z - 122 
symbol = 78 - N - 78 
symbol = 112 - p - 112 
symbol = 97 - a - 97 
symbol = 56 - 8 - 56 
symbol = -112 - ミ - 65424 

Так что я не могу понять, почему есть минус? И почему, когда я хочу конвертировать обратно, я получаю это 65 ***.

Возможно, мне нужно читать разные, если я хочу преобразовать эти байты в символы, работать с ними и снова записать в файл.

Спасибо.

+0

Вместо этого попробуйте обернуть его в InputStreamReader. Это правильно обрабатывает символы – Optimist

ответ

2

Так что я не могу понять, почему есть минус?

В Java, a byte can have values between -128 and 127. Поэтому вы видите отрицательные значения. Вы можете использовать 0xff & fileBits[q] для преобразования, которые в целое число между 0 и 256.

И почему, когда я хочу, чтобы преобразовать обратно я получаю это 65 ***

Преобразование байта в полукокс бессмысленно, если байт не является частью строки символов ASCII в кодировке, совместимой с ASCII. Случается, что Java расширяет первый бит байта до 16-битного значения. Если первый бит будет установлен (т. Е. Число отрицательно), результатом будет высокое 16-битное число, обычно в виде 65xxx.

Все работает нормально, просто дайте байтам функцию обработки/отображения изображений. Обратите внимание, что ваша функция подвержена ошибкам, поскольку она будет бесполезно терпеть неудачу, если размер файла изменяется во время чтения файла. Если вы хотите прочитать строку, используйте объект Reader, например InputStreamReader.

+0

Итак, какое ваше предложение я должен делать, если мне нужно работать с символами? Есть ли способ, которым я мог бы преобразовать? – Streetboy

+0

Да, используйте «Читатель». Обновлен ответ. – phihag

+0

Как я могу преобразовать снова в байт, если я использую это: 0xf & fileBits [q] – Streetboy

Смежные вопросы