2016-03-31 3 views
0

Ich versuche, einen dedizierten Thread zu haben, der regelmäßig eine Datei überschreibt, so dass das einzige, was sich tatsächlich in der Datei ändert, etwas ist, das ich in der GUI geändert habe. Hier ist der relevante Code:Schreiben in eine Textdatei unter Verwendung von Multithreading

private ThreadClass writeToFile = new ThreadClass("toFile"){ 
     @Override 
     public void run(){ 
      synchronized(lock){ 
       NameAddressID store[] = new NameAddressID[10]; 
       boolean tmpFile = true; 
       Scanner loadOver; 
       PrintWriter overWrite; 
       while(true){ 

        try { 
         if(tmpFile){ 
          loadOver = new Scanner(new File("NAIList.txt")); 
          overWrite = new PrintWriter("NAIList.tmp", "UTF-8"); 
         }else{ 
          loadOver = new Scanner(new File("NAIList.tmp")); 
          overWrite = new PrintWriter("NAIList.txt", "UTF-8"); 
         } 
         for(int i = 0; i < count-1; i++){ 
          for(int j = 0; j<10; j++){ 
           if(loadOver.hasNextLine()){ 
            String[] tokens = loadOver.nextLine().split(";"); 
             store[j] = new NameAddressID(tokens[0], tokens[1], tokens[2], tokens[3], tokens[4], tokens[5], Integer.valueOf(tokens[6]), Integer.valueOf(tokens[7])); 
           }else{ 
            store[j] = null; 
           } 
          } 
          for(int j = 0; j<store.length;j++){ 
           if(store[j] != null){ 
            overWrite.print(store[j].getFirst()+";"); 
            System.out.print(store[j].getFirst()+" "); 
            overWrite.print(store[j].getMiddle()+";"); 
            System.out.print(store[j].getMiddle()+" "); 
            overWrite.print(store[j].getLast()+";"); 
            System.out.print(store[j].getLast()+" "); 
            overWrite.print(store[j].getStreet()+";"); 
            System.out.print(store[j].getStreet()+" "); 
            overWrite.print(store[j].getCity()+";"); 
            System.out.print(store[j].getCity()+" "); 
            overWrite.print(store[j].getState()+";"); 
            System.out.print(store[j].getState()+" "); 
            overWrite.print(store[j].getZip()+";"); 
            System.out.print(store[j].getZip()+" "); 
            overWrite.println(store[j].getId()); 
            System.out.println(store[j].getId()); 
            store[j] = null; 
            overWrite.flush(); 
           }else{ 
            break; 
           } 
          } 

         } 
         saveArrayText("NAIList.tmp", overWrite); 
         for(int i = 0; i < addressList.size(); i++){ 
          if(loadOver.hasNextLine()){ 
           String skip = loadOver.nextLine(); 
          } 
         } 
         while(loadOver.hasNextLine()){ 
          int index = 0; 
          String[] tokens = loadOver.nextLine().split(";"); 
          store[index++] = new NameAddressID(tokens[0], tokens[1], tokens[2], tokens[3], tokens[4], tokens[5], Integer.valueOf(tokens[6]), Integer.valueOf(tokens[7])); 
          for(int j = 0; j<store.length;j++){ 
           if(store[j] != null){ 
            overWrite.print(store[j].getFirst()+";"); 
            overWrite.print(store[j].getMiddle()+";"); 
            overWrite.print(store[j].getLast()+";"); 
            overWrite.print(store[j].getStreet()+";"); 
            overWrite.print(store[j].getCity()+";"); 
            overWrite.print(store[j].getState()+";"); 
            overWrite.print(store[j].getZip()+";"); 
            overWrite.println(store[j].getId()); 
            store[j] = null; 
            overWrite.flush(); 
            break; 
           } 
          } 
         } 
         tmpFile = !tmpFile; 
        } catch (IOException e1) { 
         e1.printStackTrace(); 
        } 

        lock.notifyAll(); 
        System.out.println("Saved"); 
        try { 
         lock.wait(); 
         Thread.sleep(60000); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
     } 
    }; 

Ich weiß, dass es die for-Schleife erreicht, wo ich alle Elemente im Speicher nehmen [] und schreibt sie in eine Datei, und es die richtigen Daten an die Konsole kann nicht gedruckt werden. Jedes Mal, wenn es entweder "NAIList.txt" oder "NAIList.tmp" ändert, werden sie jedoch vollständig ausgeblendet. Ich habe keine Ahnung, warum es nicht funktioniert, da der Code im Wesentlichen von einer anderen Methode kopiert wird, die auf dem Hauptthread ausgeführt wird, der so funktioniert hat, wie ich es wollte.

Ah, habe vergessen hinzuzufügen, als künstliche Begrenzung, die mein Lehrer uns gegeben hat, dürfen wir immer nur 10 Objekte im RAM haben.

EDIT: Fest Code, nur, was sich geändert ist, dass overWrite.flush(); wurde zweimal hinzugefügt

+1

Versuchen Sie zunächst, den Code in logische Einheiten zu zerlegen. Sie können Argumente an Implementierungen von 'Runnable' übergeben, wissen Sie ... Und Java hat auch Sperrobjekte, die helfen können. Kurz: teile und herrsche. So wie es ist, ist Ihr Code kaum überschaubar, aber ich glaube, ich muss Ihnen das nicht einmal sagen. – fge

+0

Spülen Sie den Stream bei jeder Bearbeitung. – Jimmy

+0

Ah, mein Fehler, ich werde das jetzt versuchen – Aerebes

Antwort

3

Sie nicht den Printwriter spülen müssen?

finden Sie in der Javadoc der Printwriter-Konstruktor:

Erstellt ein neues Printwriter, ohne automatische Linie, mit der angegebene Datei Spülung. Dieser Convenience-Konstruktor erstellt den erforderlichen Intermediate OutputStreamWriter, der Zeichen mit dem Standardzeichensatz für diese Instanz der Java Virtual Machine codiert.

+0

Du bist der Beste, vielen Dank, es hat funktioniert! – Aerebes

Verwandte Themen