如何使用 Java IO 读取 Windows NTFS 备用数据流?

2023-11-23

我试图让我的 Java 应用程序读取给定路径中的所有数据。文件、目录、元数据等。这还包括 NTFS 称为备用数据流 (ADS) 的一个奇怪的东西。

显然,它就像目录或文件中的第二层数据。您可以打开命令提示符并使用“:”在ADS中创建文件,例如:

C:\ADSTest> echo test>:ads.txt

So,

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的文档中明确指出了这一点:

如果您的文件系统实现支持文件属性 不足以满足您的需求,您可以使用 UserDefinedAttributeView 用于创建和跟踪您自己的文件属性。

一些实现将此概念映射到 NTFS 等功能 文件系统上的替代数据流和扩展属性,例如 如 ext3 和 ZFS。

Also, 随机论坛上的随机帖子:D

数据存储在 NTFS 备用数据流 (ADS) 中 通过Java IO可读(我已经测试过)。

问题是,我找不到任何可以解析ADS的预先编写的文件属性查看器,而且我不明白如何编写自己的ADS解析器。我是一名初学者程序员,所以我觉得这超出了我的能力范围。有人可以帮助我或指出我正确的方向吗?

Solution

EDIT:在 @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;

    }
}

我只需使用语法“file_name:stream_name”打开文件即可读取文件的 ADS。所以如果你已经这样做了:

C:>echo Hidden text > test.txt:hidden

那么你应该能够这样做:

package net.snortum.play;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class AdsPlay {
    public static void main(String[] args) {
        new AdsPlay().start();
    }

    private void start() {
        File file = new File("test.txt:hidden");
        try (BufferedReader bf = new BufferedReader( new FileReader(file))) {
            String hidden = bf.readLine();
            System.out.println(hidden);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

如果您想从以下位置获取 ADS 数据dir /r命令,我认为你只需要执行一个 shell 并捕获输出:

package net.snortum.play;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ExecPlay {

    public static void main(String[] args) {
        new ExecPlay().start();
    }

    private void start() {
        String fileName = "not found";
        String ads = "not found";
        final String command = "cmd.exe /c dir /r"; // listing of current directory

        final Pattern pattern = Pattern.compile(
                  "\\s*"                 // any amount of whitespace
                + "[0123456789,]+\\s*"   // digits (with possible comma), whitespace
                + "([^:]+):"             // group 1 = file name, then colon
                + "([^:]+):"             // group 2 = ADS, then colon
                + ".+");                 // 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()) {
                        fileName = matcher.group(1);
                        ads = matcher.group(2);
                        break;
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(fileName + ", " + ads);

    }
}

现在您可以使用第一个代码清单来打印 ADS 数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Java IO 读取 Windows NTFS 备用数据流? 的相关文章

随机推荐

  • Android Room + 窗口功能

    我尝试在房间查询中使用窗口函数 解析器抱怨我的查询 我只是尝试在 select 语句中添加 ROW NUMBER OVER ORDER BY column 表达式 如果没有此表达式 查询将正确运行 解析器错误 extraneous inpu
  • 我可以检测浏览器中可用的 async/await 吗? [复制]

    这个问题在这里已经有答案了 如标题 如何检测浏览器中的 async await es7 支持 那可能吗 与任何其他语法特征一样 应该对其进行评估才能被检测到 自从eval可以被限制 当启用 CSP 时这可能是不可能的 let isAsync
  • 如何有条件地导入 xslt 中的样式表?

    有没有办法在检查某些条件后导入样式表 例如 如果变量 a 的值 1 则导入 1 xsl 否则导入 2 xsl 大家好 请问有什么办法可以导入吗 检查一些样式表后 状况 就像 如果变量 a 的值 1 然后导入 1 xsl 或者导入 2 xsl
  • node_modules 未被识别为内部或外部命令

    我正在尝试使用 appium jasmine 和 Perfecto mobile 编写测试自动化脚本 我正在使用从以下 URL 克隆的项目和我自己的配置Appium JavaScript 示例 问题是当我执行npm test命令我收到以下错
  • 从单独的路由文件内部访问快速“应用程序”对象的最佳方法是什么?

    在 Express 4 中 默认情况下 路由是从单独的文件加载的 app use routes 将加载routes index js 我有一个附加到的第三方库app本身 是否有首选的访问方式app从内部routes index js 我考虑
  • 关闭呈现的视图控制器

    我有一个理论问题 现在我正在阅读苹果的视图控制器 guide 他们写 当需要关闭呈现的视图控制器时 首选方法是让呈现视图控制器关闭 它 换句话说 只要有可能 同一个视图控制器 提出视图控制器还应该负责 驳回它 尽管有多种方法可以通知 呈现视
  • glibc 的 fprintf() 实现是线程安全的吗?

    fprintf 是线程安全的吗 glibc 手册似乎是这样 但我的应用程序使用对 fprintf 的单个调用写入文件似乎混合了来自不同进程的部分写入 编辑 澄清一下 有问题的程序是lighttpd插件 并且服务器正在运行多个工作线程 查看该
  • Symfony 手动连接参数 - 'arguments' 与 'bind'

    我尝试找出如何手动注入参数DefaultController 没有自动装配 我发现有两种方法可以实现这一目标 我可以用arguments services defaults autowire false autoconfigure true
  • 使用 LIKE 搜索 GROUP_CONCAT

    我有一个 SQL 查询 它使用 GROUP CONCAT 让所有人附加到某个订单 有没有办法可以在 GROUP CONCAT 字段内进行搜索 SELECT orders orderID GROUP CONCAT contacts first
  • 结构解引用运算符(运算符->)

    我正在为迭代器编写一个薄模板包装器 在通过结构取消引用运算符时遇到了绊脚石 主要是因为指针没有 include
  • 填充可用空间的 CSS 布局

    我正在尝试做一个看似简单的网页布局 但我遇到了困难 I d like做一切事纯粹用CSS 没有桌子把事情搞砸 并且没有 JavaScript动态调整事物的大小 我想要 具有固定高度的标题 固定高度的页脚 具有固定宽度的左侧边栏 具有固定宽度
  • UICollectionViewLayoutlayoutAttributesForElementsInRect和layoutAttributesForItemAtIndexPath

    我正在实现自定义流程布局 它有两种主要方法来覆盖以确定单元格的位置 layoutAttributesForElementsInRect and layoutAttributesForItemAtIndexPath 在我的代码中 layout
  • 如何将单行与sql中列中的数字相乘

    就我而言 有订单和订单头寸 每个订单位置都有一个数量 例如 但现在我需要每个 位置元素 一行 这是我想要的输出 我的想法是使用rank over 获得增量数 但我不知道如何使用该数量作为乘数 是否有一个聪明的解决方案来使用单列作为 行乘法器
  • 删除变量上的重复项而不进行排序

    我有一个变量 其中包含以下空格分隔的条目 variable apple lemon papaya avocado lemon grapes papaya apple avocado mango banana 如何在不排序的情况下删除重复项
  • Python 行尾正则表达式

    我正在尝试编写一个正则表达式 在点之前和之后添加一个空格 但是 我只希望在点后有空格或行尾时出现此情况 但是 对于行尾情况 我无法这样做 Eg I want a hotel gt gt I want a hotel my email is
  • 如何在iPhone上播放MIDI?

    据我所知 没有本地或第三方库可用于在 iPhone 上播放 MIDI 但似乎有不少应用程序可以做到这一点 他们用什么 有什么线索吗 供那些走这条路的人参考 AVMIDIPlayer 是在 iOS 8 中引入的 似乎在设备上运行良好 但 si
  • C++ JSON 序列化

    我想要一种尽可能自动地将对象序列化和反序列化为 JSON 的方法 连载 对我来说 理想的方法是 如果我调用实例 JSONSerialize 它会返回一个带有 JSON 对象的字符串 该对象具有该对象的所有公共属性 name of prope
  • 如何从段落 python docx 中获取图像(inlineshape)

    我想逐段阅读docx文档 如果有图片 InlineShape 则用它周围的文本处理它 函数 Document inline shapes 将给出文档中所有内联形状的列表 但我想得到一个 如果存在的话 恰好出现在当前段落中 代码示例 from
  • Eclipse 中模板的 Django 标签

    我想知道是否可以在 Eclipse IDE 中为基于 Django 的模板提供自动完成 自动格式化和这些漂亮的功能 主要是为了这些事情 提前致谢 检查此页面以获取 Django Eclipse 插件 http eclipse kacprza
  • 如何使用 Java IO 读取 Windows NTFS 备用数据流?

    我试图让我的 Java 应用程序读取给定路径中的所有数据 文件 目录 元数据等 这还包括 NTFS 称为备用数据流 ADS 的一个奇怪的东西 显然 它就像目录或文件中的第二层数据 您可以打开命令提示符并使用 在ADS中创建文件 例如 C A