Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';运行我的JAR时,从外部文件读取t readObject()_Java_Deserialization - Fatal编程技术网

Java Can';运行我的JAR时,从外部文件读取t readObject()

Java Can';运行我的JAR时,从外部文件读取t readObject(),java,deserialization,Java,Deserialization,我的程序在一个JAR文件中,一些文件在同一目录的文件夹中。经过数小时的搜索,我找到了一些允许我列出该文件夹中文件的代码(因为File.listFiles()不起作用),但现在readObject()给了我IOException。当我从IDE或使用cmd运行它时,它工作得很好。它仅在通过双击运行JAR时抛出异常 以下是我正在做的: publicstatictemplate[]loadTemplates()抛出IOException,ClassNotFoundException{ Path dirt

我的程序在一个JAR文件中,一些文件在同一目录的文件夹中。经过数小时的搜索,我找到了一些允许我列出该文件夹中文件的代码(因为
File.listFiles()
不起作用),但现在
readObject()
给了我
IOException
。当我从IDE或使用cmd运行它时,它工作得很好。它仅在通过双击运行JAR时抛出异常

以下是我正在做的:

publicstatictemplate[]loadTemplates()抛出IOException,ClassNotFoundException{
Path dirtemp=Path.get(Path.toString(),TEMPLATE_Path);
DirectoryStream dirStream=Files.newDirectoryStream(dirtemp);
ArrayList files=新的ArrayList();
for(路径条目:dirStream){
添加(entry.toFile());
}
如果(files.size()!=0){
ArrayList templates=新建ArrayList();
用于(文件:文件){
FileInputStream fis=新的FileInputStream(文件);
ObjectInputStream ois=新ObjectInputStream(fis);
Object Object=ois.readObject();
if(模板的对象实例){
模板。添加((模板)对象);
}
ois.close();
fis.close();
}
集合。排序(模板);
返回templates.toArray(新模板[0]);
}否则返回null;
}
TEMPLATE\u PATH
只是一个字符串,其中包含文件所在文件夹的名称

path
是我的类中的一个静态变量,它包含JAR的当前路径。我从main方法初始化它,因为不打算更改位置。以下是我用来获取它的代码(如果相关):

公共静态void findJARPath(){
最终类引用类=Main.Class;
最终URL=
referenceClass.getProtectionDomain().getCodeSource().getLocation();
试一试{
最终文件jarPath=新文件(url.toURI()).getParentFile();
path=path.get(jarPath.toURI());
}捕获(忽略最终URISyntaxException){}
}
有人知道为什么会这样吗

我在Windows上运行,但我希望它也在不同的操作系统上运行。如果您能指出这些代码是否也不可移植,我将不胜感激

编辑: 异常的堆栈跟踪:

javax.swing.ImageIcon local class incompatible: stream class desc serialVersionUID = -962022720109015502, local class serialVersionUID = 532615968316031794
java.base/java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:689)
java.base/java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1903)
java.base/java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1772)
java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2060)
java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1594)
java.base/java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2355)
java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2249)
java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2087)
java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1594)
java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:430)
Data.FileManager.loadTemplates(FileManager.java:108)
写入文件的代码:

publicstaticvoidsavetemplate(模板模板){
新文件(模板路径).mkdir();
String filename=StringUtils.toFilename(template.getName(),“templa”);
试一试{
FileOutputStream fos=新的FileOutputStream(模板路径+文件名);
ObjectOutputStream oos=新的ObjectOutputStream(fos);
oos.writeObject(模板);
oos.close();
fos.close();
}捕获(IOE异常){
e、 printStackTrace();
}
}

编辑:算出了。显然,无论出于何种原因,当通过双击运行jar时,模板类中图像的ImageIcon UID将不匹配。用一个固定的UID将图像包装到另一个类中解决了这个问题。

您的计划当然会失败:“与我的jar文件相同的目录”显然会包含。。。。。你的jar文件

如果您尝试使用OIS读取它,它将崩溃。在dirstream通过此目录时应用一些筛选。它有正确的分机吗?它是一个实际的文件(相对于一个目录)


此外,您的代码存在内存泄漏;dirstreams是资源,FileInputStream也是资源。你必须把这些关上。唯一安全的方法是使用try/finally或try with resources。如果您不熟悉这些技术,请在web上搜索“Java try with resources”。

您已经保存了一个JDK11 ImageIcon,并且正在尝试在没有该图标的VM上反序列化它,因为它有一个JDK14 ImageIcon或诸如此类的东西

更一般地说,如果目的是允许在另一个系统上反序列化任何内容,则不能序列化任何内容,除非对其进行非常仔细的管理。ImageIcon by intent不是这样管理的,因此,不能使用OIS和OOS保存ImageIcon。看起来您可以,但警告是:在不同的虚拟机上中断


您必须扔掉所有这些代码,并考虑另一种序列化ImageIcon对象的方法。可能会保存原始像素,将其保存为PNG等。

为什么会发生这种情况?什么
IOException
?@marqueisoflornejavax.swing.ImageIcon;本地类不兼容。在问题中发布整个异常及其堆栈跟踪。还有编写该文件的代码。但是您似乎完全忽略了Javadoc中关于该类序列化的警告。@Marqueisoflorne我刚刚发布了堆栈跟踪和文件编写代码。正如我所说的。您已经忽略了警告,并且正在做它所说的不应该做的事情:用一个Java版本序列化Swing类,然后用另一个版本反序列化它。解决方案:不全是。但尝试反序列化JAR文件将抛出
newObjectInputStream
,而不是
readObject()
。我怀疑这是真的发生了什么。我不知道我是否误解了这一点,但我没有反序列化一个jar,我有一个父文件夹,包含jar和一个文件夹。我试图反序列化的是文件夹的内容,如果我将cd刻录到父文件夹并从那里运行jar,它将在cmd上运行。