gpt4 book ai didi

java - 检查Java InputStream是否来自Socket

转载 作者:行者123 更新时间:2023-11-30 06:38:25 25 4
gpt4 key购买 nike

我有一个类,它采用 InputStream 作为参数来读取数据。

public Foo {
private DataInput in;

public Foo(InputStream ism) {
in = new DataInputStream(ism);
}

public byte readByte() throws IOException {
return in.readByte();
}
}

有时此输入流可能来自 Socket,例如,

ism = new BufferedInputStream(sock.getInputStream());
foo = new Foo(ism);

我的问题是,是否可以从 Foo 内部检查输入流是否来自 Socket,即它是网络 I/O 而不是本地 I/O?自从

socket.getInputStream

调用返回抽象类。我不知道要测试哪个具体的输入流实现。

编辑:动机是有一个大型 Java 软件具有这种结构。 Foo 在很多地方创建。有些地方有文件输入流,有些地方有套接字输入流。当通过网络读取时,该软件的性能可能会很差。因此,我想看看是否可以通过跟踪来区分该软件的两种场景,而无需更改其大部分代码。我使用 AspectJ 来编写跟踪,希望不会给这个现有软件造成太多困惑。

最佳答案

问题在于,一个InputStream 可以是一个围绕另一个InputStream 构造的FilterInputStream,而该套接字只返回一个InputStream。

一种方法,非常肮脏和错误:找到根InputStream,即递归/循环,如果它是FilterInputStream的实例,检查其父InputStream( protected 字段in)。然后检查根的类,如果来自Socket,名称中可能包含“Socket”。

AspectJ 想法(我对此没有太多经验):您应该能够向 Socket 的 getInputStream 方法添加一个方面,该方法将返回的 InputStream 存储在列表(或类似的)中以供稍后检查,或以某种方式标记该InputStream(向其添加标志/方法?)。

关于java - 检查Java InputStream是否来自Socket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44839866/

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