2012-05-31 25 views
8

मैं एक फ़ाइल है कि एक लाइन पर सब कुछ इस तरह पढ़ी से पढ़ रहा हूँ:स्कैनर को उचित रूप से एस्केप अक्षरों को कैसे पढ़ा जाए?

Hello World!\nI've been trying to get this to work for a while now.\nFrustrating.\n 

और मेरे स्कैनर पढ़ता है कि फ़ाइल से और एक स्ट्रिंग में कहते हैं:

Scanner input = new Scanner(new File(fileName)); 
String str = input.nextLine(); 
System.out.print(str); 

अब, मैं आउटपुट तब होना चाहिए:

Hello World! 
I've been trying to get this work for a while now. 
Frustrating. 

लेकिन इसके बजाय मुझे इनपुट के समान सटीक चीज़ मिल रही है। यही है, प्रत्येक \ n आउटपुट में शामिल है और सब कुछ अलग लाइनों की बजाय एक पंक्ति पर है।

मैंने सोचा कि स्कैनर बचने के चरित्र को ठीक से पढ़ने में सक्षम होगा लेकिन इसकी बजाय इसे स्ट्रिंग पर इसकी तरह \\ n की प्रतिलिपि बना रहा है।

उत्तर

3

तो \n लिखा है फ़ाइल आप nextLine() उपयोग नहीं कर सकते है, क्योंकि वहाँ नहीं है \n (रेखा का अंत) लेकिन इसके बजाय \\n (दो अक्षर) हैं।

बजाय एक सीमांकक के साथ प्रयास करें:

Scanner sc = new Scanner(new File("/home/alain/Bureau/ttt.txt")); 
    sc.useDelimiter("\\\\n"); 
    while(sc.hasNext()){ 
     System.out.println(sc.next()); 
    } 

आउटपुट:

नमस्ते दुनिया!

मैं इस थोड़ी देर के लिए अब काम करने के लिए प्राप्त करने की कोशिश कर रहा हूँ।

निराशा होती।

संपादित करें:

आप फ़ाइल को पढ़ने और वास्तविक EOL के साथ पाठ में \n बदलना चाहते हैं। आप बस उपयोग कर सकते हैं:

Scanner sc = new Scanner(new File("/home/alain/Bureau/ttt.txt")); 

//loop over real EOL 
while(sc.hasNextLine()){ 

    //Replace the `\n` in the line with real EOL. 
    System.out.println(sc.nextLine().replace("\\n", System.getProperty("line.separator"))); 
} 
4

नहीं, Scanner आपके लिए ऐसा नहीं करेगा। आपको स्वयं अनुवाद करना होगा।

(ध्यान दें कि के रूप में दूसरों का सुझाव दिया है अगर आप sc.useDelimiter("\\\\n") की तरह कुछ का उपयोग आप साधारण next() विधि की कार्यक्षमता को तोड़ने रहे हैं और nextLine() आशा के अनुरूप कार्य नहीं हो सकता है।)

यहाँ कैसे मैं इसे हल होगा की एक संक्षिप्त वर्णन है :

बदलें

Scanner input = new Scanner(new FileReader(fileName)); 

Scanner input = new Scanner(new JavaEscapeReader(new FileReader(fileName))); 
          ^^^^^^^^^^^^^^^^^^^^^      ^
0 करने के लिए

जहां JavaEscapeReader इस तरह FilterReader का विस्तार होगा:

class JavaEscapeReader extends FilterReader { 

    JavaEscapeReader(Reader in) { 
     super(in); 
    } 

    @Override 
    public int read() throws IOException { 
     int ch = super.read(); 
     switch (ch) { 
     case '\\': 
      switch (super.read()) { 
      case '\\': return '\\'; 
      case 'n': return '\n'; 
      case 't': return '\t'; 
      case 'f': return '\f'; 
      // ... 
      default: 
       throw new IOException("Invalid char sequence."); 
      } 
     default: 
      return ch; 
     } 
    } 

    @Override 
    public int read(char[] cbuf, int off, int len) throws IOException { 
     int i = 0, ch; 
     while (i < len && -1 != (ch = read())) 
      cbuf[i++] = (char) ch; 
     return i == 0 ? -1 : i; 
    } 
} 

सामग्री

Line1\nLine2 
Line3\nLine3 

कार्यक्रम के साथ एक इनपुट फ़ाइल को देखते हुए

Scanner sc = new Scanner(new JavaEscapeReader(new FileReader("filename.txt"))); 
while (sc.hasNextLine()) 
    System.out.println(sc.nextLine()); 

प्रिंट

Line1 
Line2 
Line3 
Line4 

एक और विकल्प StringEscapeUtils.unescapeJava का उपयोग करना है और पढ़ने की प्रक्रिया को पोस्ट करना है।

2

आप अपना खुद का डिलीमीटर सेट करने के लिए Scanner.useDelimiter का उपयोग कर सकते हैं। आपके मामले में उपयोग करते हुए डबल \\n उद्धृत किया:

s.useDelimiter("\\\\n"); 

उदाहरण:

Scanner s = new Scanner("Hello World!\\nI've been trying to get this to " + 
         "work for a while now.\\nFrustrating.\\n"); 
s.useDelimiter("\\\\n"); 

System.out.println(s.next()); 
System.out.println(s.next()); 
System.out.println(s.next()); 

आउटपुट:

Hello World! 
I've been trying to get this to work for a while now. 
Frustrating. 
+0

मान लें कि मुझे भविष्य में आसान उपयोग के लिए स्ट्रिंग में संग्रहीत इनपुट की आवश्यकता है। क्या कोई तरीका है कि मैं सीधे बचने वाले पात्रों को सीधे System.out पर जाकर स्टोर कर सकता हूं? – sangh

+1

@ user1427895 मेरा संपादन देखें। –

+0

@ alain.janinm अद्भुत! ऐसा लगता है कि ऐसा किया है। धन्यवाद! – sangh