Я создал класс 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
.