Frage zur Klasse RandomAccessFile

Mane123

Bekanntes Mitglied
Hallo zusammen,

ich habe eine Frage zu folgendem Quelltext:

Java:
import java.awt.GridLayout;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

public class Binaer2 extends JFrame{
	
	//automatisch über Eclipse ergänzt
	private static final long serialVersionUID = 1679025732306143406L;
	//eine Instanzvariable vom Typ RandomAccessFile
	private RandomAccessFile datei;
	
	//der Konstruktor
	public Binaer2(String titel) {
		super(titel);
			
		//ein GridLayout mit 2 Spalten anwenden
		setLayout(new GridLayout(0, 2));
		
		//gibt es die Datei daten.bin schon?
		File dateiTest = new File("daten.bin");
		//wenn nicht, erstellen wir sie neu
		if (dateiTest.exists() == false)
			datenSchreiben();
		//die Daten lesen
		datenLesen();
		
		//Größe setzen, Standard-Verhalten festlegen und anzeigen
		pack();
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
	}

	//die Methode zum Lesen
	private void datenLesen() {
		try {
			//geöffnet wird die Datei daten.bin im Nur-Lesen-Modus
			datei = new RandomAccessFile("daten.bin","r");
			//20 Mal Daten als int lesen
			for (int i = 0; i < 20; i++)
				//und ein neues Label aus dem Wert erzeugen
				add(new JLabel(Integer.toString(datei.readInt())));
			datei.close();
		}
		catch (IOException e ) {
			JOptionPane.showMessageDialog(this, "Beim Laden ist ein Problem aufgetreten");
	    }
		//das Fenster neu "packen"
		pack();
	}
	
	//die Methode zum Schreiben
	private void datenSchreiben() {
		try {
			//geöffnet wird die Datei daten.bin im Lese- und Schreibmodus
			datei = new RandomAccessFile("daten.bin","rw");
			//20 Werte als int in die Datei schreiben
			for (int i = 0; i < 20; i++)
				datei.writeInt(i * 10);
			datei.close();
		}
		catch (IOException e ) {
			JOptionPane.showMessageDialog(this, "Beim Schreiben ist ein Problem aufgetreten");
	    }
	}
}

In den Methoden datenLesen() und datenSchreiben() wird jeweils von datei eine neue Instanz erzeugt.
Warum ist dies so, bzw. was bewirkt dies?
Wenn ich in der Methode datenLesen() die Zeilen datei = new RandomAccessFile("daten.bin","r"); auskommentiere, dann erscheint eine NullPointerException.
Warum erscheint diese Exception? Liegt es an der If - Abfrage im Konstruktor?

Vielen Dank!

Viele Grüße
 

eRaaaa

Top Contributor
In den Methoden datenLesen() und datenSchreiben() wird jeweils von datei eine neue Instanz erzeugt.
Warum ist dies so, bzw. was bewirkt dies?
Wenn ich in der Methode datenLesen() die Zeilen datei = new RandomAccessFile("daten.bin","r"); auskommentiere, dann erscheint eine NullPointerException.
Warum erscheint diese Exception? Liegt es an der If - Abfrage im Konstruktor?

Der Konstruktor hat damit gar nichts zu tun, da wird ja nur eine Instanz von File erzeugt, nicht von RandomAccessFile oder sonstiges. File ist einfach nur irgendein abstrakter Pfad, den es noch nicht mal geben muss!(besser wäre hier eig. der Klassenname Path, glaube in NIO2-Java7 wirds auch so heißen).D.h. File hat erstmal nichts mit Dateien direkt zu tun, das repräsentiert einfach nur den Pfad. Dann brauchst du natürlich noch irgendein Reader/Writer, der dann wirklich die Datei liest und schreibt und das macht eben hier RandomAccessFile. Die NPE tritt dann natürlich auf, weil du innerhalb von datenLesen/datenSchreiben Methoden auf datei aufrufst(Achtung, nicht dateiTest!!)
Genau genommen ist hier eig. der Teil mit "dateiTest" im Konstruktor nicht mal wirklich nötig um die Datei zu lesen oder zu schreiben, wird hier einfach benutzt, weil File einige nützliche Methoden bereitstellt wie hier eben z.B. zum Überprüfen ob die Datei existiert oder nicht !
*Puh* :D
 

Mane123

Bekanntes Mitglied
Danke für die Antwort.

Jeweils in der Methode datenSchreiben() datenLesen() wird ja mit new eine neue Instanz der Klasse RandomAccessFile erzeugt.
Also folgendes:

1. Aufruf datenSchreiben()
datei = new RandomAccessFile("liste.bin","rw")

2. Aufruf datenLesen()
datei = new RandomAccessFile("liste.bin","r")

Existieren dann tatsächlich zwei Instanzen der Klasse RandomAccessFile, oder nur eine, die jeweils in der Methode abgeändert wird?

Viele Grüße!
 

eRaaaa

Top Contributor
Existieren dann tatsächlich zwei Instanzen der Klasse RandomAccessFile, oder nur eine, die jeweils in der Methode abgeändert wird?

Mhm? Du hast doch oben bereits selber gesagt dass mit new ein neues Objekt erstellt wird! Demnach werden hier(falls die Datei noch nicht existiert) zwei Objekte von RandomAccessFile erstellt ja!
 

eRaaaa

Top Contributor
Nein, sie referenziert erst das Objekt welches in datenSchreiben erstellt wurde und wenn dann datenLesen aufgerufen wird, das Objekt welches dort erstellt wird. Das andere Objekte gibts dann zwar noch, aber datei oder andere Variablen referenzieren nicht mehr drauf, daher wirds dann früher oder später irgendwann von der GC abgeholt...
 

Mane123

Bekanntes Mitglied
Ahhhh, jetz hab ich es verstanden.
Mich hat's gewundert, weil bis jetzt immer nur eine Instanzvariable auf ein Objekt referenzierte. In diesem Listing war das so, dass komischerweise eine Instanzvariable augenscheinlich auf zwei Objekte referenziert.

Aber wenn dann das eine Objekt vom Garbage Collector "vernichtet" wird, dann ist es logisch :)

Bzw. gibt es dann noch eine Möglichkeit, wenn folgendes passiert:

1. Aufruf datenSchreiben()
datei = new RandomAccessFile("liste.bin","rw")

2. Aufruf datenLesen()
datei = new RandomAccessFile("liste.bin","r")

Dass ich dann mit datei zum 1. Objekt eine Referenz herstellen kann, oder muss ein neues Objekt erstellt werden?

VIIIIIIEEEELEN DANK!!! :)

Viele Grüße
 

eRaaaa

Top Contributor
Dass ich dann mit datei zum 1. Objekt eine Referenz herstellen kann, oder muss ein neues Objekt erstellt werden?

:bahnhof: verstehe nicht so ganz worauf du hinaus willst. Also klar könnte man das sicherlich irgendwie, müsstest dann evtl. beim Schreiben das close() weglassen und den file-poiner evtl. wieder mit seek oder so auf 0 setzen.(aber ob das so schön wäre? ???:L )
Allerdings ist das natürlich hier eh ein etwas komisches Beispiel, denn ich könnte ja im Falle von Datei ist noch nicht vorhanden das Aufrufen von datenLesen mir ja eh sparen, da ich ja selbst in die Datei reinschreibe. Man könnte beim Schreiben also schon direkt die Strings/Zahlen oder whatever ausgeben und würde sich so das Lesen sparen.

Aber so ganz verstehen was dir jetzt noch unklar ist, tue ich nicht :(
 

Mane123

Bekanntes Mitglied
Danke, das passt schon, ich hab's nur verstanden. Solche Beispiele sind in meinen Unterlagen drin. Ein bisschen Verwirrend, aber irgendwann steig ich da schon noch komplett durch :)

Viele Grüße
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
cosmic Frage zu der RandomAccessFile Klasse Java Basics - Anfänger-Themen 6
M Frage zur Methode split der Klasse String Java Basics - Anfänger-Themen 32
M konzeptuelle Frage: In welcher Klasse definiert man am Besten Methoden, die die Kommunikation mit dem User regeln? Java Basics - Anfänger-Themen 8
S Frage Klasse und Objekte Java Basics - Anfänger-Themen 2
H Frage bezüglich einer Klasse Java Basics - Anfänger-Themen 2
K Frage zu abstrakter Klasse Java Basics - Anfänger-Themen 14
M Frage zur Scanner Klasse Java Basics - Anfänger-Themen 3
A Frage zu einer Klasse aus der Klassenbibliothek Java Basics - Anfänger-Themen 8
S Klassen Klasse oder nicht Klasse - das ist hier die Frage Java Basics - Anfänger-Themen 6
J Frage zu generischer Klasse und Casten Java Basics - Anfänger-Themen 14
M Frage zur Klasse FileReader Java Basics - Anfänger-Themen 6
M Frage zur Klasse File Java Basics - Anfänger-Themen 8
E Frage zur Methode size() der Klasse ZipFile Java Basics - Anfänger-Themen 2
D Frage zur Klasse Robot Java Basics - Anfänger-Themen 2
M Frage zu einer abstrakten Klasse Java Basics - Anfänger-Themen 16
A Frage zur Klasse File Java Basics - Anfänger-Themen 2
G Frage zum Überschreiben einer Klasse Java Basics - Anfänger-Themen 6
F Frage zu Inztanziierung einer Klasse Java Basics - Anfänger-Themen 3
Zrebna Frage zu Test-Driven Development (TDD) Java Basics - Anfänger-Themen 3
I Frage Thymeleaf -> Fehler ignorieren und mit "" ersetzen? Java Basics - Anfänger-Themen 15
I Frage Thymeleaf -> Prefix / Suffix ändern? Java Basics - Anfänger-Themen 11
D Rekursions Probleme / frage Java Basics - Anfänger-Themen 4
T Frage zu Parse Java Basics - Anfänger-Themen 2
H Frage an die Profis Java Basics - Anfänger-Themen 4
J Eine konzeptionelle Frage zu OOP Java Basics - Anfänger-Themen 3
P Frage zu Rekursion und Backtracking Java Basics - Anfänger-Themen 2
H Frage zur Ausgabe Java Basics - Anfänger-Themen 4
H Frage zu arithmetischen Operationen Java Basics - Anfänger-Themen 20
F Kurze Frage zu replace() Java Basics - Anfänger-Themen 19
JavaSchmecktLecker Polymorphie Frage zur Methodenüberschreibung Java Basics - Anfänger-Themen 21
J Frage zu einem "Taschenrechner" code Java Basics - Anfänger-Themen 9
B Erste Schritte Frage zu Instanzierung und Referenzen Java Basics - Anfänger-Themen 8
DoubleM Runtime.getRuntime().exec Frage Java Basics - Anfänger-Themen 2
J Eine theoretische Frage zur Praxis - JPanel oder Canvas Java Basics - Anfänger-Themen 5
O Frage: Formaler Typbezeichner? Java Basics - Anfänger-Themen 3
I BlueJ Queue Frage für Klausur Java Basics - Anfänger-Themen 2
N Verständnis Frage zu Variablen Java Basics - Anfänger-Themen 3
N Spezielle frage zum Comparator Java Basics - Anfänger-Themen 6
L Frage zum Array Java Basics - Anfänger-Themen 1
A Frage zum UML Design Java Basics - Anfänger-Themen 1
I Hilfe bei Klausur Frage Java Basics - Anfänger-Themen 8
izoards Drucken Frage zu FAQ Beitrag Java Basics - Anfänger-Themen 2
J Frage zu meinem Code (OOP) Java Basics - Anfänger-Themen 4
sserio Split() -> Regex Frage. Java Basics - Anfänger-Themen 7
A OCA Study Guide: 2. Frage aus Kapitel 3 Java Basics - Anfänger-Themen 9
sserio Date Library Frage Java Basics - Anfänger-Themen 9
Max246Sch Frage zu Währungsrechner Code Java Basics - Anfänger-Themen 2
sserio Frage zu HashMaps Java Basics - Anfänger-Themen 20
sserio Frage zu Threading - Multithreading Java Basics - Anfänger-Themen 2
sserio Frage zu Lambda Ausdrücken Java Basics - Anfänger-Themen 7
sserio Frage zu BigInteger Java Basics - Anfänger-Themen 1
D Frage bzgl. Enum-Handhabung Java Basics - Anfänger-Themen 16
xxx12 Frage Java Basics - Anfänger-Themen 2
I Generelle Frage zu Mikroservices (Spring Boot?), Docker... Java Basics - Anfänger-Themen 7
R Frage zu Methoden (Rückgabewert u. ohne.) Java Basics - Anfänger-Themen 2
A Frage zur programmierung Java Basics - Anfänger-Themen 12
R Input/Output Frage zu Java IO Java Basics - Anfänger-Themen 6
M Frage zu printWriter Java Basics - Anfänger-Themen 5
C Frage zu OLSMultipleLinearRegression Java Basics - Anfänger-Themen 31
KogoroMori21 Frage zum Euklidischen Algorithmus Java Basics - Anfänger-Themen 11
S Verständnis-Frage zu einer HÜ? Java Basics - Anfänger-Themen 1
F Frage betreff Programm mit dem man C++-Code in JAVA-Code übersetzen lassen kann Java Basics - Anfänger-Themen 2
L Frage zur Ticket Maschine Java Basics - Anfänger-Themen 1
J Frage zu OOP-Klassendiagramm Java Basics - Anfänger-Themen 8
OSchriever Frage zu Compiler Java Basics - Anfänger-Themen 8
H Frage zu Throw Exception Java Basics - Anfänger-Themen 2
TimoN11 Frage zu Java-Vererbung (Cast) Java Basics - Anfänger-Themen 5
Bademeister007 Hallo Leute ich hab eine Frage zur ArrayList Java Basics - Anfänger-Themen 8
F Frage betreff Programmierbücher zu Lagerverwaltung als Konsolenprogramm Java Basics - Anfänger-Themen 3
dieter000 Kurze Frage kann mir ejmand kurz diesen Code erklären, bzw wie man die zeilen erklärt und so Java Basics - Anfänger-Themen 1
I String.split regex Frage Java Basics - Anfänger-Themen 2
N Best Practice Frage zum MVC-Pattern Java Basics - Anfänger-Themen 2
dieter000 Frage zu einem Beispiel... Java Basics - Anfänger-Themen 5
J Frage zum Loggen Java Basics - Anfänger-Themen 18
J Methoden Frage: Array-Werte in anderer Methode ändern Java Basics - Anfänger-Themen 4
Zrebna Frage zum "Referenzen-konzept" in Java Java Basics - Anfänger-Themen 8
JD_1998 Array-Position aus einer Methode in einer anderen ausgeben (Kurze Frage) Java Basics - Anfänger-Themen 2
marcooooo Frage zu bestimmten Beispiel Java Basics - Anfänger-Themen 31
NeoLexx equals()-Methode Verständnis Frage anhand Code Beispiel Java Basics - Anfänger-Themen 22
N Input/Output Eine Frage über system.out.println. Java Basics - Anfänger-Themen 10
B Erste Schritte Learning Coding (!) Frage an erfahrene Programmierer. Java Basics - Anfänger-Themen 23
B Frage zum Code verständnis im Resultat Java Basics - Anfänger-Themen 10
C Exception-Frage Java Basics - Anfänger-Themen 3
J Eine Frage zur Schreibweise == ? : Java Basics - Anfänger-Themen 3
S Frage des Designs Java Basics - Anfänger-Themen 1
JavaTalksToMe Extends/Implements Frage Java Basics - Anfänger-Themen 3
pkm Frage zu Servletfunktion Java Basics - Anfänger-Themen 0
B Frage zur Währungsumrechnung Java Basics - Anfänger-Themen 3
S Allgemeine Frage über Generics und Vererbungen Java Basics - Anfänger-Themen 5
Kirby.exe Frage zur Verwendung von Interfaces Java Basics - Anfänger-Themen 6
D Frage zu Strings einer Exception Java Basics - Anfänger-Themen 4
L Wie frage ich ab, ob in einem Array, Werte doppelt vorkommen? Java Basics - Anfänger-Themen 4
D Frage zur IDE IntelliJ IDEA Java Basics - Anfänger-Themen 6
H Frage zum 2d Array Java Basics - Anfänger-Themen 1
N Frage zum Newton-Fraktal Java Basics - Anfänger-Themen 1
H Frage zu interfaces Java Basics - Anfänger-Themen 1
J Frage dazu Variablen klassenübergreifend zu verändern Java Basics - Anfänger-Themen 22
I Frage zu SkipList Java Basics - Anfänger-Themen 4
G Frage zu JScrollPane Java Basics - Anfänger-Themen 12
Kirby.exe Allgemeine Frage Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben