ObjectInputStream неправильно читает
У меня есть вопрос о том, почему я получаю выходные данные в этом коде. У меня есть большой проект, над которым я работаю, но я сузил проблему до этого. Вот код:
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
Что мне интересно, так это то, почему я получаю другие показания, отличные от того, что я написал, и почему изображения считаются нулевыми после первого?
1 ответ
png
это не Java java.lang.Object
(например, необработанная последовательность байтов не кодирует длину и байтовые массивы не имеют динамического размера в Java, они java.lang.Object
с). Поэтому одним из решений является завернуть ваш (ImageIO.write(image1, "png", oos);
[и второе изображение записи], а затем вызовы чтения) с byte[]
, Позвольте мне проиллюстрировать, это что-то вроде -
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()));