2016-07-19 12 views
-2

Jetzt verwende ich den Sax Parser, um die XML-Datei zu analysieren (der folgende Beispielcode kommt von TutorialSpoint). Ich möchte alle Dinge in eine TXT-Datei mit dem BufferedWriter ausgeben, wenn wir die Zeichenfunktion aufrufen, während ich keine Möglichkeit bekomme, dies zu tun. Wenn ich diesen BufferedWriter in die Zeichenfunktion schreibe, gibt er nur die letzte Zeichenfolge aus, da er nur den letzten Anruf aufzeichnet. Wenn ich diesen BufferedWriter in der Hauptfunktion schreibe, konnte der UserHandler den BufferedWriter, der in der Hauptfunktion (der dblpSax-Klasse) erstellt wurde, nicht erkennen, da es sich um zwei Klassen handelt. Ich habe auch versucht, eine Klasseninstanz zu erstellen, während ich immer noch Probleme hatte. Könnten Sie mir einen Weg geben, das zu machen? Vielen Dank.Wie schreibe ich den BufferedWriter außerhalb der Hauptfunktion

Die Bufferwriter ich verwenden möchte, ist wie folgt:

File writename = new File("output.txt"); 
writename.createNewFile(); 
BufferedWriter out = new BufferedWriter(new FileWriter(writename)); 



    public class dblpSax{ 
    public static void main(String[] args){ 

     try { 
     File inputFile = new File("student.txt"); 
     SAXParserFactory factory = SAXParserFactory.newInstance(); 
     SAXParser saxParser = factory.newSAXParser(); 
     UserHandler userhandler = new UserHandler(); 
     saxParser.parse(inputFile, userhandler);  
     } catch (Exception e) { 
     e.printStackTrace(); 
     } 
    } 
} 


class UserHandler extends DefaultHandler { 

    boolean bFirstName = false; 
    boolean bLastName = false; 
    boolean bNickName = false; 
    boolean bMarks = false; 


    public void startElement(String uri, 
     String localName, String qName, Attributes attributes) 
     throws SAXException { 
     if (qName.equalsIgnoreCase("student")) { 
     String rollNo = attributes.getValue("rollno"); 
     System.out.println("Roll No : " + rollNo); 
     } else if (qName.equalsIgnoreCase("firstname")) { 
     bFirstName = true; 
     } else if (qName.equalsIgnoreCase("lastname")) { 
     bLastName = true; 
     } else if (qName.equalsIgnoreCase("nickname")) { 
     bNickName = true; 
     } 
     else if (qName.equalsIgnoreCase("marks")) { 
     bMarks = true; 
     } 
    } 


    public void endElement(String uri, 
     String localName, String qName) throws SAXException { 
     if (qName.equalsIgnoreCase("student")) { 
     System.out.println("End Element :" + qName); 
     } 
    } 


    public void characters(char ch[], 
     int start, int length) throws SAXException { 
     if (bFirstName) { 
     System.out.println("First Name: " 
     + new String(ch, start, length)); 
     bFirstName = false; 
     } else if (bLastName) { 
     System.out.println("Last Name: " 
     + new String(ch, start, length)); 
     bLastName = false; 
     } else if (bNickName) { 
     System.out.println("Nick Name: " 
     + new String(ch, start, length)); 
     bNickName = false; 
     } else if (bMarks) { 
     System.out.println("Marks: " 
     + new String(ch, start, length)); 
     bMarks = false; 
     } 
    } 
} 
+0

Und das Problem ist was? NB: Der Aufruf createNewFile() 'ist oben redundant. – EJP

+0

Ich möchte alle Dinge in eine TXT-Datei mit dem BufferedWriter ausgeben, wenn wir die Zeichen-Funktion aufrufen, ist die Frage: Wie verwende ich den BufferedWriter? – michael

Antwort

0

Sie benötigen einen BufferedWriter auf dem gleichen Niveau wie das Parsing, am besten anpassbare außerhalb der Default.

 try (BufferedWriter out = new BufferedWriter(....)) { 
      UserHandler userhandler = new UserHandler(out); 
      saxParser.parse(inputFile, userhandler);  
     } 
     } catch (Exception e) { 
     e.printStackTrace(); 
     } 
    } 
} 

Klasse UserHandler erstreckt Default { Privat letzten BufferedWriter out; // Oder PrintWriter

UserHandler(BufferedWriter out) { 
    this.out = out; 
} 

Und dann kann man alle out.write überall.

+0

Danke Joop. Das hilft wirklich und ich lerne, wie man mit einer Konstruktionsmethode zwischen den Klassen interagiert. Danke für deine nette sogar jemand hat Minuszeichen gegeben! (während ich denke, dass sie nicht sorgfältig überlegen lol) – michael