Java Problem beim Öffnen einer Datei mit java.io.RandomAccessFile

runagrog

Commander
Registriert
März 2012
Beiträge
2.094
Ich versuche gerade (als Neuling) (zu Übungszwecken) ein Programm in Java zu schreiben, dass Primzahlen berechnet und anschließend die Primzahlen in ein Textdokument schreibt. Den Teil mit den Primzahlen berechnen klappt schon ganz gut, aber wenn ich jetzt eine Datei mit
Code:
java.io.RandomAccessFile file = new java.io.RandomAccessFile("D:\abc\prime.txt", "rw");
erstellen (öffnen) möchte, bekomme ich (ich benutze NetBeans) einen
Code:
illegal escape character
Fehler.
Dann hab ich mal ein bisschen umgeschaut und anschließend die Zeile in
Code:
java.io.RandomAccessFile file = new java.io.RandomAccessFile("D:\\abc\\prime.txt", "rw");
geändert. Damit habe ich den Fehler weggekriegt, jetzt habe ich aber einen
Code:
unreported exeption FileNotFoundExeption
Fehler.
Dasselbe bei
Code:
java.io.RandomAccessFile file = new java.io.RandomAccessFile("D:/abc/prime.txt", "rw");
also mit / statt \.
Was kann ich jetzt machen, damit ich die Datei öffnen kann?
Bitte um viele hilfreiche Antworten :)
LG runagrog
 
Muss es RandomAccessFile sein? Wie wäre es mit FileWriter?
 
Muss nicht, aber in meinem Java-Buch ist alles mit RandomAccessFile erklärt. Deshalb würde ich halt ganz gerne diese Klasse auch benutzen :)
Das Verzeichnis existiert, Schreibrechte auch...
 
Mach mal ein

Code:
System.out.println(new File("D:/abc/prime.txt").isFile());

Edit: Erstell die Datei vorher manuell, falls sie noch nicht existiert.
 
Zuletzt bearbeitet:
Aus welcher Klasse ist das?
Ich krieg da ein cannot find symbol-Fehler.

Ok, ist java.io.File. Hab die Klasse gefunden probier das gleich mal aus.
 
Zuletzt bearbeitet:
Ich benutze Netbeans 7.2.1
Der Test ist true.
 
Zuletzt bearbeitet:
Bist du sicher, dass genau diese Zeile die FileNotFoundException auslöst?
Was passiert, wenn du die Datei testweise mal per Hand anlegst?

@soares: NetBeans
 
Der Stracktrace wäre interessant. Dem kann man (meistens) entnehmen, wo genau die Ausnahme geworfen wird.
 
Ohne die Zeile gibt es die Exeption jedenfalls nicht :)
Wo kann ich den Stacktrace auslesen?
 
Code:
package prime;

public class Prime {

    public static void main(String[] args) {
        long numtotest = 1;
        long numtestdiv = 2; 
        long[] prime1000;
        System.out.println(new java.io.File("D:/abc/prime.txt").isFile());
        new java.util.Scanner(System.in).next();
        int index = 0;
        prime1000 = new long[1000];
        java.io.RandomAccessFile file = new java.io.RandomAccessFile("D:\\abc\\prime.txt", "rw");
        while(true) {
        
        while(numtestdiv < numtotest) {
            if ((numtotest % numtestdiv) == 0) {
                numtotest++; numtestdiv = 2; continue;
            } else {
                numtestdiv++;
            }
            
        }
        System.out.print(numtotest + " ");
        if(index <= 999) {
            prime1000[index] = numtotest;
            index++;
        } else {
            index = 0;
            prime1000[index] = numtotest;
            index++;
        }
        numtotest++; numtestdiv = 2;
        }
        
    }
}
Das ist der gesamte Code.
Wie kann ich den Stacktrace auslesen? (Was ist der überhaupt, bin noch nicht sooo weit?) :)
Ich dachte halt, dass ich nach 1000 Primzahlen einfach mal alle in eine Datei schreibe :)
Die Anweisungen dafür kämen halt vor index = 0
 
Zuletzt bearbeitet:
Normalerweise sollte der Stacktrace im NetBeans Ausgabe-Fenster angezeigt werden. Schau mal unter View, wenn es nicht automatisch erscheint.

Der Stacktrace ist der Aufrufstapel, dem man entnehmen kann, welche Methoden in welchen Klassen bis zu dem Fehler aufgerufen wurden.
Ergänzung ()

Ah, der Code kompiliert gar nicht und der Compiler zeigt Dir an, dass Du die FileNotFoundException nicht behandelst! Das solltest Du also auch tun
 
Ok... Ich hab mich jetzt mal über den Stacktrace kurz schlaugemacht, http://de.wikipedia.org/wiki/Stacktrace den code eingefügt und jetzt kriege ich gar keine Exeption mehr...

Edit: Zu spät :) Also, wie kann ich jetzt professionell eine Datei öffnen? Bzw. wie kann ich die Exeption auf eine schöne Art und Weise behandeln?
 
Zuletzt bearbeitet:
PHP:
Writer out = new BufferedWriter(new FileWriter(new File("...")));

wäre ein Weg. Üblicheweise nutzt man für so Sachen Library-Code, um nicht ständig jede Menge Boilerplate schreiben zu müssen. Deine Methode mit Randomaccessfile geht natürlich auch.

Um die Exception zu fangen, einfach ein try-catch um den Codeblock. Hier würde es auch reichen, in der Methodendeklaration ein "throws IOException" oder "throws Exception" hinzufügen. Ist ja nur zum testen.
 
Ok.
Ich hab das jetzt folgendermaßen:
Code:
package prime;

public class Prime {

    public static void main(String[] args) {
        
        long numtotest = 1;
        long numtestdiv = 2; 
        long[] prime1000;
        int index = 0;
        prime1000 = new long[1000];
        try {
        java.io.RandomAccessFile abc = new java.io.RandomAccessFile("D:\\abc\\prime.txt", "rw");
        } catch(Exception exc) { 
}  
        while(true) {
        
        while(numtestdiv < numtotest) {
            if ((numtotest % numtestdiv) == 0) {
                numtotest++; numtestdiv = 2; continue;
            } else {
                numtestdiv++;
            }
            
        }
        System.out.print(numtotest + " ");
        if(index <= 999) {
            prime1000[index] = numtotest;
            index++;
        } else {
            for(index = 0; index < 1000; index++) {
                abc.writeLong(prime1000[index]);
                
            }
            index = 0;
            prime1000[index] = numtotest;
            index++;
        }
        numtotest++; numtestdiv = 2;
        }
      
    }
}
Jetzt zeigt mir Netbeans aber einen Fehler bei Zeile 32 an: cannot find symbol: variable abc
location: class Prime

Irgendeine Idee, denn ich ja das Objekt abc eindeutig in Zeile deklariert, oder nicht?
 
Du hast abc im try-Block deklariert. Sobald dieser Block verlassen wird, "verschwindet" alles, was dort deklariert wurde.
Du musst abc also außerhalb dieses Block deklarieren und im try-Block die Zuweisung machen.

Edit: writeLong() kann übrigens auch eine Exception werfen. Du musst den try-Block also um den ganzen Code, der abc benutzt, erweitern.
Und btw, "abc" ist kein sprechender Name.
 
Zuletzt bearbeitet:
Gut, dass abc kein sprechender Name ist, stimmt.
Ich probier das mal aus.
Ergänzung ()

Ok, die Datei wird geöffnet, aber es werden (für mich) wahllos Zeichen in die Datei geschrieben...
Ich habe den catch-Teil kurz vor das Ende von main() gebaut. Eigentlich sollte er doch versuchen, die long-werte als long in die Datei zu schreiben und nicht versuchen, das ganze zu char zu konvertieren?
(oder etwas in der Art)
 
Zuletzt bearbeitet:
Es wird auch ein long in die Datei geschrieben. ;) Ein Text-Editor kann damit nur nichts anfangen, d.h. er kann nicht die einzelnen Bytes, aus denen ein long besteht, zu (menschen-)lesbaren Zeichen konvertieren (ein long besteht aus 8 Bytes, ein Zeichen i.d.R. nur aus einem). Mit einem Hex-Editor kannst du den Inhalt besser lesen.

Was du eigentlich willst ist die einzelnen Ziffern der Zahl als Zeichen in die Datei schreiben. Dazu musst du auch die entsprechende Methode writeChars() benutzen.
 
Zurück
Oben