使用Java将二进制PGM文件转换为ASCII PGM文件?使用FileWriter给出空文件

时间:2016-03-16 09:50:00

标签: java fileoutputstream filewriter pgm

如何使用Java将二进制PGM文件转换为ASCII PGM文件?

当我使用以下代码时,我无法在B.pgm中写入ASCII值。我也尝试过使用dos.writeInt

FileInputStream inRaw = null;
FileOutputStream outRaw = null;
try {
     inRaw = new FileInputStream("A.pgm");
     outRaw = new FileOutputStream("B.pgm");
} catch (FileNotFoundException e) {
     e.printStackTrace();
}

DataInputStream dis = new DataInputStream(inRaw);
DataOutputStream dos = new DataOutputStream(outRaw);
int i = 0;
String temp = null;
temp = dis.readLine();
System.out.println(temp);
dos.writeBytes("P2");
dos.writeBytes("\n");
while(i < 3){
    temp = dis.readLine();
    System.out.println(temp);
    dos.writeBytes(temp);
    dos.writeBytes("\n");
    i++;
}
int t = 0;
while(dis.available() != 0){
    t = dis.read();
    System.out.println(t);
    fileWriter.write(t);
    dos.writeInt(t);
    dos.writeBytes("\n");
}

 dis.close();
 dos.close();

我尝试使用FileWriter代替DataOutputStream而代码生成一个空文件,我无法弄清楚原因?

FileInputStream inRaw = null;
FileOutputStream outRaw = null;
try {
     inRaw = new FileInputStream("A.pgm");
     outRaw = new FileOutputStream("B.pgm");
} catch (FileNotFoundException e) {
     e.printStackTrace();
}

DataInputStream dis = new DataInputStream(inRaw);
FileWriter fileWriter = new FileWriter("B.pgm");
int i = 0;
String temp = null;
temp = dis.readLine();
System.out.println(temp);
fileWriter.write("P2");
fileWriter.write("\n");
while(i < 3){
    temp = dis.readLine();
    System.out.println(temp);
    fileWriter.write(temp);
    fileWriter.write("\n");
    i++;
}
int t = 0;
while(dis.available() != 0){
    t = dis.read();
    System.out.println(t);
    fileWriter.write(t);
    fileWriter.write(t);
    fileWriter.write("\n");
}

 dis.close();

1 个答案:

答案 0 :(得分:1)

(这可能无法解决您的问题,但它会使您的代码更加强大。)

数据未写入文件的一个可能原因是您实际上没有关闭流 - 它可以保存在内存缓冲区中,直到那时为止,并且永远不会被写出来。您当然不会明确打电话给fileWriter.close()

可以尝试手动关闭流,但这通常是不必要的,并且在所有情况下都可以正确地执行它。

使用 try-with-resources 更容易 - 这会自动管理您的流,并确保它们在块结束时关闭。

try (FileInputStream inRaw = new FileInputStream("A.pgm");
     FileOutputStream outRaw = new FileOutputStream("B.pgm");
     DataInputStream dis = new DataInputStream(inRaw);
     DataOutputStream dos = new DataOutputStream(outRaw)) {
  // The logic to read dis and write it to dos.
} catch (IOException e) {
  e.printStackTrace();
}
// No need to close the streams - that happened automatically.

您可以使用FileWriter fileWriter = new FileWriter(outRaw)代替DataOutputStream dos = ...,对第二个版本执行类似操作。

如果这还没有解决当前问题,我建议您的逻辑中存在错误。尝试使用调试器逐步执行代码 - 确保实际执行write次调用。