【发布时间】:2015-10-12 15:50:41
【问题描述】:
我正在尝试让我的 Java 应用程序读取给定路径中的所有数据。所以文件、目录、元数据等。这还包括 NTFS 称为备用数据流 (ADS) 的一种奇怪的东西。
显然它就像目录或文件中的第二层数据。您可以打开命令提示符并使用“:”在 ADS 中创建文件,例如:
C:\ADSTest> echo test>:ads.txt
所以,
C:\ADSTest> notepad :ads.txt
应该打开一个包含字符串“test”的记事本。但是,如果你这样做了:
C:\ADSTest> dir
您将看不到 ads.txt。但是,如果您使用显示 ADS 数据的 dir 选项,您将能够看到它:
C:\ADSTest> dir /r
MM/dd/yyyy hh:mm .:ads.txt
现在,我知道 Java IO 具有读取 ADS 的能力。我怎么知道?嗯,Oracle's documentations clearly states so:
如果您的文件系统实现支持的文件属性 不足以满足您的需求,您可以使用 UserDefinedAttributeView 来创建和跟踪您自己的文件属性。
一些实现将此概念映射到 NTFS 等功能 文件系统上的替代数据流和扩展属性,例如 作为 ext3 和 ZFS。
另外,a random post on a random forum :D
数据存储在 NTFS 备用数据流 (ADS) 中 通过 Java IO 可读(我已经测试过了)。
问题是,我找不到任何可以解析 ADS 的预先编写的文件属性查看器,而且我不明白如何编写自己的 ADS 解析器。我是一个初学者程序员,所以我觉得这太过分了。有人可以帮助我或指出正确的方向吗?
解决方案
编辑: 在@knosrtum 的帮助下,我能够设计一种方法,该方法将从给定路径返回所有已解析的 ADS 信息作为字符串的 ArrayList(它也可以轻松编辑为一个文件的 ArrayList)。这是任何可能需要它的人的代码:
public class ADSReader {
public static ArrayList<String> start(Path toParse) {
String path = toParse.toString();
ArrayList<String> parsedADS = new ArrayList<>();
final String command = "cmd.exe /c dir " + path + " /r"; // listing of given Path.
final Pattern pattern = Pattern.compile(
"\\s*" // any amount of whitespace
+ "[0123456789,]+\\s*" // digits (with possible comma), whitespace
+ "([^:]+:" // group 1 = file name, then colon,
+ "[^:]+:" // then ADS, then colon,
+ ".+)"); // then everything else.
try {
Process process = Runtime.getRuntime().exec(command);
process.waitFor();
try (BufferedReader br = new BufferedReader(
new InputStreamReader(process.getInputStream()))) {
String line;
while ((line = br.readLine()) != null) {
Matcher matcher = pattern.matcher(line);
if (matcher.matches()) {
parsedADS.add((matcher.group(1)));
}
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int z = 0; z<parsedADS.size(); z++)
System.out.println(parsedADS.get(z));
return parsedADS;
}
}
【问题讨论】:
标签: java io java-io ntfs alternate-data-stream