Input/Output Daten in Datei schreiben und auslesen

jockyjoe

Mitglied
Hallo,

ich möchte gerne ein Programm schreiben, dass Eingaben von der Tastatur in eine Datei schreibt und speichert (und später auch wieder ausliest). In meinem Programm geht es um Bücher, wo man den Titel des Buches, den/die Autor/in und die ISBN eingeben soll. Da ich in Java(und in Sachen Datenströmen) ein Anfänger bin, habe ich mich hierran orientiert: In eine Datei schreiben, aus einer Datei lesen .
Code:

Java:
import java.util.Scanner;
import java.io.*;

public class Buch
{
	
	public static class sBuch
	{
		String name;
		String author;
		String ISBN;
		int anzSeiten;
		byte kapitel; //Optional
	}
	
	public static void main(String[] args) throws IOException
	{
		sBuch buch1 = new sBuch();
		Scanner sc = new Scanner(System.in);

		System.out.print("Name des Buches: ");
		buch1.name = sc.nextLine();
		
		System.out.print("Name des Autors: ");
		buch1.author = sc.nextLine();
		
		System.out.print("ISBN: ");
		buch1.ISBN = sc.nextLine();
		
		String buecher = "buecher.txt"; //Zieldatei
		FileOutputStream speicherBuch = new FileOutputStream(buecher);

		for(int i = 0; i < buch1.name; i++)
		{
			speicherBuch.write((char)buch1.name.nextLine(buch1.name));
		}
		speicherBuch.close();
		System.out.println("Fertig.");
	}
}

Die Datei "buecher.txt" liegt im gleichen Verzeichnis wie die Datei "Buch.java".
Wenn ich den Code kompiliere bekomme ich folgende Fehlermeldungen:

Java:
Buch.java:33: error: bad operand types for binary operator '<' for(int i = 0; i < buch1.name; i++) 
^ 
first type: int 
second type: String Buch.
--
java:35: error: cannot find symbol speicherBuch.write((char)name.nextLine(name)); 
^ 
symbol: variable name
location: class Buch 
--
Buch.java:35: error: cannot find symbol 
speicherBuch.write((char)name.nextLine(name)); 
^ 
symbol: variable name 
location: class Buch
--
3 errors

Ich benutze Windows 7 64bit (x64) und Java 1.7.0_09.
Wäre euch dankbar für eure Antworten 🙂
MfG jockyjoe
 
Zuletzt bearbeitet:
Wie kann ich das denn vergleichen? Ich möchte ja nur, dass der Benutzer einen Namen eingibt und anschließend dieser Name in eine Datei namens "buecher.txt" geschrieben wird. Wie meinst du das mit nextLine()? Wie heißt die Methode dann?
 
Ich würde dir raten bei zeichenorientierten Werten auch zeichenbasierende Streams zu verwenden. In dem Fall FileWriter. Über die kannst du ganz einfach einen String schreiben.
 
Nein.
Es ist aber vorteilhaft falls lange Zeit kein Schreibevorgang statt findet, damit die Ressourcen nicht unnötig gespeert bleiben.
Falls du aber 10 Bücher hintereinander schreiben willst würde ich das in einen Vorgang machen.
 
Bevor ich es vergesse: Nochmal danke für deine Antworten. :toll:
Habe meinen Code ein bisschen erweitert, sodass er jetzt bis zu 200 Büchern verwalten kann (und auch in eine Datei schreiben kann).
Java:
import java.util.Scanner;
import java.io.*;

public class Buch
{
	
	public static class sBuch
	{
		String name;
		String author;
		String ISBN;
		int anzSeiten;
		byte kapitel; //Optional
	}
	
	public static void main(String[] args) throws IOException
	{
		sBuch[] buch = new sBuch[200];
		Scanner sc = new Scanner(System.in);
		
		for(int i = 0; i < buch.length; i++)
		{
			buch[i] = new sBuch();
		}	
		int auswahl;
		
		String buecher = "buecher.txt"; //Zieldatei
		
		System.out.print("Daten werden in "+buecher+" geschrieben.\n"); 
		
		for(int i = 0; i < buch.length; i++)
		{
			FileWriter book = new FileWriter(buecher, true);
			PrintWriter pw = new PrintWriter(book, true);
			
			System.out.print("\nWas wollen Sie tun?\n" +
			"1 = Fortfahren\n2 = Beenden\nIhre Wahl: ");
			auswahl = sc.nextInt();

			if(auswahl == 1)
			{
				System.out.print("Name des Buches: ");
				buch[i].name = sc.nextLine();
				
				System.out.print("Name des Autors: ");
				buch[i].author = sc.nextLine();
				
				System.out.print("ISBN: ");
				buch[i].ISBN = sc.nextLine();
				
				pw.println();
				pw.println();
				book.write("Buch Nr. " + (i+1));
				pw.println();
				book.write(buch[i].name);
				pw.println();
				book.write(buch[i].author);
				pw.println();
				book.write(buch[i].ISBN);
				book.close();
				pw.println();
				pw.close();

				System.out.println("Fertig.");
			}
			
			else if(auswahl == 2)
			{
				System.out.print("Programm wird beendet.");
				System.exit(1);
			}
		}
		
		/*String buecher = "buecher.txt"; //Zieldatei
		
		FileWriter book = new FileWriter(buecher, true);
		PrintWriter pw = new PrintWriter(book, true);
		
		book.write(buch[0].name);
		pw.println();
		book.write(buch[0].author);
		pw.println();
		book.write(buch[0].ISBN);
		book.close();
		pw.println();
		pw.close();

		System.out.println("Fertig.");*/
	}
}

Allerdings habe ich immer noch ein Problem. Wenn ich kompiliere und "auswahl" den Wert 1 zuweise sieht das so aus:
http://www.java-forum.org/attachment.php?attachmentid=5386&stc=1&d=1353272264

die Datei sind dann so aus:
http://www.java-forum.org/attachment.php?attachmentid=5385&stc=1&d=1353272082

Ich hab echt keine Ahnung warum immer der Name des Buches übersprungen wird..
 

Anhänge

  • fehler2.png
    fehler2.png
    59,7 KB · Aufrufe: 49
  • fehler.png
    fehler.png
    59 KB · Aufrufe: 51
Habe noch eine Frage: Wieso gibt der Compiler mir eine "InputMismatchException" aus wenn ich z.B. für den Buchnnamen "Harry Potter und der Stein der Weisen" eingebe? Kann es sein, dass das zu viele Zeichen sind? Allerdings habe ich in dem Thread (http://www.java-forum.org/java-basi...ieviele-zeichen-string-maximal-speichern.html) gelesen, dass ein String maximal 2147483647 Zeichen aufnehmen kann.
Java:
import java.io.*;
import java.util.Scanner;

public class Buch
{
	
	public static class sBuch
	{
		String name;
		String author;
		String ISBN;
		int anzSeiten;
		String verlag;
		float preisf; //'f' kennzeichnet einen float
	}
	
	public static void main(String[] args) throws IOException
	{
		sBuch[] buch = new sBuch[200];
		Scanner sc = new Scanner(System.in);
		
		for(int i = 0; i < buch.length; i++)
		{
			buch[i] = new sBuch();
		}	
                
		int auswahl;
		File dir = new File(System.getProperty("user.dir"));
		String buecher = "buecher.txt"; //Zieldatei
		
		System.out.print("Daten werden in "+buecher+" im Verzeichnis ("+dir+")\ngeschrieben.\n"); 
		
		for(int i = 0; i < buch.length; i++)
		{
			FileWriter book = new FileWriter(buecher, true);
			PrintWriter pw = new PrintWriter(book, true);
			
			System.out.print("\nWas wollen Sie tun?\n" +
			"1 = Fortfahren\n2 = Beenden\nIhre Wahl: ");
			auswahl = sc.nextInt();

			if(auswahl == 1)
			{
				System.out.print("Name des Buches: ");
				buch[i].name = sc.next();
				
				System.out.print("Name des Autors: ");
				buch[i].author = sc.next();
				
				System.out.print("ISBN: ");
				buch[i].ISBN = sc.next();
				
				System.out.print("Anzahl der Seiten: ");
				buch[i].anzSeiten = sc.nextInt();
				
				System.out.print("Verlag: ");
				buch[i].verlag = sc.next();
				
				System.out.print("Preis: ");
				buch[i].preisf = sc.nextFloat();
				
				pw.println();
				pw.println();
				book.write("Buch: "+buch[i].name+" (Buch Nr. " + (i+1) + ")");
				pw.println();
				book.write("Name des Buches: " + buch[i].name);
				pw.println();
				book.write("Name des Autors: " + buch[i].author);
				pw.println();
				book.write("ISBN: " + buch[i].ISBN);
				pw.println();
				book.write("Anzahl der Seiten: " +buch[i].anzSeiten);
				pw.println();
				book.write("Verlag: " + buch[i].verlag);
				pw.println();
				book.write("Preis: " + buch[i].preisf);
				pw.println();
				book.close();
				pw.println();
				pw.close();

				System.out.println("Daten in "+buecher+" geschrieben.");
			}
			else if(auswahl == 2)
			{
				System.out.print("Programm wird beendet.");
				System.exit(1);
			}
			else
			{
				System.out.print("Falsche Eingabe! Exit.");
				System.exit(1);
			}
		}
		
		/*String buecher = "buecher.txt"; //Zieldatei
		
		FileWriter book = new FileWriter(buecher, true);
		PrintWriter pw = new PrintWriter(book, true);
		
		book.write(buch[0].name);
		pw.println();
		book.write(buch[0].author);
		pw.println();
		book.write(buch[0].ISBN);
		book.close();
		pw.println();
		pw.close();

		System.out.println("Fertig.");*/
	}
}
 
Zuletzt bearbeitet:
Wie benutze ich den denn? Etwa ungefähr so:
Java:
buch[i].name = sc.next().useDelimiter("");
Ich verstehe nicht wie ich dem Compiler klarmache, dass er weiter als das Leerzeichen lesen soll.
 
Sry, ist eine Spur komplizierter als ich anfangs angenommen habe. Bin nicht umbedingt ein Fan von Scanner.

[java=20]
Scanner sc = new Scanner(System.in);
sc.useDelimiter("\r\n|[\n\r\u2028\u2029\u0085]");
[/code]
 
Streams sind für binäre Lese/Schreibvorgänge (bytes) da. Reader/Writer für Zeichenbasierende (chars). Du kannst einen BufferedReader erzeugen, den du einen FileReader übergibst. Der kann von Haus aus mit readLine bis zum Zeilenende lesen.
 
Google, ein bischen lesen, viel ausprobieren, ab und zu auch fragen.
Wenn man es verwendet vergisst man es nicht mehr so leicht. (An eine #close die eine IOException throwt errinnert man sich ewig.)

Sobald du ein gröberes Grundwissen aufgebaut hast kannst du dir unter Beschreibungen etc. viel mehr vorstellen und sie assoziieren. Dann fällt das Verstehen auch viel leichter.
 
uah..was ist los ?

Also an der Stelle:

Java:
            FileWriter book = new FileWriter(buecher, true);
            PrintWriter pw = new PrintWriter(book, true);
            
            System.out.print("\nWas wollen Sie tun?\n" +
            "1 = Fortfahren\n2 = Beenden\nIhre Wahl: ");
            auswahl = sc.nextInt();

da wird die Zeile nicht zu Ende gelesen, sondern eben nur die hoffentlich eingegebene integer
danach würde ich vorschlagen
Code:
sc.nextLine();
, um die Zeile abzuschliessen.
Danach sollte dann auch das:
Java:
                System.out.println("Name des Buches: ");
                buch[i].name = sc.nextLine();
problemlos mit nem langen Titel aus mehreren Worten funktionieren, etwa nicht ?
 
Jop, du hast recht pappawinni. Klappt. Aber mit
Code:
sc.next();
geht es auch 😉
Ist es eigentlich egal ob ich
Code:
sc.next();
oder
Code:
sc.nextLine();
nehme? Gibt es da Unterschiede? Vorteile/Nachteile?
 
Zuletzt bearbeitet:
Scanner.next() liest nur bis zum nächsten delimenter ... nextLine() sucht aber nach "\n" , "\r\n" , "\r" ... also nach dem nächsten zeilenumbruch
 
Naja, aber dafür wurde ja dann..
Code:
sc.useDelimiter("\r\n|[\n\r\u2028\u2029\u0085]");
eingesetzt.
Das macht das dann wieder gleicher...
 

Neue Themen


Zurück
Oben