2014-09-07 9 views
6

zu einer bestimmten Zeilennummer schreiben Ich schreibe gerade mein Projekt für die Schule, in der ich in txt-Dateien lesen und schreiben muss. Ich kann sie richtig lesen, aber ich kann sie nur am Ende von einem angehängten FileWriter schreiben. Ich würde gerne in der Lage sein, Dinge in meinen TXT-Dateien auf Zeilennummern zu überschreiben, indem ich zuerst die Daten in der Zeile lösche und dann die neuen Daten einlege. Ich habe versucht, diese Methode zu verwenden ...Wie kann ich in einer txt-Datei in Java

public void overWriteFile(String dataType, String newData) throws IOException 
{ 
    ReadFile file = new ReadFile(path); 
    RandomAccessFile ra = new RandomAccessFile(path, "rw"); 
    int line = file.lineNumber(path, dataType); 
    ra.seek(line); 
    ra.writeUTF(dataType.toUpperCase() + ":" + newData); 
} 

aber ich glaube, dass das Suchverfahren in Bytes entlang bewegt, anstatt Zeilennummern. Kann jemand helfen. Vielen Dank im Voraus :)

P.S. Die file.lineNumber-Methode gibt die genaue Zeile zurück, in der sich die alten Daten befanden, daher habe ich bereits die Zeilennummer, in die geschrieben werden muss.

EDIT: Soloution gefunden! Danke Jungs :) Ich werde die soloution Sie unten, wenn jemand interessiert ist

public void overWriteFile(String dataType, String newData, Team team, int dataOrder) throws IOException 
{ 
    try 
    { 
     ReadFile fileRead = new ReadFile(path); 
     String data = ""; 
     if(path == "res/metadata.txt") 
     { 
      data = fileRead.getMetaData(dataType); 
     } 
     else if(path == "res/squads.txt") 
     { 
      data = fileRead.getSquadData(dataType, dataOrder); 
     } 
     else if(path == "res/users.txt") 
     { 
      data = fileRead.getUsernameData(dataType, dataOrder); 
     } 
     else if(path == ("res/playerdata/" + team.teamname + ".txt")) 
     { 
      //data = fileRead.getPlayerData(dataType, team.teamname, dataOrder); 
     } 
     BufferedReader file = new BufferedReader(new FileReader(path)); 
     String line; 
     String input = ""; 
     while((line = file.readLine()) != null) 
     { 
      input += line + '\n'; 
     } 
     input = input.replace(dataType.toUpperCase() + ":" + data, dataType.toUpperCase() + ":" + newData); 
     FileOutputStream out = new FileOutputStream(path); 
     out.write(input.getBytes()); 
    } 
    catch(Exception e) 
    { 
     System.out.println("Error overwriting file: " + path); 
     e.printStackTrace(); 
    } 
} 
+2

Wenn Sie die Länge jeder Zeile nicht kennen, können Sie nicht zufällig auf eine bestimmte Zeile zugreifen. Kopieren Sie einfach alle Zeilen, bis Sie die gesuchte gefunden haben, und schreiben Sie dann den Ersatz, und schreiben Sie die restlichen Zeilen. –

Antwort

7

A quick and dirty Lösung wäre, die Files.readAllLines und Files.write Methoden verwenden, um alle Zeilen zu lesen, ändern Sie die Sie ändern möchten, und überschreiben die gesamte Datei:

List<String> lines = Files.readAllLines(file.toPath()); 
lines.set(line, dataType.toUpperCase() + ":" + newData); 
Files.write(file.toPath(), lines); // You can add a charset and other options too 

Natürlich das ist keine gute Idee, wenn es eine sehr große Datei ist. Einige Ideen zum Kopieren der Datei Zeile für Zeile in diesem Fall finden Sie unter this answer.

Unabhängig davon, wie Sie es tun, wenn Sie die Bytelänge der Zeile ändern, müssen Sie jedoch die gesamte Datei (AFAIK) neu schreiben. RandomAcessFile ermöglicht es Ihnen, die Datei zu verschieben und Daten zu überschreiben, aber keine neuen Bytes einzufügen oder vorhandene zu entfernen, sodass die Länge der Datei (in Byte) gleich bleibt.

+0

Nun, Sie müssen sicherlich nicht die Daten kopieren, die vor der fraglichen Zeile kommt. Die Daten danach müssen um die Differenz verschoben werden, die durch die Bearbeitung eingeführt wird. Wenn die Datei sehr groß ist und sich die bearbeitete Zeile dem Ende nähert, könnte sich dies auszahlen. Es kann von entscheidender Bedeutung sein, wenn die Datei so groß ist, dass eine zusätzliche Arbeitskopie nicht auf die Festplatte passt. – 5gon12eder

1

hier ein Link auf eine Frage ist nur, wie dies mit einer großen Antwort: I want to open a text file and edit a specific line in java

Im Grunde kann man nicht einfach bearbeite diese Zeile, es sei denn, sie wird genau die gleiche Länge haben.

Stattdessen sollten Sie über jede Zeile kopieren und dann, wenn Sie die Zeilennummer der Zeile, die Sie ändern möchten, erreichen, anstatt die alte Zeile zu kopieren, einfach Ihre neue Zeile einfügen.

Der Link, den ich Ihnen gab, hat ein großartiges Beispiel dafür.

Ich hoffe, das hilft ... wenn nicht, lass es mich wissen, und ich werde weiter auf die Post zu erarbeiten. Viel Glück :)

Verwandte Themen