- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个问题,为什么我会得到这段代码的输出。我正在处理一个更大的项目,但我将问题范围缩小到了这一点。这是代码:
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
我想知道为什么我得到的读数与我写的不同,为什么图像在第一个图像之后读取为空?
最佳答案
png
不是 Java java.lang.Object
(例如,原始字节序列不会编码长度,并且字节数组在 Java 中不会动态调整大小)是java.lang.Object
)。因此,一种解决方案是用 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()));
关于java - ObjectInputStream 读取不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21899015/
当我尝试模拟 ObjectInputStream 对象时,我得到一个 NullPointerException。更准确地说,当调用此行时: when(inputStream.readObject())
这是我的代码: ObjectInputStream ois = null; UserRegistration UR = new UserRegistration(); Scan
所以我试图将一个对象从客户端发送到服务器,然后我用这个对象做一些事情。我验证了发送时对象包含数据。当我在调试器中读取对象时,它的所有属性均为 null。 下面是我发送对象的位置: private cl
我正在使用套接字对java网络进行编程,并使用简单对象在远程程序之间交换数据。 在本例中,我有一个使用以下方法构造的ObjectInputStream: new ObjectInputStream(S
我一直在尝试制作一款两人多米诺骨牌游戏。目前,我希望在玩家 2 的屏幕上模仿玩家 1 的 Action ,仅此而已。如果我启动玩家 1 的屏幕并移动一些多米诺骨牌,则当我启动玩家 2 的屏幕时会出现更
这个问题已经有答案了: Sending the same but modifed object over ObjectOutputStream (2 个回答) 已关闭 4 年前。 我正在尝试通过套接字
我在一个文件中存储了多个对象。这与 ObjectInputStream 有关。如果我有以下代码: FileInputStream fis = new FileInputStream(filename)
这个问题已经有答案了: Java socket/serialization, object won't update (2 个回答) 已关闭 8 年前。 我有多个客户端和一台服务器。服务器在一个线程中
我有一系列通过网络套接字发送的对象。 用于读取数据的代码已经实现并且可以工作,但我的问题是有时套接字超时会中断对象的读取(ObjectInputStream.readObject()),从而损坏流.
当我尝试从服务器发送一个对象时,我的计算机似乎崩溃了,第 27 行尝试接收该对象,我想我得到了一个无效的类型代码:0一次,但通常只是崩溃,所以我必须重新启动 new Thread(
我试图在第24行的客户端中实例化一个ObjectInputStream,但它不会,我可以实例化一个ObjectOutputStream,但不能实例化Input。 private class C
我正在尝试使用以下代码读取我保存的文件: public void saveOnFile() { try { ObjectOutputStream output = ne
我保存了一个ArrayList作为带有 ObjectOutputStream 的对象。现在,我如何在另一个应用程序项目上使用 ObjectInputStream 读取该对象?我尝试了一下,它抛出了 C
我有两个类。在第一个类中,我从List中写入数据,在第二堂课中,我想读取这些数据并将其放入listview中。它正确保存数据,但是当我尝试获取它时,logcat 给出错误: java.lang.Cla
我正在尝试将 ArrayList 发送到 Android 设备上的客户端。服务器说它发送了该对象,但是在 Android 设备上它挂起。我已经阅读过,在创建 ObjectInputStream 时,必
我正在通过 java 套接字将文件从 Google glass 设备读取到 PC。由于 catch 语句抛出 eof 异常,我的其余代码被忽略。我该如何解决这个问题? 代码:接收图像(并将其放入简单的
几天前,我开始编写一个小型多人游戏,其中我使用 ObjectInputStreams 和 ObjectOutputStreams 与服务器交换数据。但由于某种原因,服务器没有收到任何东西。所以我寻求一
我有一个套接字,它每隔几秒通过 ObjectOutputStream 向客户端发送一个对象列表。在服务器端,每次 writeObject(myList) 之后,我执行 flush 然后 reset。使
这个问题已经有答案了: ObjectInput and Output streams are not being accepted by client/server (2 个回答) 已关闭 5 年前。
我在使用二进制文件加载应用程序时遇到问题。我正在尝试从二进制文件中读取数据并将数据注入(inject)到我的应用程序中的一些 HashMaps/ArrayLists 中。 public void lo
我是一名优秀的程序员,十分优秀!