【问题标题】:ObjectInputStream reading incorrectlyObjectInputStream 读取不正确
【发布时间】:2014-02-20 05:32:53
【问题描述】:

我有一个问题,为什么我会得到我在这段代码上的输出。我有一个更大的项目正在做,但我将问题缩小到了这个范围。代码如下:

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import javax.imageio.ImageIO;

public class Main {

static String workingDirectory;

static int num1;
static int num2;
static BufferedImage image1;
static BufferedImage image2;

public static final int JOB = 0;

@SuppressWarnings("unused")
public static void main(String[] args) {

    workingDirectory = System.getProperty("user.dir") + "/src/";

    if(JOB == 0){
        read(workingDirectory + "output&input.myExtention");
    }else if(JOB == 1){
        num1 = 18;
        num2 = 100;
        getImages("Smile.jpeg", "Frown.jpeg");
        write(workingDirectory + "output&input.myEx");
    }

}

static void getImages(String imageName1, String imageName2){
    try{
        image1 = ImageIO.read(new File(workingDirectory + imageName1));
        image2 = ImageIO.read(new File(workingDirectory + imageName2));
    }catch(IOException e){
        e.printStackTrace();
    }
}

static void read(String path){
    File file = new File(path);

    try {
        FileInputStream fis = new FileInputStream(file);
        ObjectInputStream ois = new ObjectInputStream(fis);

        num1 = ois.readInt();
        System.out.println("Num1 = " + num1);

        image1 = ImageIO.read(ois);
        System.out.println("Image1 = " + image1);

        num2 = ois.readInt();
        System.out.println("Num2 = " + num2);

        image2 = ImageIO.read(ois);
        System.out.println("Image2 = " + image2);

        ois.close();
        fis.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

static void write(String path){
    File file = new File(path);

    try{
        FileOutputStream fos = new FileOutputStream(file);
        ObjectOutputStream oos = new ObjectOutputStream(fos);

        System.out.println("Writing Num1 = " + num1);
        oos.writeInt(num1);
        System.out.println("Image1 = " + image1);
        ImageIO.write(image1, "png", oos);
        System.out.println("Writing Num2 = " + num2);
        oos.writeInt(num2);
        System.out.println("Image2 = " + image2);
        ImageIO.write(image2, "png", oos);

        oos.close();
        fos.close();
    }catch(FileNotFoundException e){
        e.printStackTrace();
    }catch(IOException e){
        e.printStackTrace();
    }
}
}

这是两次不同运行的输出。第一个设置 JOB = 1(写入文件),第二个设置 JOB = 0(读取文件)。

OUTPUT 1:

Writing Num1 = 18
Image1 = BufferedImage@77827284: type = 5 ColorModel: #pixelBits = 24 numComponents = 3 color space = java.awt.color.ICC_ColorSpace@152c7568 transparency = 1 has alpha = false isAlphaPre = false ByteInterleavedRaster: width = 225 height = 225 #numDataElements 3 dataOff[0] = 2
Writing Num2 = 100
Image2 = BufferedImage@16ba8602: type = 5 ColorModel: #pixelBits = 24 numComponents = 3 color space = java.awt.color.ICC_ColorSpace@152c7568 transparency = 1 has alpha = false isAlphaPre = false ByteInterleavedRaster: width = 225 height = 225 #numDataElements 3 dataOff[0] = 2


OUTPUT 2:

Num1 = 18
Image1 = BufferedImage@4d865b28: type = 5 ColorModel: #pixelBits = 24 numComponents = 3 color space = java.awt.color.ICC_ColorSpace@2fcac6db transparency = 1 has alpha = false isAlphaPre = false ByteInterleavedRaster: width = 225 height = 225 #numDataElements 3 dataOff[0] = 2
Num2 = -1974494307
Image2 = null

我想知道为什么我得到的读数与我写的不同,为什么图像在第一个之后读取为空?

【问题讨论】:

    标签: java file-io javax.imageio objectinputstream objectoutputstream


    【解决方案1】:

    png 不是 Java java.lang.Object(例如,原始字节序列不编码长度,字节数组在 Java 中不是动态调整大小的,它们是 java.lang.Objects)。因此,一种解决方案是用byte[] 包装您的(ImageIO.write(image1, "png", oos); [和第二个图像写入],然后是读取调用)。请允许我举例说明,这类似于 -

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ImageIO.write(image1, "png", baos); 
    oos.writeObject(baos.toByteArray());
    ByteArrayOutputStream baos2 = new ByteArrayOutputStream();
    ImageIO.write(image2, "png", baos2); 
    oos.writeObject(baos2.toByteArray());
    

    然后更新您的阅读(即)-

    image1 = ImageIO.read(new ByteArrayInputStream((byte[])ois.readObject()));
    image2 = ImageIO.read(new ByteArrayInputStream((byte[])ois.readObject()));
    

    【讨论】:

    • 使用ImageIO.write() 写入的 png 是一个字节序列。在 OP 的代码中,ImageIO 使用write() 方法之一直接写入ObjectOutputStream。这可能是有原因的,或者更准确地说是为什么它没有通过ImageIO.read() 正确读取,但你没有给出它。
    • 如果它需要编码一个长度,这就是你的答案应该说的,而不是'a PNG is not a Java object',这本身并不是一个解释。
    • 必须同意@EJP。问题是 ImageIO 阅读器插件将根据需要读取尽可能少的字节,可能比作者最初编写的要少。您需要对图像的长度进行编码,以确保在读取图像后流正确对齐。并且 OP 一开始可能不应该使用ObjectInputStream 或writeObject() ..
    猜你喜欢
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多