Java Language
चित्रान्वीक्षक
खोज…
वाक्य - विन्यास
- स्कैनर स्कैनर = नया स्कैनर (स्रोत स्रोत);
- स्कैनर स्कैनर = नया स्कैनर (System.in);
पैरामीटर
पैरामीटर | विवरण |
---|---|
स्रोत | स्रोत या तो स्ट्रिंग, फ़ाइल या किसी भी प्रकार के इनपुटस्ट्रीम में से एक हो सकता है |
टिप्पणियों
जावा 5 में Scanner
वर्ग की शुरुआत की गई थी। जावा 6 में reset()
विधि जोड़ी गई थी, और नए पथों के एक जोड़े को (7) नए Path
इंटरफ़ेस के साथ इंटरऑपरेबिलिटी के लिए जावा 7 में जोड़ा गया था।
स्कैनर का उपयोग करके सिस्टम इनपुट पढ़ना
Scanner scanner = new Scanner(System.in); //Scanner obj to read System input
String inputTaken = new String();
while (true) {
String input = scanner.nextLine(); // reading one line of input
if (input.matches("\\s+")) // if it matches spaces/tabs, stop reading
break;
inputTaken += input + " ";
}
System.out.println(inputTaken);
स्कैनर ऑब्जेक्ट को कीबोर्ड से इनपुट पढ़ने के लिए आरंभीकृत किया जाता है। तो कीबो से नीचे इनपुट के लिए, यह Reading from keyboard
रूप में आउटपुट का उत्पादन करेगा
Reading
from
keyboard
//space
स्कैनर का उपयोग करके फ़ाइल इनपुट पढ़ना
Scanner scanner = null;
try {
scanner = new Scanner(new File("Names.txt"));
while (scanner.hasNext()) {
System.out.println(scanner.nextLine());
}
} catch (Exception e) {
System.err.println("Exception occurred!");
} finally {
if (scanner != null)
scanner.close();
}
यहां एक File
ऑब्जेक्ट को इनपुट के रूप में टेक्स्ट फाइल के नाम से पास करके एक Scanner
ऑब्जेक्ट बनाया जाता है। यह टेक्स्ट फ़ाइल फ़ाइल ऑब्जेक्ट द्वारा खोली जाएगी और निम्न लाइनों में स्कैनर ऑब्जेक्ट द्वारा पढ़ी जाएगी। scanner.hasNext()
पाठ फ़ाइल में डेटा की अगली पंक्ति है यह देखने के लिए जाँच करेगा। while
लूप के साथ संयोजन करने से आप Names.txt
फ़ाइल में डेटा की प्रत्येक पंक्ति के माध्यम से पुनरावृति कर Names.txt
। डेटा पुनः प्राप्त करने के लिए ही है, हम इस तरह के तरीके के रूप में उपयोग कर सकते हैं nextLine()
, nextInt()
, nextBoolean()
आदि, ऊपर के उदाहरण में scanner.nextLine()
किया जाता है। nextLine()
लाइन nextLine()
एक पाठ फ़ाइल में निम्नलिखित पंक्ति को संदर्भित करता है, और इसे एक scanner
ऑब्जेक्ट के साथ जोड़कर आप लाइन की सामग्री को प्रिंट कर सकते हैं। स्कैनर ऑब्जेक्ट को बंद करने के लिए, आप .close()
उपयोग करेंगे।
संसाधनों के साथ प्रयास (जावा 7 से आगे) का उपयोग करते हुए, उपर्युक्त कोड को नीचे के रूप में सुरुचिपूर्ण ढंग से लिखा जा सकता है।
try (Scanner scanner = new Scanner(new File("Names.txt"))) {
while (scanner.hasNext()) {
System.out.println(scanner.nextLine());
}
} catch (Exception e) {
System.err.println("Exception occurred!");
}
स्कैनर का उपयोग करते हुए स्ट्रिंग के रूप में पूरे इनपुट को पढ़ें
आप एक स्ट्रिंग के रूप में इनपुट में सभी पाठ पढ़ने के लिए Scanner
का उपयोग कर सकते हैं, सीमांकक के रूप में \Z
(संपूर्ण इनपुट) का उपयोग करके। उदाहरण के लिए, इसका उपयोग किसी पाठ फ़ाइल के सभी पाठों को एक पंक्ति में पढ़ने के लिए किया जा सकता है:
String content = new Scanner(new File("filename")).useDelimiter("\\Z").next();
System.out.println(content);
याद रखें कि आपको स्कैनर को बंद करना होगा, साथ ही साथ इसे फेंकने वाले IoException
को पकड़ सकते हैं, उदाहरण के लिए स्कैनर के साथ रीडिंग फ़ाइल इनपुट में वर्णित है।
कस्टम सीमांकक का उपयोग करना
आप कैसे इनपुट पढ़ा जाता है, यह निर्धारित करने के लिए .useDelimiter(",")
साथ, स्कैनर के साथ कस्टम सीमांकक (नियमित अभिव्यक्ति) का उपयोग कर सकते हैं। यह String.split(...)
समान कार्य करता है। उदाहरण के लिए, आप एक स्ट्रिंग में अल्पविराम से अलग किए गए मानों की सूची से पढ़ने के लिए Scanner
का उपयोग कर सकते हैं:
Scanner scanner = null;
try{
scanner = new Scanner("i,like,unicorns").useDelimiter(",");;
while(scanner.hasNext()){
System.out.println(scanner.next());
}
}catch(Exception e){
e.printStackTrace();
}finally{
if (scanner != null)
scanner.close();
}
यह आपको इनपुट के प्रत्येक तत्व को व्यक्तिगत रूप से पढ़ने की अनुमति देगा। ध्यान दें कि आपको इसका उपयोग CSV डेटा पार्स करने के लिए नहीं करना चाहिए, इसके बजाय, एक CSV पार्सर लाइब्रेरी का उपयोग करें, अन्य संभावनाओं के लिए Java के लिए CSV पार्सर देखें।
सामान्य पैटर्न जो कार्यों के बारे में सबसे अधिक पूछा जाता है
निम्नलिखित है कि कैसे java.util.Scanner
वर्ग को ठीक से उपयोग करने के लिए System.in
से उपयोगकर्ता इनपुट को अंतःक्रियात्मक रूप से पढ़ा जाए (कभी-कभी stdin
के रूप में संदर्भित किया जाता है, विशेष रूप से C, C ++ और अन्य भाषाओं के साथ-साथ यूनिक्स और लिनक्स में भी)। यह मुहावरेदार तरीके से उन सबसे सामान्य चीजों को प्रदर्शित करता है जिन्हें करने का अनुरोध किया जाता है।
package com.stackoverflow.scanner;
import javax.annotation.Nonnull;
import java.math.BigInteger;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.*;
import java.util.regex.Pattern;
import static java.lang.String.format;
public class ScannerExample
{
private static final Set<String> EXIT_COMMANDS;
private static final Set<String> HELP_COMMANDS;
private static final Pattern DATE_PATTERN;
private static final String HELP_MESSAGE;
static
{
final SortedSet<String> ecmds = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
ecmds.addAll(Arrays.asList("exit", "done", "quit", "end", "fino"));
EXIT_COMMANDS = Collections.unmodifiableSortedSet(ecmds);
final SortedSet<String> hcmds = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
hcmds.addAll(Arrays.asList("help", "helpi", "?"));
HELP_COMMANDS = Collections.unmodifiableSet(hcmds);
DATE_PATTERN = Pattern.compile("\\d{4}([-\\/])\\d{2}\\1\\d{2}"); // http://regex101.com/r/xB8dR3/1
HELP_MESSAGE = format("Please enter some data or enter one of the following commands to exit %s", EXIT_COMMANDS);
}
/**
* Using exceptions to control execution flow is always bad.
* That is why this is encapsulated in a method, this is done this
* way specifically so as not to introduce any external libraries
* so that this is a completely self contained example.
* @param s possible url
* @return true if s represents a valid url, false otherwise
*/
private static boolean isValidURL(@Nonnull final String s)
{
try { new URL(s); return true; }
catch (final MalformedURLException e) { return false; }
}
private static void output(@Nonnull final String format, @Nonnull final Object... args)
{
System.out.println(format(format, args));
}
public static void main(final String[] args)
{
final Scanner sis = new Scanner(System.in);
output(HELP_MESSAGE);
while (sis.hasNext())
{
if (sis.hasNextInt())
{
final int next = sis.nextInt();
output("You entered an Integer = %d", next);
}
else if (sis.hasNextLong())
{
final long next = sis.nextLong();
output("You entered a Long = %d", next);
}
else if (sis.hasNextDouble())
{
final double next = sis.nextDouble();
output("You entered a Double = %f", next);
}
else if (sis.hasNext("\\d+"))
{
final BigInteger next = sis.nextBigInteger();
output("You entered a BigInteger = %s", next);
}
else if (sis.hasNextBoolean())
{
final boolean next = sis.nextBoolean();
output("You entered a Boolean representation = %s", next);
}
else if (sis.hasNext(DATE_PATTERN))
{
final String next = sis.next(DATE_PATTERN);
output("You entered a Date representation = %s", next);
}
else // unclassified
{
final String next = sis.next();
if (isValidURL(next))
{
output("You entered a valid URL = %s", next);
}
else
{
if (EXIT_COMMANDS.contains(next))
{
output("Exit command %s issued, exiting!", next);
break;
}
else if (HELP_COMMANDS.contains(next)) { output(HELP_MESSAGE); }
else { output("You entered an unclassified String = %s", next); }
}
}
}
/*
This will close the underlying Readable, in this case System.in, and free those resources.
You will not be to read from System.in anymore after this you call .close().
If you wanted to use System.in for something else, then don't close the Scanner.
*/
sis.close();
System.exit(0);
}
}
कमांड लाइन से एक इंट पढ़ें
import java.util.Scanner;
Scanner s = new Scanner(System.in);
int number = s.nextInt();
यदि आप कमांड लाइन से एक इंट पढ़ना चाहते हैं, तो बस इस स्निपेट का उपयोग करें। सबसे पहले, आपको एक स्कैनर ऑब्जेक्ट बनाना होगा, जो System.in को सुनता है, जो कमांड लाइन से प्रोग्राम शुरू करने पर डिफ़ॉल्ट रूप से कमांड लाइन है। उसके बाद, स्कैनर ऑब्जेक्ट की मदद से, आप पहला इंट पढ़ते हैं कि उपयोगकर्ता कमांड लाइन में गुजरता है और इसे चर संख्या में संग्रहीत करता है। अब आप उस संग्रहीत इंट के साथ जो चाहें कर सकते हैं।
एक स्कैनर को सावधानीपूर्वक बंद करना
ऐसा हो सकता है कि आप कंस्ट्रक्टर के लिए पैरामीटर के रूप में System.in के साथ एक स्कैनर का उपयोग करते हैं, तो आपको इस बात की जानकारी होनी चाहिए कि स्कैनर को बंद करने से इनपुटस्ट्रीम भी बंद हो जाएगी जो आगे दे रही है कि प्रत्येक उस इनपुट को पढ़ने का प्रयास करे (या कोई अन्य स्कैनर ऑब्जेक्ट) एक java.util.NoSuchElementException
को फेंक देगा। java.util.NoSuchElementException
या java.lang.IllegalStateException
उदाहरण:
Scanner sc1 = new Scanner(System.in);
Scanner sc2 = new Scanner(System.in);
int x1 = sc1.nextInt();
sc1.close();
// java.util.NoSuchElementException
int x2 = sc2.nextInt();
// java.lang.IllegalStateException
x2 = sc1.nextInt();