อะไรคือความแตกต่างทางเทคนิคระหว่างconsole.writeline
และSystem.out.println
? ฉันรู้ว่าSystem.out.println
เขียนไปยังเอาต์พุตมาตรฐาน แต่นี่ไม่ใช่สิ่งเดียวกับคอนโซลหรือไม่
ฉันไม่เข้าใจเอกสารสำหรับconsole.writeline
.
อะไรคือความแตกต่างทางเทคนิคระหว่างconsole.writeline
และSystem.out.println
? ฉันรู้ว่าSystem.out.println
เขียนไปยังเอาต์พุตมาตรฐาน แต่นี่ไม่ใช่สิ่งเดียวกับคอนโซลหรือไม่
ฉันไม่เข้าใจเอกสารสำหรับconsole.writeline
.
คำตอบ:
ความแตกต่างหลักระหว่างการใช้System.out
/ .err
/.in
และSystem.console()
:
System.console()
ส่งคืนค่าว่างหากแอปพลิเคชันของคุณไม่ได้ทำงานในเทอร์มินัล ( แม้ว่าคุณจะสามารถจัดการสิ่งนี้ได้ในแอปพลิเคชันของคุณ )System.console()
มีวิธีการอ่านรหัสผ่านโดยไม่ต้องสะท้อนอักขระSystem.out
และ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│
└─────┘
โปรดทราบว่าลักษณะการทำงานนี้ขึ้นอยู่กับการเข้ารหัสคอนโซลที่ตั้งค่าเป็นการเข้ารหัสอื่นสำหรับการเข้ารหัสระบบ นี่เป็นลักษณะการทำงานเริ่มต้นบน Windows เนื่องจากเหตุผลทางประวัติศาสตร์หลายประการ
โดยพื้นฐานแล้วจะเหมือนกันหากโปรแกรมของคุณเรียกใช้จากพรอมต์แบบโต้ตอบและคุณไม่ได้เปลี่ยนเส้นทาง 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
มีอยู่คือเพื่อให้คุณสมบัติที่มีประโยชน์ในกรณีเฉพาะที่คุณกำลังเรียกใช้จากบรรทัดคำสั่งแบบโต้ตอบ:
Console
จะจัดคิวให้เป็นอย่างดีในขณะที่หากคุณใช้ System.in/out การแจ้งทั้งหมดจะปรากฏขึ้นพร้อมกัน)แจ้งให้ทราบข้างต้นว่าแม้เปลี่ยนเส้นทางหนึ่งของลำธารผลในการSystem.console()
กลับมาnull
; การระคายเคืองอีกประการหนึ่งคือมักจะไม่มีConsole
วัตถุใดๆ เมื่อเกิดจากโปรแกรมอื่นเช่น Eclipse หรือ Maven
ก่อนอื่นฉันกลัวว่าคำถามของคุณจะมีข้อผิดพลาดเล็กน้อย ไม่มีวิธีเขียนเมธอดในคอนโซลคลาส แทนที่คลาส Console จะจัดเตรียม method writer () ที่ส่งคืน PrintWriter เครื่องเขียนนี้มี println ()
ตอนนี้อะไรคือความแตกต่างระหว่าง
System.console().writer().println("hello from console");
และ
System.out.println("hello system out");
หากคุณเรียกใช้แอปพลิเคชันจากบรรทัดคำสั่งฉันคิดว่าไม่มีความแตกต่าง แต่ถ้าคอนโซลไม่พร้อมใช้งาน System.console () จะคืนค่า null ในขณะที่ System.out ยังคงมีอยู่ สิ่งนี้อาจเกิดขึ้นหากคุณเรียกใช้แอปพลิเคชันของคุณและทำการเปลี่ยนเส้นทางของ 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
แต่เมื่อฉันเปลี่ยนเส้นทาง STDOUT ไปยังไฟล์ ...
$ 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
ฉันหวังว่าคำอธิบายของฉันจะช่วยได้
ไม่มีConsole.writeline
ใน Java ใน. NET
คอนโซลและมาตรฐานไม่เหมือนกัน หากคุณอ่านหน้า Javadoc ที่คุณกล่าวถึงคุณจะเห็นว่าแอปพลิเคชันสามารถเข้าถึงคอนโซลได้ก็ต่อเมื่อมีการเรียกใช้จากบรรทัดคำสั่งและผลลัพธ์จะไม่ถูกเปลี่ยนทิศทางเช่นนี้
java -jar MyApp.jar > MyApp.log
กรณีดังกล่าวได้รับความคุ้มครองอื่น ๆ ในคำตอบของ SimonJ Console.writeline
แม้ว่าเขาจะพลาดจุดที่ไม่มี