gpt4 book ai didi

java - 检测 Java 中 OutputStream 的目标类型(文件/套接字/等)

转载 作者:行者123 更新时间:2023-12-02 04:21:58 26 4
gpt4 key购买 nike

假设我传递了一个 OutputStream 变量。有没有办法检测 OutputStream 的源是否是打开的文件或打开的套接字等?

如果不可能,如果我知道变量的类型是FileOutputStream,这样我就可以获得它的FileDescriptor,这样会更好吗?谢谢。

<小时/>

更新:

每个 FileOutputStream 实例都有一个 FileDescriptor。我无法区分它的来源,因为来自 Java 文档:

文件描述符类的实例充当底层机器特定结构的不透明句柄,表示打开的文件、打开的套接字或其他字节源或接收器。文件描述符的主要实际用途是创建 FileInputStream 或 FileOutputStream 来包含它。

<小时/>

更新2:

我正在开发一个自动化工具,构建在定制的 JVM 之上,用于分析 Java 字节码,并确定程序写入文件或通过套接字发送的字节数等(在非常简单的程序中)。然后对文件、套接字等进行不同的处理。

定制的JVM让我知道它何时执行字节码指令INVOKEVIRTUAL,我可以检查被调用者是OutputStream。现在我需要做的是确定这个 OutputStream 写入文件/套接字等的位置。

最佳答案

简单地想,你可以使用实例

if(myStream instanceof FileOutputStream){
//this is FileOutputStream
}

但是有些情况您无法检测到,例如 FileOutputStream 是否被其他 OutputStream(如 FilterOutputStream)包装。因此,如果您的流的实例是 FilterOutputStream,您必须找到真正的内部实例。当流被包装时:

 public FilterOutputStream(OutputStream out) {
this.out = out;
}

但是,通过正常方式,我们无法获取 this.out( protected )来再次运行 instance of。我考虑反射以获得 protected 或私有(private)字段( Java reflection - access protected field )

但是,如果内部流又是另一个 FilterOutputStream!!!你必须使用递归函数来检测。

想象一下 Java 中的 Stream 就像 Matroska 木偶一样!

这只是我的想法。如果你想完全控制它。你得看看Java IO的树

enter image description here

关于java - 检测 Java 中 OutputStream 的目标类型(文件/套接字/等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32676298/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com