答案 0 :(得分:0)
如果可以使用反射,则可以使用此方法:
private boolean isStandardOutput()
{
boolean x;
try
{
Field field=FilterOutputStream.class.getDeclaredField("out");
field.setAccessible(true);
Object value=System.out;
do
{
value=field.get(value);
}
while (value instanceof FilterOutputStream);
if (value instanceof FileOutputStream)
{
Field fieldFd=FileOutputStream.class.getDeclaredField("fd");
fieldFd.setAccessible(true);
FileDescriptor fileDescriptor=(FileDescriptor)fieldFd.get(value);
x=(fileDescriptor == FileDescriptor.out);
}
else
{
x=false;
}
}
catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e)
{
x=false;
}
return x;
}
背后的想法很简单:成功解开System.out
值,直到找到FileOutputStream
值。然后,获取其内部的FileDescriptor
并将其与FileDescriptor.out
进行比较(该常量为常量,无法修改)。
模拟算法可用于System.in
和System.err
。