控制台IO
控制台输入输出¶
- 绑定字符流到控制台
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
-
可以使用 read () 方法从控制台读取一个字符,或者用 readLine () 方法读取一个字符串。
-
格式化输入 Scanner,用于扫描和解析文本数据
- 可以用不同的输入源来创建
Scanner
对象Scanner scanner = new Scanner(System.in); // 从标准输入读取
Scanner
类提供了一系列的方法来读取不同类型的数据,如nextInt()
,nextDouble()
,nextLine()
,hasNext()
等。int number = scanner.nextInt(); String str = scanner.nextLine();
-
关闭
scanner.close();
-
Console
- 封装好的控制台类,支持更加方便的功能
public class Password { public static void main (String args[]) throws IOException { //获取控制台对象 Console c = System.console(); if (c == null) { System.err.println("No console."); System.exit(1); } String login = c.readLine("Enter your login: "); //读取密码模式 char [] oldPassword = c.readPassword("Enter your old password: "); ... } }
标准 IO¶
- 输出
System.out.println(...);
-
也可以格式化输出
System.out.printf("%d==%d %b%n",x,y,x==y)
-
所有的输入都可以来自标准输入,所有的输出都可以发送到标准输出,可以将多个程序串联起来
- System. In System. Out System. Err
- Out\err 被包装成了 PrintStream,但是 in 是为包装的 InputStream,要在读取之前进行手动包装
-
System. In 的包装和使用
public static void main(String [] args) { TimedAbort abort = new TimedAbort(2); new BufferedReader( new InputStreamReader(System.in)) .lines() .peek(ln -> abort.restart()) .forEach(System.out:: println); // Ctrl-Z or two seconds inactivity // terminates the program }
-
流是懒加载的,并且会随着输入自动变化(如 lines 获取到更多的行)
-
如果在 2 秒内没有新的输入,那么程序就会被终止。
-
将 System. Out 作为 PrintWriter
public static void main(String [] args) { PrintWriter out = new PrintWriter(System.out, true);//第二个参数 autoFlush out.println("Hello, world"); }//即将输出定向到标准输出
-
清空缓冲区
System.out.flush();
-
重定向
-
SetIn(InputStream)
、SetOut(PrintStream)
、SetErr(PrintStream)
public static void main(String [] args) { PrintStream console = System.out;//缓存默认控制台输出对象用于后面进行恢复 try( BufferedInputStream in = new BufferedInputStream( new FileInputStream("Redirecting.java")); PrintStream out = new PrintStream( new BufferedOutputStream( new FileOutputStream("Redirecting.txt"))) ) { System.setIn(in);//重定向为文件读取文件输出 System.setOut(out); System.setErr(out); new BufferedReader( new InputStreamReader(System.in)) .lines() .forEach(System.out:: println); } catch(IOException e) { throw new RuntimeException(e); } finally { System.setOut(console); } }
-
进程控制
- 通过标准流实现向控制台发送命令,并监视输出到控制台的信息
public class OSExecute { public static void command(String command) { boolean err = false; try { //启动一个新进程。这个新进程的命令和参数就是输入的命令字符串。 Process process = new ProcessBuilder( command.split(" ")).start();//执行命令 try(//监控输出 BufferedReader results = new BufferedReader( new InputStreamReader( process.getInputStream())); BufferedReader errors = new BufferedReader( new InputStreamReader( process.getErrorStream())) ) { results.lines() .forEach(System.out:: println); err = errors.lines() .peek(System.err:: println) .count() > 0; } } catch(IOException e) { throw new RuntimeException(e); } if(err) throw new OSExecuteException( "Errors executing " + command); } }