我如何检查程序是否与标准I / O流兼容?

时间:2018-11-03 01:45:42

标签: java io

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

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

我该怎么做?

1 个答案:

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