【发布时间】:2026-01-22 13:25:01
【问题描述】:
我有一个问题两天来一直试图解决,但在网上(或在这里)没有找到任何东西,所以我想我会发布这个问题,看看我能得到什么样的反馈。我在业余时间编写了一个小程序,它扫描文件目录(已删除文件扩展名)并读取每个文件的文件头,以找出每个文件的文件扩展名。到目前为止,我已经使用了一系列 if/else if 语句来满足我程序的“模式匹配”功能......
private String fileHeaderCheck()
{
/* ----- PNG File Type Verification ----- */
if (headerCheck.buffer[0] == 0x89 && headerCheck.buffer[1] == 0x50 && headerCheck.buffer[2] == 0x4E && headerCheck.buffer[3] == 0x47
&& headerCheck.buffer[4] == 0xD && headerCheck.buffer[5] == 0xA && headerCheck.buffer[6] == 0x1A && headerCheck.buffer[7] == 0xA)
{
return ".png";
}
/* ----- JPG File Type Verification ----- */
else if (headerCheck.buffer[0] == 0xFF && headerCheck.buffer[1] == 0xD8 && headerCheck.buffer[2] == 0xFF && headerCheck.buffer[3] == 0xE0)
{
return ".jpg";
}
// And so on and so on through the whole list of file types I am checking for
else
return "unknown";
}
headerCheck 是一个 Buffer 对象,它包含一个 byte[] 保存从文件的前 512 个字节读取的数据。我在这个模式匹配过程中合并了 25-30 种不同的文件类型,所以你可以看到这个函数很快就会变得又大又丑。我想做的是使用 Node 对象的 ArrayList,每个对象都包含:1. 特定文件类型的标头信息的字节 [],以及 2. 表示文件扩展类型的字符串, 然后只需遍历数组,将 Node byte[] 与 headerCheck.buffer[] 进行比较,任何匹配的元素我都会将它的 fileType 附加到我从 headerCheck.buffer[] 中读取的文件的末尾。我的 Node 类就是这样设置的......
class Node //if this is the "png" Node
{
byte[] metadata;
String fileType;
Node()
{
this.metadata = new byte[]{0x89, 0x50, 0x4E, 0x47, 0xD, 0xA, 0x1A, 0xA};
this.fileType = ".png";
}
}
我不知道如何初始化 ArrayList。我是否必须使用预配置的数据创建/实例化 25-30 个单独的节点类来初始化 ArrayList,然后将它们添加()到它?这似乎比所有 if/else if 语句或 switch 更糟糕......第二个问题是,一旦我用所有 Node 对象实例化了我的 ArrayList,我很难想象如何遍历它的 byte[] 以便比较它到 headerCheck.buffer[]。我正在突破我的知识界限,所以对于这些问题,我没有代码,因为我不知道从哪里开始编写这些东西。我正在考虑双重嵌套的 for 循环,但我还没有走到那一步,因为我还没有找到一种有效的方法来初始化 ArrayList。我什至研究了一些设计模式作为可能的补救措施,但无济于事。任何帮助将不胜感激...谢谢
迭代方法(类似这些):
boolean match;
for (int x = 0; x < pattens.get(metadata).size(); x++)
{
if (headerCheck.buffer[x] != patterns.get(metadata[x])
{
match = false;
return;
}
else
return true;
}
【问题讨论】: