代码之家  ›  专栏  ›  技术社区  ›  ziggy

console.writeline和System.out.println

  •  108
  • ziggy  · 技术社区  · 14 年前

    console.writeline System.out.println ? 我知道 写入标准输出,但这与控制台不同吗?

    documentation 对于 控制台.writeline .

    4 回复  |  直到 11 年前
        1
  •  126
  •   McDowell    14 年前

    以下是使用 System.out / .err / .in System.console()

    • 系统控制台() 如果应用程序未在终端中运行,则返回null( though you can handle this in your application )
    • 系统控制台() 提供在不回显字符的情况下读取密码的方法
    • System.err 使用默认的平台编码,而 Console

    后一种行为可能不是很明显,但是这样的代码可以证明这种区别:

    public class ConsoleDemo {
      public static void main(String[] args) {
        String[] data = { "\u250C\u2500\u2500\u2500\u2500\u2500\u2510", 
            "\u2502Hello\u2502",
            "\u2514\u2500\u2500\u2500\u2500\u2500\u2518" };
        for (String s : data) {
          System.out.println(s);
        }
        for (String s : data) {
          System.console().writer().println(s);
        }
      }
    }
    

    在我的Windows XP上,系统编码为Windows-1252,默认控制台编码为IBM850,此代码将写入:

    ???????
    ?Hello?
    ???????
    ┌─────┐
    │Hello│
    └─────┘
    

        2
  •  15
  •   SimonJ    14 年前

    如果您的程序是在交互式提示符下运行的,并且您没有重定向stdin或stdout,那么它们本质上是相同的:

    public class ConsoleTest {
        public static void main(String[] args) {
            System.out.println("Console is: " + System.console());
        }
    }
    

    结果:

    $ java ConsoleTest
    Console is: java.io.Console@2747ee05
    $ java ConsoleTest </dev/null
    Console is: null
    $ java ConsoleTest | cat
    Console is: null
    

    原因 Console exists是为了提供在从交互式命令行运行的特定情况下有用的功能:

    • 安全密码输入(跨平台操作困难)
    • 同步(多线程可以提示输入和 将它们很好地排队,而如果使用System.in/out,则所有提示都将同时出现)。

    注意上面的重定向 流的结果是 System.console() 返回 null ;另一个令人恼火的是 慰问

        3
  •  7
  •   BoltClock Alan H.    14 年前

    首先,恐怕你的问题有一点小错误。类控制台中没有方法writeline。相反,类控制台提供返回PrintWriter的方法writer()。此打印写入程序具有println()。

    现在有什么区别

    System.console().writer().println("hello from console");
    

    System.out.println("hello system out");
    

    如果从命令行运行应用程序,我认为没有区别。但如果console不可用,则System.console()在System.out仍然存在时返回null。如果调用应用程序并将STDOUT重定向到文件,则可能会发生这种情况。

    下面是我刚刚实现的一个例子。

    import java.io.Console;
    
    
    public class TestConsole {
        public static void main(String[] args) {
            Console console = System.console();
            System.out.println("console=" + console);
            console.writer().println("hello from console");
        }
    }
    

    $ java TestConsole
    console=java.io.Console@93dcd
    hello from console
    

    但是当我把标准输出重定向到文件。。。

    $ java TestConsole >/tmp/test
    Exception in thread "main" java.lang.NullPointerException
            at TestConsole.main(TestConsole.java:8)
    

    8号线是 console.writer().println() .

    以下是/tmp/test的内容

    console=null
    

        4
  •  3
  •   Nithesh Chandra    14 年前

    没有 Console.writeline

    控制台和标准输出不一样。如果你读了Javadoc页面 mentioned

    java -jar MyApp.jar > MyApp.log
    

    西蒙吉的回答中还包括其他这样的情况,尽管他没有提到 控制台.writeline