BufferedWriter Zeile "zwischenschieben"

Maddili

Mitglied
Hi, ich hab ein kleines Problem, bei dem ich nicht weiterkomme.

Ich habe eine Textdatei, mit einem Head in folgender Form:

;==============================================================================

; Program Number: aa
; Customer: aa
; Date: 17.05.2010 09:41:40
; Engineer: aa
; Description: aa
;
; Options:
;
; REVISIONS:
;
;==============================================================================

Mein Programm liest die Zeilen aus und übergibt sie der Gui in verschiedene Textfelder.

jetzt mein Problem:
Wenn ich etwas ändere (z.b. das Datum), wird die jeweilige Zeie überschrieben. ABER es soll jetzt noch eine Zeile für die Revision geschrieben werden (rote Zeile). Wie kann ich denn Zeile so einfügen, dass es ungefähr SO aussieht:


;==============================================================================

; Program Number: aa
; Customer: aa
; Date: 17.05.2010 09:41:40
; Engineer: aa
; Description: aa
;
; Options:
;
; REVISIONS:
;____: - Dies ist die erste Infozeile
;____: - Evtl kommt noch eine weitere hinzu, wenn das nächste mal etwas geändert wird
;
;==============================================================================

Zusätzlich möchte ich abfragen, ob bereits eine Revisionszeile vorhanden ist (die rote Zeile) -> Wenn ja: nächste Zeile einfügen (blau)


Problem ausreichend beschrieben? wenn nicht, bitte fragen.

vielen Dank,
Maddin
 
Hallo,

ich weiß nicht wie dein Programm aussieht, aber zwischenschieben kannst du da nichts. Wenn du was zusätzliches einfügen möchtest, musst du alles in die Datei schreiben bis zu Änderung, dann die Änderung und dann den Rest.

Wenn das ganze sowieso in einem Textfeld steht, hast du ja sowieso das ganze als String und kannst direkt den kompletten String schreiben.

Um so eine Zeile wieder zu finden, bleibt dir nichts anderes übrig, als die Datei zeilenweise auszulesen und zu überprüfen, ob sie so anfängt wie deine rote Zeile.

Gruß

Sascha
 
Danke für die Antwort.

Um so eine Zeile wieder zu finden, bleibt dir nichts anderes übrig, als die Datei zeilenweise auszulesen und zu überprüfen, ob sie so anfängt wie deine rote Zeile.

Das ist ebenfalls ein kleines Problem, denn ich weiß ja nicht, was in der roten Zeile steht. Hab mir das so gedacht, dass ich mit 'if(line.startswith(";_____: "){} ' umgehe.

Hier mal ein Teil meines Codes:

Code:
			       FileReader     input  = new FileReader("standardsop.sop");
			       FileWriter     output = new FileWriter(Aktionen.soppfad + Aktionen.sopname + filewritername);
			        BufferedReader reader = new BufferedReader(input);
			        BufferedWriter writer = new BufferedWriter(output);
			        String         line   = reader.readLine();



				    	String ProgNr = ";          Program Number: ";
				    	String Customer = ";                Customer: ";
				    	String Date = ";                    Date: ";
				    	String Engineer = ";                Engineer: ";
				    	String Description = ";             Description: ";
				    	String Options = ";    Option: ";
				    	String Revision = ";    REVISIONS:";
				    	String Revision2 = ";         : ";

				    	int zaehler = 0;

				    	while (line!=null) {

				    	zaehler++;


				    	/*
				    	 * Hier entsteht der Head
				    	 */
				    	if (line.equals(ProgNr)) {
				    		ProgNr=ProgNr.replaceFirst(";          Program Number: ",";          Program Number: " + Output.tf_PrgNr.getText());
				    		writer.write(";          Program Number: "+Output.tf_PrgNr.getText());
			            }else if (line.equals(Customer)) {
				    		Customer=Customer.replaceFirst(";                Customer: ",";                Customer: " + Output.tf_Customer.getText());
				    		writer.write(";                Customer: "+Output.tf_Customer.getText());
			            }else if (line.equals(Date)) {
				    		Date=Date.replaceFirst(";                    Date: ",";                    Date: " + Output.tf_Date.getText());
				    		writer.write(";                    Date: "+Output.tf_Date.getText());
			            }else if (line.equals(Engineer)) {
				    		Engineer=Engineer.replaceFirst(";                Engineer: ",";                Engineer: " + Output.tf_Engineer.getText());
				    		writer.write(";                Engineer: "+Output.tf_Engineer.getText());
			            }else if (line.equals(Description)) {
				    		Description=Description.replaceFirst(";             Description: ",";             Description: " + Output.tf_Description.getText());
				    		writer.write(";             Description: "+Output.tf_Description.getText());
			            }else if (line.equals(Options)) {
				    		Options=Options.replaceFirst(";             Options: ",";             Options: " + Output.tf_Options.getText());
				    		writer.write(";             Options: "+Output.tf_Options.getText());
			            }else if (line.equals(Revision)) {
 // Ab HIER wirds interessant
			            	writer.write(";    REVISIONS:");
			            	writer.newLine();
			            	line=reader.readLine();
			            	System.out.println("line: " + line);
			            	if(line.equals(";")){
			            		if(Output.tf_Revision.getText().equalsIgnoreCase("")){
			            			System.out.println("leer");
			            		}else{
			            			writer.write(line);
			            			writer.newLine();
						    		writer.write(";         : "+Output.tf_Revision.getText());
						    		writer.newLine();
						    		writer.write(";");
						    		System.out.println("test");
			            		}

			            	}

			            }else{
			                writer.write(line);
			            }
			            writer.newLine();
			            line = reader.readLine();


Bei dem Code, wie ich ihn jetzt gepostet habe, wird die "Revisionszeile" allerdings überschriben.

Vielleicht sehe ich gerade auch den Wald vor lauter Bäumen nicht, aber ich sitzt schon ewig an dem Problem

mfg
Maddin
 
Wenn ich sowas machen will, arbeite ich immer mit Channels:

Code:
    public static void main(String[] args) throws IOException {
        File f = createNewFile("Ich habe Durst");
        addText(f, 9, "viel ");
    }

    private static File createNewFile(String text) throws IOException {
        File f = File.createTempFile(FilePartWriter.class.getSimpleName(), ".txt");
        PrintStream out = null;
        try {
            out = new PrintStream(new FileOutputStream(f));
            out.print(text);
            out.flush();
            return f;
        } finally {
            out.close();
        }
    }

    private static void addText(File file, int pos, String text) throws IOException {
        FileChannel fc = null;
        try {
            fc = (new RandomAccessFile(file, "rw")).getChannel();
            ByteBuffer bb = ByteBuffer.allocate((int) file.length());
            int len = fc.read(bb, pos);
            fc.position(pos);
            fc.write(ByteBuffer.wrap(text.getBytes()));
            fc.write(ByteBuffer.wrap(bb.array(), 0, len));
        } finally {
            fc.close();
        }
    }

Zuerst steht in der Datei:
HTML:
Ich habe Durst

Danach:
HTML:
Ich habe viel Durst

So kannst Du das für Dein Beispiel bestimmt umsetzen.
 
Danke Schnuffie für deine Mühe.
Aber leider verstehe ich keine Zeile deines Codes ;)

Naja, ganz so schlimm ists nicht..
Nur wenn ich das so mache, wie du (also an der Stelle 9 den String xyz einfügen), dann kann ich gleich nen zaehler++ mitlaufen lassen und an zeile 20 String xyz einfügen. Aber so schööön ist das nicht, denke ich. Was ist wenn sich in der Zukunft der Head verschiebt, oder Überschrift plötzlich drei statt zwei Zeile ist (usw).

Ich bin mittlerweile am Verzweifeln. Hat denn keiner noch ne Idee? Sonst breche ich jetzt sofort dieses Projekt, mein Studium und mein Werkstudentenjob ab!! :p
 
Code:
// ganzen Inhalt lesen, dann:
String s = new String(bb.arry());
int pos = s.indexOf("irgendwas"); // variable Position
 
Speichere die Revisions-Zeilen in einer ArrayList o.ä., weil du ja nicht weißt, wie viele du bekommst.
Führe eine Variable mode ein, in der du speicherst, z.B. als enum, ob du einen Customer, ein Date oder sonstwas einzulesen bzw. eingelesen hast. Anhand des Modus kannst du dann in einem case die Daten extrahieren und in die richtige Variable schreiben.
 
Guten Morgen zusammen.

Sorry ich muss dieses Thema nochmal pushen, da ich einfach nicht weiterkomme.

Es muss doch möglich sein:

- Eine Zeile abzufragen, ob sie "leer" ist (also lediglich ein ' ; ' enthält, sonst aber leer ist)
- Wenn ja, schreibe die Revisionszeile;
- Wenn nein (es besteht bereits eine oder mehrere Revisionszeilen), gehe eine Zeile weiter runter und frage erneut (ob zeile leer ist usw..)


mfg Maddin
 
Hallo,

wenn du die Zeile als String hast, kannst du es einfach überprüfen.
Code:
String line = einlesenDerZeile;
if(line.trim().equals(";")){
}
else{}

Gruß

Sascha
 
Zurück