2016-03-30 24 views
1

Eine Probe binäre PGM-Datei wird wie folgt dar:Mit Datainputstream nach BufferedReader

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

wie

enter image description here

Wenn ich versuche, die Datei mit dem folgenden Code zu lesen:

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(); 
     } 
    } 
} 

Es funktioniert perfekt und gibt die folgende Ausgabe:

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 

aber es zeigt, dass die DataInputStream.readLine() Methode veraltet ist. So vermeiden Sie diese Methode habe ich versucht, die BufferedReader.readLine() Verfahren wie folgt verwendet:

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(); 
     } 
    } 
} 

Und die Ausgabe geändert:

P5 
# This is a comment 
10 10 
255 

und es scheint, dass die zweite while Schleife dh

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

funktioniert nicht.

Was könnte der mögliche Grund dafür sein?

Ich habe versucht, statt 10x10 Bild um ein größeres Bild dh 400x400 Bild mit, enter image description here

und versuchten, das Bytes von einem Bild zu kopieren und sie in die neue Datei fügen Sie den folgenden Code verwenden:

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(); 
     } 
    } 
} 

und das Ausgangsbild kam wie folgt aus:

enter image description here

Wenn ich DataInputStream.readLine() im gesamten Code verwende, dann entspricht das Ausgabebild genau dem Eingabebild. Wie ist es passiert?

+0

Können Sie 'DataInputStream # readUTF()' nicht verwenden? –

+0

@VinceEmigh Ich habe versucht, es gerade jetzt zu verwenden, und es gibt 'java.io.EOFException' Ausnahme – cnova

+0

Sie nicht sagen, Sie möchten gepufferten Leser verwenden? dann warum die beiden mischen? – gpasch

Antwort

2

BufferedReader ist gepuffert, was bedeutet, dass es so viel wie möglich lesen wird (um die Größe des Puffers), um die Anzahl der Aufrufe des zugrunde liegenden Readers oder Streams zu minimieren. Daher ist es nicht geeignet, den Stream später zu ändern. Im Allgemeinen ist es eine schlechte Idee, den Wrapper eines zugrunde liegenden Streams oder Lesers zu ändern, es sei denn, Sie wissen wirklich, was Sie tun.

In diesem Fall ist die einfachste Lösung, die veraltete Methode zu verwenden. Sie könnten Ihren eigenen Ersatz für readLine() schreiben, aber das könnte nur mehr Probleme verursachen, als es hilft.

@deprecated Diese Methode konvertiert Bytes nicht ordnungsgemäß in Zeichen.

Dies ist richtig, aber für ASCII-Zeichen wird es wahrscheinlich tun, was Sie brauchen.

+0

Ich habe den Code für größere Eingabedatei getestet und die Frage bearbeitet, um die Ergebnisse zu enthalten Kannst du es bitte überprüfen? – cnova

0

Ich habe die Antwort bekommen, warum das Bild ein wenig nach oben und nach links verschoben ist und warum es schwarzen Streifen an der Unterseite gibt, wenn ich bufferedReader vor dataInputStream verwende. Erklärung:

wir hatten 160000 Bytes nach Header zu lesen, wenn die Bildgröße 400 * 400 war. Da bufferedReader extra liest und in seinem Puffer behält, nehmen wir an, dass es 25000 Bytes extra nach dem Header gibt. Wenn also die dataInputStream beginnt, die Bildintensitäten zu lesen, wird sie vom 25001. Byte gelesen. Und es setzt das 2500001. Byte an der ersten Position, und daher sind alle Pixelintensitäten um 250000 nach hinten versetzt, d. H. 62 Zeilen nach oben und 200 Pixel nach links. Da es in der letzten 25000 Bytes weniger gibt, wird 0 von Pixel (160000-25000 + 1) bis 160000 geschrieben, daher der schwarze Streifen an der Unterseite.