首页 > 解决方案 > 如何检查该程序是否适用于标准 I/O 流&

问题描述

可以使用System.setIn()System.setOut()方法重新分配标准输入/输出流。

我想检查当前的输入/输出流是否是标准的。

我怎样才能做到这一点?

标签: javaio

解决方案


如果您可以使用反射,此方法将执行以下操作:

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.inSystem.err


推荐阅读