Как переключить потоки ввода и вывода в java с консоли в файл и наоборот? - PullRequest
0 голосов
/ 26 мая 2020

Я создал класс Singleton для написания кода для соревнований по программированию. Во время тестирования решений в моей системе мне нужно читать / писать из / в файлы "input.txt" / "output.txt". Для интерактивной отладки с помощью консоли я создал два метода - 1. reset() - который сбрасывает потоки ввода-вывода на консоль, и 2. set() - который устанавливает потоки ввода-вывода в файлы "input.txt" и " output.txt "

Класс -

class SingletonClass
{
    public static BufferedReader input=null;
    public static InputStream console_input=System.in;
    public static PrintStream console_output=System.out;
    public static FileInputStream file_istream;
    public static PrintStream file_ostream;
    public static BufferedReader getInstance()throws IOException,FileNotFoundException
    {
        if(input==null)
        {
            if (System.getProperty("ONLINE_JUDGE") == null)
            {
                file_istream = new FileInputStream("input.txt");
                file_ostream = new PrintStream("output.txt");
                System.setIn(file_istream);
                System.setOut(file_ostream);
            }
            input = new BufferedReader(new InputStreamReader(System.in));
        }
        return input;
    }
    public static BufferedReader reset()throws IOException
    {
        System.setOut(console_output);
        System.setIn(console_input);
        BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
        return input;
    }
    public static BufferedReader set()throws IOException
    {
        System.setIn(file_istream);
        System.setOut(file_ostream);
        BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
        return input;
    }
}

Первый экземпляр класса BufferedReader создан для чтения / записи с использованием файлов. Теперь, если я использую reset(), он работает нормально, а чтение / запись переключается на консоль. Но после reset(), теперь, если я использую set(), только вывод правильно направляется в «output.txt», а при вводе программа выдает исключение java.lang.NumberFormatException: null

Я использовал следующее код для его проверки.

class tester
{
    public static void main(String[] args)throws IOException
    {
        BufferedReader input = SingletonClass.getInstance();
        int n;
        System.out.println("Using file first time");//............line1
        n=Integer.parseInt(input.readLine());//...................line2
        System.out.println("n from file to file = "+n);//.........line3
        input = SingletonClass.reset();//.........................line4
        System.out.println("Switched to console");//..............line5
        System.out.println("n from file to console = "+n);//......line6
        n=Integer.parseInt(input.readLine());//...................line7
        System.out.println("n from console to console = "+n);//...line8
        input=SingletonClass.set();//.............................line9
        System.out.println("Switched to file");//.................lin10
        System.out.println("n from console to file = "+n);//......lin11
        System.out.println("Again reading from file");//..........line12
        n=Integer.parseInt(input.readLine());//...................line 13 throws Exception
        System.out.println("second n from file to file = "+n);//..line 14
    }
}

"input.txt" имеет 2 строки -

10
20

, а для line7 я ввел 25 в консоли. Я получил следующие 2 вывода -

1.output.txt

Using file first time
n from file to file = 10
Switched to file
n from console to file = 25
Again reading from file

2.Консольный вывод

Switched to console
n from file to console = 10
n from console to console = 25
Exception in thread "main" java.lang.NumberFormatException: null
        at java.lang.Integer.parseInt(Unknown Source)
        at java.lang.Integer.parseInt(Unknown Source)
        at abcd.main(tester.java:57)

Итак, после переключения на файл в строке 9 строки 10,11,12 печатаются в файл правильно, но строка 13 выдает java.lang.NumberFormatException: null и значение 20 не читается из файла. Я предполагаю, что что-то не так в том, как я устанавливаю свойство System.in, однако он работал нормально, когда те же строки кода вызывались при создании первого экземпляра input в main.

...