Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.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/8/file/3.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保存的未知文件_Java_File_Parsing - Fatal编程技术网

打开用Java保存的未知文件

打开用Java保存的未知文件,java,file,parsing,Java,File,Parsing,我正在为一家公司做数据恢复。他们需要一种特定类型的文件,在政府提供的java软件包中创建。文件名丢失,但文件本身包含项目名。但是,只有在该软件中实际打开这些文件时,才能找到它们,因为这些文件本身不包含任何纯文本。有成千上万的文件,所以我们不能期望有人手动打开它们并更新文件名 另一个困难是这些文件有几种不同的格式:软件的最新版本不能只打开以前版本的文件,它需要“转换”它们。这给我的印象是,这些文件只是已保存的对象,随着每个软件版本的出现,它们的类发生了巨大的变化,以至于旧文件无法再转换到新类中。或

我正在为一家公司做数据恢复。他们需要一种特定类型的文件,在政府提供的java软件包中创建。文件名丢失,但文件本身包含项目名。但是,只有在该软件中实际打开这些文件时,才能找到它们,因为这些文件本身不包含任何纯文本。有成千上万的文件,所以我们不能期望有人手动打开它们并更新文件名

另一个困难是这些文件有几种不同的格式:软件的最新版本不能只打开以前版本的文件,它需要“转换”它们。这给我的印象是,这些文件只是已保存的对象,随着每个软件版本的出现,它们的类发生了巨大的变化,以至于旧文件无法再转换到新类中。或者别的什么。我已经有一段时间没有用java编程了。:)

在任何情况下,我“只是”想读取该对象的单个属性。但是我没有它的类来解析它(它可以是许多类中的一个,取决于文件保存时使用的软件版本)。我有那个软件的jar文件,但我希望我不需要开始分析整个软件包,看看它到底做了什么


所以我终于开始问自己的问题:我能打开这样一个文件(假设它确实是一个“保存的对象”),并以某种方式将其内容解析为纯文本吗?我确信,一旦完成,我就可以检索项目名称保存的位置——希望在不同软件版本中位于相同的位置

如果它们是序列化对象,则文件将以魔术值0xACED开始,然后是协议版本号,当前为0x0005


如果是这样的话,除了使用Java代码对其进行反序列化之外,您无法真正解析它,因为相关版本的类路径上提供了所有相关的类。原因是任何可序列化类都可以提供自己的代码来写入流,因此只有该类才能正确理解。

很难说哪条路径更容易,但我看到了两个方向:)-1)反编译jar类文件,并尝试找到写入文件的位置(例如,仅搜索ObjectOutputStream就可以了。)对我来说,这似乎是一个更简单的选择:)-2)尝试对文件格式进行反向工程(这里的序列化规范是一个很好的起点:更具体地说是协议:。还有一件事,如果文件确实是使用Java的标准序列化编写的,并且您所追求的项目名称只是一个字符串,那么“字符串对象的表示形式由长度信息和修改后的UTF-8编码的字符串内容组成。”,您只需在十六进制编辑器中打开该字符串,就可以在文件的某处找到该UTF-8编码的字符串:)反编译最初让我感到害怕,但最终得到了最快、最好的结果!感谢您的建议。我发现文件总是以DFFC 6148 55BE 74F8开头…(也许我应该在我的问题中提到这一点),所以我假设这排除了序列化对象。感谢您提供的信息!我想我必须反编译并查看文件的写入位置,正如xpa1492所建议的。