2016-03-30 2 views
1

Пробу двоичный файл PGM выглядит следующим образом:Использование DataInputStream после BufferedReader

P5 
# This is a comment 
10 10 
255 
#image intensity information in bytes that I am unable to copy paste here 

как

enter image description here

Когда я пытаюсь прочитать файл, используя следующий код:

import java.io.*; 

public class Pgm_reader2 { 
    public static void main(String[] args) throws IOException { 
     try { 
      FileInputStream inRaw = new FileInputStream("A.pgm"); 
      DataInputStream dis = new DataInputStream(inRaw); 
      int i = 0; 
      while(i < 4){ 
       System.out.println(dis.readLine()); 
       i++; 
      } 
      while(dis.available() != 0){ 
       System.out.print(dis.readUnsignedByte() + " "); 
      } 
     }catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 

Он отлично работает и дает следующий выход:

P5 
# This is a comment 
10 10 
255 
0 255 255 255 255 255 255 255 255 255 255 0 255 255 255 255 255 255 255 255 255 255 0 255 255 255 255 255 255 255 255 255 255 0 255 255 255 255 255 255 255 255 255 255 0 255 255 255 255 255 255 255 255 255 255 0 255 255 255 255 255 255 255 255 255 255 0 255 255 255 255 255 255 255 255 255 255 0 255 255 255 255 255 255 255 255 255 255 0 255 255 255 255 255 255 255 255 255 255 0 

но это показывает, что метод DataInputStream.readLine() устарел. Таким образом, чтобы избежать с помощью этого метода я попытался с помощью метода BufferedReader.readLine() следующим образом:

import java.io.*; 

public class Pgm_reader2 { 
    public static void main(String[] args) throws IOException { 
     try { 
      FileInputStream inRaw = new FileInputStream("A.pgm"); 
      DataInputStream dis = new DataInputStream(inRaw); 
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inRaw)); 
      int i = 0; 
      while(i < 4){ 
       System.out.println(bufferedReader.readLine()); 
       i++; 
      } 
      while(dis.available() != 0){ 
       System.out.print(dis.readUnsignedByte() + " "); 
      } 
     }catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 

И выход изменен:

P5 
# This is a comment 
10 10 
255 

, и кажется, что второй while цикл т.е.

while(dis.available() != 0){ 
    System.out.print(dis.readUnsignedByte() + " "); 
} 

не работает.

В чем может быть причина?

Я попытался с помощью большего размера т.е. 400x400 вместо изображения 10x10 изображения, enter image description here

и попытался скопировать байты из одного изображения и вставить их в новый файл, используя следующий код:

import java.io.*; 

public class Pgm_reader2 { 
    public static void main(String[] args) throws IOException { 
     try { 
      FileInputStream inRaw = new FileInputStream("A.pgm"); 
      FileOutputStream outRaw = new FileOutputStream("B_test.pgm"); 
      DataInputStream dis = new DataInputStream(inRaw); 
      DataOutputStream dos = new DataOutputStream(outRaw); 
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inRaw)); 
      String line = null; 
      int i = 0; 
      while(i < 4){ 
       line = bufferedReader.readLine(); 
       dos.writeBytes(line); 
       dos.writeBytes("\n"); 
       i++; 
      } 
      int intbyte = 0; 
      while(dis.available() != 0){ 
       intbyte = dis.readUnsignedByte(); 
       dos.writeByte(intbyte); 
      } 
     }catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 

и выходное изображение вышло так:

enter image description here

Если я использую DataInputStream.readLine() во всем коде, тогда выходное изображение будет таким же, как и входное изображение. Как это происходит?

+0

Не могли бы вы использовать 'DataInputStream # readUTF()'? –

+0

@VinceEmigh Я пытался использовать его только сейчас, и он дает исключение 'java.io.EOFException' – cnova

+0

разве вы не сказали, что хотите использовать буферизованный читатель? то зачем смешивать два? – gpasch

ответ

2

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

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

@deprecated Этот метод неправильно преобразовывает байты в символы.

Это правда, однако для символов ASCII он, вероятно, сделает все, что вам нужно.

+0

Я проверил код для более крупного входного файла и отредактировал вопрос, чтобы включить результаты , пожалуйста, проверьте это. – cnova

0

Я получил ответ на вопрос, почему изображение смещено немного вверх и влево и почему есть черная полоса внизу, когда я использую bufferedReader до dataInputStream. Объяснение:

У нас было 160000 байт для чтения после заголовка, если размер изображения был 400 * 400. Так как bufferedReader читает дополнительно и хранит в своем буфере, предположим, что после заголовка он имеет 25000 байт. Поэтому, когда dataInputStream начинает считывать интенсивности изображения, он считывает с 25001-го байта. И он помещает 2500001-й байт в 1-ю позицию, и поэтому все интенсивности пикселей сдвинуты на 250000 позиций позади i.e 62 строк вверх и 200 пикселей влево. Так как в последнем есть 25000 байт меньше, поэтому 0 записывается с пикселя (160000-25000 + 1) на 160000, следовательно, черная полоса внизу.

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