2013-07-21 2 views
1

Возможно ли возобновить стандартные потоки ввода-вывода консоли во время выполнения после их закрытия?Как renitialize Поток ввода-вывода по умолчанию

public static void main(String[] args) throws IOException { 
     System.out.println("Hello World!!!"); 
     System.out.println("1:" + System.in.read()); 
     System.out.println("" + FileDescriptor.in.valid());  //true 
     System.in.close(); 
     System.out.println("" + FileDescriptor.in.valid());  //false 
     System.out.println("2:" + System.in.read());    //IOException 
     System.in.close(); 
} 

От this поста я мог понять, что private static native void setIn0(InputStream in); родной функция используется для инициализации окончательного ввода/вывода потоков в private static void initializeSystemClass() частного способа после инициализации потока.

Могу ли я отредактировать потоки ввода-вывода?

Edit:

Как System.in является final объект, который я не могу изменить его с вещами, как

System.in=new InputStream() { 

       @Override 
       public int read() throws IOException { 
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
       } 
      } 

во время выполнения ...
Что я ожидал это решение через Native Методы/Функция для извлечения дескриптора Консоли

+3

Почему вы хотите сначала вызвать 'System.in.close()'? –

+0

Я экспериментировал с потоками, которые все .. –

+1

Затем закончите свой эксперимент: сделайте код, который, по вашему мнению, может работать (или нет), и получите свой собственный ответ ... –

ответ

1

Невозможно повторно открыть произвольный поток после вас close.

Это, как говорится, вы можете использовать System.setIn, чтобы использовать любые InputStream как stdin. ByteArrayInputStream.close ничего не делает, и вы можете создать свой собственный InputStream, который не может быть закрыт.

+0

Как это инициализировать в первую очередь, если его произвольный поток ? Должен ли быть дескриптор/ручка для потока? @jeffrey –

+0

@boxed__l JVM создает исходные потоки и устанавливает их при запуске. – Jeffrey

+0

@boxed__l: Конечно, есть дескриптор и дескриптор файла. Единственная проблема заключается в том, что ваш начальный 'close' также закрывает ресурс на уровне операционной системы. Это аннулирует дескриптор файла. –