String in Textfile ersetzen

timestamp

Mitglied Käsekuchen
Hi

ich schreibe für einen Freund ein kleines Programm, dass Codes überprüfen soll. Mittlerweile klappt alles, bis auf das ändern des Statusses eines Codes. Wird ein Code als gültig erkannt, soll der Status auf 1 gesetzt werden. Leider wird bei mir nichts in die Textdatei geschrieben.
Java:
try {
  rf = new RandomAccessFile(codefile, "rw");
  rf.seek(0);
  boolean run = true;
  boolean found = false;										
  do {
    line = rf.readLine();
    if (line.length() != 8) {
      run = false;
    }
    if (run) {
      check = line.charAt(0) + "" + 
                     line.charAt(1) + "" + 
                     line.charAt(2) + "" + 
                     line.charAt(3) + "" + 
                     line.charAt(4) + "" + 
                     line.charAt(5) + "";
      if (check.equalsIgnoreCase(checkCode)) {
        if( line.charAt(7) == '0'){
          output.setText("Code gültig.");
          output.setBackground(Color.green);
          run = false;
          found = true;									
          rf.seek(rf.getFilePointer()-11);
          byte[] b = {(byte)line.charAt(0),(byte)line.charAt(1),(byte)line.charAt(2),(byte)line.charAt(3),(byte)line.charAt(4),(byte)line.charAt(5),(byte)',',(byte)1};
          rf.write(b, (int)rf.getFilePointer()-11, 8);					
        }
        else{
          output.setText("Code bereits aktiviert.");
          output.setBackground(Color.red);
          run = false;
          found = true;
        }
      }							
    }
  } while (run);					
  if (!found) {
    output.setBackground(Color.red);
    output.setText("Code nicht gefunden.");
    output.setText(output.getText()+" - "+check+" - "+line.length());
  }
}

Beispiel Textdatei:
Code:
A23456,0
A23457,0
A23458,0
JFK123,1
END

Mein Problem: Die Textdatei sieht danach unverändert aus, sprich es wird nichts hineingeschrieben. Ich habe es schon mit writeChars() bzw writeChar() probiert, aber das hat mir immer den Rest der Datei gelöscht. Der betreffende Code steht in Zeile 26
 
Wann machst Du die Datei eigenlich wieder zu? Geschrieben wird's doch dann erst, oder bei Streams mit flush().
 
Wann machst Du die Datei eigenlich wieder zu? Geschrieben wird's doch dann erst, oder bei Streams mit flush().

Ich habe den Code aus einem Buch (Java 6 Programmierung von Alexander Schunk) und dort ist der Code genauso dargestellt. Wenn ich statt writeByte() writeChar() writeChars() benutze, wird dort alles mit Leerzeichen geschrieben ( J F K 1 2 3 statt JFK123) und der Rest der Datei gelöscht. Gibt es eine bessere Möglichkeit für mein Vorhaben?
 
Eleganter geht sowas z.B. so (relevante Methode "isActivated"):

Code:
public static void main(String[] args) throws IOException {
File f = createNewFile("A23456,0 A23457,0 A23458,0 JFK123,1 END");
try {
for (String code : Arrays.asList(new String[] { "A23457", "JFK123" }))
if (isActivated(f, code)) {
System.out.println("Code ist aktiviert");
} else {
System.out.println("Code ist deaktiviert");
}
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
}
}
 
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 boolean isActivated(File f, String code) throws IllegalArgumentException, IOException {
ByteBuffer bb = ByteBuffer.allocate((int) f.length());
ReadableByteChannel rbc = (new FileInputStream(f)).getChannel();
bb.limit(rbc.read(bb));
bb.flip();
String[] array = (new String(bb.array())).split(" "); // könnte ebenso auch ein Zeilenumbruch sein
for (String s : array) {
if (s.startsWith(code)) {
return s.endsWith(",1");
}
}
thrownew IllegalArgumentException("Code nicht gefunden");
}
 
Hallo

Danke für deine Mühen, aber festzustellen ob der Code aktiviert ist klappt bei mir. Ich suche jetzt eine Funktion Activate() ;)
 
Hallo nocheinmal

ich habe die Beantwortung meiner Frage in einem anderen Thread gelesen, das von Prinzip her das gleiche Problem ist: Lösung
Ich muss wohl oder übel alles nocheinmal in die Datei schreiben.
 
Zurück