कंसोल। राइटलाइन और System.out.println


120

वास्तव में console.writelineऔर के बीच तकनीकी अंतर क्या है System.out.println? मुझे पता है कि System.out.printlnमानक उत्पादन के लिए लिखता है, लेकिन क्या यह सांत्वना के समान नहीं है?

मैं इसके लिए प्रलेखन को पूरी तरह से नहीं समझता console.writeline



जवाबों:


130

यहाँ 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);
    }
  }
}

मेरे विंडोज एक्सपी पर जिसमें विंडोज़ -२२०२ का एक सिस्टम एन्कोडिंग है और आईबीएम ५५० का एक डिफ़ॉल्ट कंसोल एन्कोडिंग है, यह कोड लिखेगा:

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

ध्यान दें कि यह व्यवहार सिस्टम एन्कोडिंग के लिए एक अलग एन्कोडिंग पर सेट किए जा रहे कंसोल एन्कोडिंग पर निर्भर करता है। यह ऐतिहासिक कारणों का एक गुच्छा के लिए विंडोज पर डिफ़ॉल्ट व्यवहार है।


क्या आप एक टर्मिनल में नहीं चलने का एक उदाहरण प्राप्त कर सकते हैं?
चाओ

@ रिचर्ड, यदि आप एक IDE से चलते हैं, या यदि आप GUI से निष्पादन योग्य जार लॉन्च करते हैं।
aioobe

15

वे अनिवार्य रूप से समान हैं, यदि आपका कार्यक्रम एक इंटरैक्टिव प्रॉम्प्ट से चलाया जाता है और आपने स्टड या स्टडआउट को पुनर्निर्देशित नहीं किया है:

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ग्रहण या मावेन जैसे किसी अन्य कार्यक्रम से उत्पन्न होने पर अक्सर कोई वस्तु उपलब्ध नहीं होती है।


7

पहले मुझे डर है कि आपके प्रश्न में थोड़ी सी गलती है। क्लास कंसोल में मेथड राइटलाइन नहीं है। इसके बजाय वर्ग कंसोल विधि लेखक () प्रदान करता है जो PrintWriter देता है। इस प्रिंट लेखक का प्रिंटलाइन () है।

अब इसमें क्या अंतर है

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

तथा

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

यदि आप कमांड लाइन से अपना आवेदन चलाते हैं तो मुझे लगता है कि कोई अंतर नहीं है। लेकिन यदि कंसोल अनुपलब्ध है System.console () अभी भी अशक्त है जबकि 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

मुझे आशा है कि मेरे स्पष्टीकरण से मदद मिलेगी।


कोड ब्लॉक के रूप में कोड दिखाने के लिए, चार स्थानों के साथ प्रत्येक पंक्ति को इंडेंट करें। (मैं बस किया है आप के लिए, हालांकि कि।)
BoltClock

हालाँकि, एक Console.printf और एक Console.format है, जो दोनों सीधे लिखते हैं, बिना बीच के PrintWriter को निकालने की आवश्यकता के। अजीब :)
टोबी एगिट

3

Console.writelineजावा में कोई नहीं है। इसके .NET में।

कंसोल और मानक बाहर समान नहीं हैं। यदि आप आपके द्वारा उल्लिखित जावदोक पृष्ठ को पढ़ते हैं , तो आप देखेंगे कि किसी एप्लिकेशन को केवल कंसोल तक पहुंच प्राप्त हो सकती है, यदि वह कमांड लाइन से मंगाई गई हो और आउटपुट इस तरह पुनर्निर्देशित न हो

java -jar MyApp.jar > MyApp.log

इस तरह के अन्य मामले साइमनज के जवाब में शामिल हैं, हालांकि वह इस बात से चूक गए कि कोई बात नहीं है Console.writeline


युप - मुझे लगा कि जिग्गी के कंपाइलर (या जावदोस्क) मेरे लिए वह काम कर सकते हैं :)
सिमोन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.