Java 在BufferedReader之后使用DataInputStream

Java 在BufferedReader之后使用DataInputStream,java,bufferedreader,datainputstream,pgm,Java,Bufferedreader,Datainputstream,Pgm,二进制PGM文件示例如下所示: P5 # This is a comment 10 10 255 #image intensity information in bytes that I am unable to copy paste here import java.io.*; public class Pgm_reader2 { public static void main(String[] args) throws IOException { try {

二进制PGM文件示例如下所示:

P5
# This is a comment
10 10
255
#image intensity information in bytes that I am unable to copy paste 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);
            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();
        }
    }
}

当我尝试使用以下代码读取文件时:

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();
        }
    }
}
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();
        }
    }
}
但它表明,
DataInputStream.readLine()
方法已被弃用。因此,为了避免使用此方法,我尝试使用
BufferedReader.readLine()
方法,如下所示:

P5
# This is a comment
10 10
255
#image intensity information in bytes that I am unable to copy paste 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);
            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();
        }
    }
}
第二个
while
循环,即

while(dis.available() != 0){
    System.out.print(dis.readUnsignedByte() + " ");
}
它不起作用

可能的原因是什么

我尝试使用更大的图像,即400x400图像,而不是10x10图像,

并尝试使用以下代码从一个图像复制字节并将其粘贴到新文件中:

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();
        }
    }
}
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();
        }
    }
}
import java.io.*;
公共级Pgm_读取器2{
公共静态void main(字符串[]args)引发IOException{
试一试{
FileInputStream inRaw=新的FileInputStream(“A.pgm”);
FileOutputStream outRaw=新的FileOutputStream(“B_test.pgm”);
DataInputStream dis=新的DataInputStream(inRaw);
DataOutputStream dos=新的DataOutputStream(outRaw);
BufferedReader BufferedReader=新的BufferedReader(新的InputStreamReader(inRaw));
字符串行=null;
int i=0;
而(i<4){
line=bufferedReader.readLine();
dos.writeBytes(行);
dos.writeBytes(“\n”);
i++;
}
int字节=0;
while(dis.available()!=0){
intbyte=dis.readUnsignedByte();
dos.writeByte(intbyte);
}
}捕获(例外e){
e、 printStackTrace();
}
}
}
输出图像如下所示:


如果在整个代码中使用
DataInputStream.readLine()
,则输出图像与输入图像完全相同。它是如何发生的?

BufferedReader被缓冲的,这意味着它将尽可能多地读取(增加缓冲区的大小),以最小化对底层读取器或流的调用数量。因此,不适合以后更改流。一般来说,除非您真的知道自己在做什么,否则更改底层流或读取器的包装器是个坏主意

在这种情况下,最简单的解决方案是使用不推荐使用的方法。您可以编写自己的readLine()替换程序,但这可能会带来更多的问题

@已弃用此方法无法将字节正确转换为字符


这是真的,但是对于ASCII字符,它可能会满足您的需要。

我得到了答案,为什么在
dataInputStream
之前使用
bufferedReader时,图像会向上和向左移动一点,为什么底部会有黑色条纹。解释:


如果图像大小为400*400,则在头文件之后要读取160000字节。由于bufferedReader读取额外的数据并保存在其缓冲区中,因此我们假设它在报头之后额外读取25000字节。因此,当
dataInputStream
开始读取图像强度时,它将从第25001个字节开始读取。它将第2500001字节放在第一个位置,因此所有像素强度移到后面250000个位置,即向上62行,向左200个像素。因为上一次减少了25000字节,所以从像素(160000-25000+1)到160000写入了0,因此底部有一个黑色的条带。

你不能使用
DataInputStream\readUTF()
?@VinceEmigh我刚才试过使用它,它给出了
java.io.EOFException
例外情况请参见:@Meiko感谢链接,这可能是因为buffererReader正在消耗一切。@gpasch在这种情况下,有一个原因,您不应该使用它:
@不推荐使用此方法无法正确地将字节转换为字符。
我测试了较大输入文件的代码,并编辑了问题以包含结果,请检查它。