Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.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/2/powershell/12.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 - Fatal编程技术网

Java中的资源文件格式处理

Java中的资源文件格式处理,java,Java,我正在尝试用Java为特定的资源归档文件格式实现一个处理器。该格式有一个标题,由三个字符描述、一个伪字节和一个指示文件数量的字节组成 然后,每个文件都有一个条目,由一个伪字节、一个描述文件名的12-char字符串、一个伪字节和一个在三字节数组中声明的偏移量组成 阅读这种结构的合适课程是什么?我尝试了RandomAccessFile,但它不允许读取数据数组,例如,通过调用readChar()三次,我只能读取三个chars,等等 当然我可以扩展RandomAccessFile来做我想做的事情,但是必

我正在尝试用Java为特定的资源归档文件格式实现一个处理器。该格式有一个
标题
,由三个
字符
描述、一个伪字节和一个指示文件数量的字节组成

然后,每个文件都有一个条目,由一个伪字节、一个描述文件名的12-
char
字符串、一个伪字节和一个在三字节数组中声明的偏移量组成

阅读这种结构的合适课程是什么?我尝试了
RandomAccessFile
,但它不允许读取数据数组,例如,通过调用
readChar()
三次,我只能读取三个
char
s,等等

当然我可以扩展
RandomAccessFile
来做我想做的事情,但是必须有一个合适的现成类来做这种处理,不是吗

这是我的C#标题阅读器:

我会和你一起去。这将允许您任意搜索,但也将高效、透明地处理太大而无法轻松放入RAM中的大型文件

在我看来,这是从文件中读取这样的结构化二进制数据的最佳方法


然后,您可以在此基础上构建自己的数据结构,以处理特定的文件格式。

我认为您的C代码很幸运,因为它依赖于在其他地方设置的字符编码,如果它与文件中每个字符的字节数不匹配,您的代码可能会失败

在Java中实现这一点最安全的方法是严格读取字节并自己进行字符转换。如果您需要搜索功能,那么确实
RandomAccessFile
将是您最简单的解决方案,但是应该指出,
InputStream
允许跳过,因此如果您不需要实际的随机访问,只需跳过一些文件,您当然可以使用它

在任何一种情况下,您都应该按照文件规范从文件中读取字节,然后根据已知编码将它们转换为字符。您不应该相信非Java程序编写的文件包含除
字节
以外的任何Java数据类型,即使它是由Java编写的,也可能在编写时被转换为原始字节

因此,您的代码应该大致如下:

String header = "";
int nFiles = 0;

RandomAccessFile raFile = new RandomAccessFile( "filename", "r" );

byte[] buffer = new byte[3];
int numRead = raFile.read( buffer ); 
header = new String( buffer, StandardCharsets.US_ASCII.name() );

int numSkipped = raFile.skipBytes(1);

nFiles = raFile.read(); // The byte is read as an integer between 0 and 255
健全性检查(检查实际读取了3个字节,跳过了1个字节,并且
nFiles
不是-1),为简洁起见,跳过了异常处理


如果您使用
InputStream

当您说您有三个字符值等时,它们的编码方式是什么,则大致相同?它们占用多少字节?常规字符ASCII字符。。。2个字节我猜ASCII字符通常占1个字节
RandomAccessFile
读取两个字节的字符,因为它希望它们是UTF-16。您应该检查文件的文档。在这种情况下,猜测的结果很糟糕。哪个应用程序编写了该文件?它是用Java写的吗?你有密码吗?你是对的,是1字节,我错了。我过去常常用c#读这个文件,把代码放在我的OP里。
String header = "";
int nFiles = 0;

RandomAccessFile raFile = new RandomAccessFile( "filename", "r" );

byte[] buffer = new byte[3];
int numRead = raFile.read( buffer ); 
header = new String( buffer, StandardCharsets.US_ASCII.name() );

int numSkipped = raFile.skipBytes(1);

nFiles = raFile.read(); // The byte is read as an integer between 0 and 255