首页 新闻 会员 周边 捐助

小白提问:Java 如何实现文件数据的padding和还原效率会高?

0
[已解决问题] 解决于 2023-04-20 09:25

需要对文件数据末尾进行填充0或者其他以满足规定大小;后续还需要进行数据还原。我想问是读取这个padding后的文件原始字节数到新File还是说有什么其他更好的方法?

nihaoqingtuan的主页 nihaoqingtuan | 初学一级 | 园豆:104
提问于:2023-04-17 19:39
< >
分享
最佳答案
1

Java 中可以通过 RandomAccessFile 类来实现对文件的随机访问和修改,进而实现对文件的 padding 和还原。

对于文件的 padding,可以先获取文件当前的长度,计算需要填充的字节数,然后使用 RandomAccessFile 类中的 write 方法将指定的字节写入到文件末尾,实现 padding。代码示例如下:

arduino

public static void padding(String filePath, int blockSize) throws IOException {
File file = new File(filePath);
long fileSize = file.length();
long paddingSize = blockSize - fileSize % blockSize;
if (paddingSize != blockSize) {
RandomAccessFile raf = new RandomAccessFile(file, "rw");
raf.seek(fileSize);
byte[] padding = new byte[(int) paddingSize];
raf.write(padding);
raf.close();
}
}
对于文件的还原,可以直接读取指定长度的字节数到新的文件中即可。代码示例如下:

arduino

public static void restore(String srcFilePath, String destFilePath, int blockSize) throws IOException {
File srcFile = new File(srcFilePath);
long fileSize = srcFile.length();
RandomAccessFile raf = new RandomAccessFile(srcFile, "r");
byte[] buffer = new byte[blockSize];
long readBytes = 0;
while (readBytes < fileSize) {
int len = raf.read(buffer);
if (len == -1) {
break;
}
readBytes += len;
if (readBytes <= fileSize) {
File destFile = new File(destFilePath);
FileOutputStream fos = new FileOutputStream(destFile, true);
fos.write(buffer, 0, len);
fos.close();
}
}
raf.close();
}
需要注意的是,如果 padding 的字节数正好是一个 block 的大小,那么在还原文件时需要特殊处理,避免多读取一个 block 的数据。

奖励园豆:5
Technologyforgood | 大侠五级 |园豆:7775 | 2023-04-17 20:01

大佬我想问下,还原代码中的形参blockSize是原文件的大小是嘛

nihaoqingtuan | 园豆:104 (初学一级) | 2023-04-18 14:25

@nihaoqingtuan: 实际上,形参blockSize是指定的块大小,用于对文件进行划分和填充。在进行文件padding时,需要将原文件的大小扩展到blockSize的整数倍,以便于存储和处理。具体实现中,可以通过计算原文件大小fileSize对blockSize取余,得到需要填充的字节数,然后在原文件数据的末尾填充相应数量的0或其他填充字符,以达到扩展文件大小的目的。

在还原文件数据时,需要按照指定的块大小blockSize读取文件数据,然后去除填充的字符,最终得到原始数据。

因此,形参blockSize并不是原文件的大小,而是指定的块大小。实现过程中需要根据块大小对文件进行划分和填充,以及在还原数据时去除填充的字符。

Technologyforgood | 园豆:7775 (大侠五级) | 2023-04-18 22:09

@Technologyforgood: 形参srcFilePath是指填充前的文件吧,那fileSize应该是填充前的文件字节数吧。

nihaoqingtuan | 园豆:104 (初学一级) | 2023-04-19 09:29

@Technologyforgood: 请问还原的时候这个原文件不是指定块的大小的倍数的情况下,该怎么处理?就是原文件是16字节的倍数但是不是1024字节的倍数,对于稍微大点的文件我设置blocksize为16时还原会很慢,但是设置成1024的话又不能还原成功。这种情况下该怎么处理比较好?

nihaoqingtuan | 园豆:104 (初学一级) | 2023-04-19 10:15
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册