PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit dem Anlegen von Textdateien



Tinobee
02-01-2007, 22:47
hallo, ich bin java-anfänger und auf der suche nach einer lösung für mein problem.

ich möchte gern texte analysieren und per char-vergleich auf die möglicherweise verwendete sprache (engl, deutsch, span. rus. usw.) schließen.

dazu hab ich vor, einen benutzer entweder eine textdatei mit inhalt als quelle angeben oder eine neue textdatei anlegen und per eingabestrom mit text füllen zu lassen. doch da hänge ich auch schon fest. ich schaffe es partout nicht, dass eine vorhandene datei angenommen und zu testzwecken ausgegeben wird noch dass eine neue datei angelegt und zu testzwecken ausgegeben wird. das problem liegt bei den pfaden. es klappt weder mit einem absoluten pfad auf die vom benutzer angelegte datei noch mit in hochstriche gesetzten dateinamen als standardlink auf das source folder. ferner möchte ich den nutzer nicht wirklich nötigen, seine datei immer ins source folder zu packen. aber für den anfang soll das trotzdem erstmal so sein. später würde ich dann noch versuchen, mit dateisuche zu arbeiten.

ich poste hier mal meinen aktuellen code in der hoffnung dass man mir die augen öffnet, denn ich finde meine fehler einfach nicht.


import java.io.*;

public class Sprachidentifizierung {

public static void main(String[] args) throws IOException, FileNotFoundException, Exception {

int c, alle = 0, keine = 0;
int[] alphabet = new int[26];
String dateiName;

InputStreamReader benutzerEingabe = new InputStreamReader( System.in );
BufferedReader eingabePuffer = new BufferedReader( benutzerEingabe );
PrintStream konsolenAusgabe = new PrintStream( System.out, true );
InputStream inhalt = null;

konsolenAusgabe.print("\nHallo, möchten Sie <1> eine vorhande Textdatei öffnen oder <2> eine neue erstellen? ");
int auswahl = Integer.parseInt( eingabePuffer.readLine());
if( auswahl == 1 )
{
konsolenAusgabe.println("Bitte sorgen Sie dafür, dass sich Ihre Textdatei im gleichen Verzeichnis" +
" wie auch das Javaprogramm befindet!");
konsolenAusgabe.println("Geben Sie nun bitte den Namen der Textdatei mit dem Suffix \".txt\" ein!");
dateiName = eingabePuffer.readLine();
inhalt = new FileInputStream( "F:/Eclipse Projekte/Klausur Programmierung 1 - Praxis/src/" + dateiName );
}
else
{
konsolenAusgabe.print("Wie soll Ihre Textdatei heißen? ");
dateiName = eingabePuffer.readLine() + ".txt";
File neueDatei = new File( "C:/" + dateiName );
konsolenAusgabe.println("Geben Sie bitte jetzt Ihren Text ein!");
BufferedWriter dateiSchreibPuffer = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream( neueDatei, true )) );
// FileOutputStream(String name, boolean append)
// creates an output file stream to write to the file with the
// specified name --> true, damit text an bereits vorhandenem
// angefügt wird anstatt diesen zu überschreiben

String neueEingabe = eingabePuffer.readLine();
dateiSchreibPuffer.write( neueEingabe );
dateiSchreibPuffer.newLine();
dateiSchreibPuffer.close();
}

Reader dateiInhalt = new FileReader( "C:/" + dateiName );
konsolenAusgabe.println( dateiInhalt ); // zum testlesen des inhaltes

}

}

diese version gibt bei auswahl <1> folgendes aus:

java.io.FileInputStream@182f0db

bei <2> klappt alles bis auf das auslesen und auf der konsoleausgeben. da bekomme ich ausgegeben java.io.FileReader@192d342.

selbst wenn ich aus

Reader dateiInhalt = new FileReader( "C:/" + dateiName + ".txt" );

die zeile

FileReader dateiInhalt = new FileReader( "datei.txt" );

mache, und damit auf eine sich im source folder dieses programmes befindende datei.txt verweise, wird diese nicht geöffnet.
da komm ich grad überhaupt nicht mit klar. könnt ihr mir helfen?

vielen dank schonmal im voraus ...

grüße,

tinobee

EDIT: Code nachträglich in CODE-Tags gesetzt ... (danke für den hinweis)

mehlvogel
03-01-2007, 08:55
Erstmal, um Quelltext zu posten verwende doch bitte die [ code] Tags - das macht das ganze etwas übersichtlicher.

Zu deinem eigentlichen Problem: Du musst natürlich auch die Zeichen aus dem FileReader rausholen und ausgeben. Ich denke ein Tutorial was sich damit beschäftigt wäre nicht ganz verkehrt, eines gibt es zum Beispiel in dem Buch Java ist auch eine Insel (http://www.galileocomputing.de/openbook/javainsel6/javainsel_12_003.htm#mjf9500d4206599d13f489597170f ae81c).
Schau dir auch gleich den BufferedReader an, der solche Zugriffe erheblich beschleunigt.

Tinobee
05-01-2007, 15:26
ich habe mir jetzt einiges an informationsquellen angeschaut und bin nach wie vor net viel schlauer. diese vielen versionen von readern und writern bringen mich durcheinander. aktuell arbeite ich an einer überarbeiteten version meines programms und treffe dabei hinsichtlich des auslesens einer datei auf ein problem, für das ich mittels api, galileo und auch meines buches "sprechen sie java" keine lösung finde.

ich habe eine methode geschrieben, die den text aus einer textdatei nimmt und dann buchstabe für buchstabe analysiert. das ganze läuft über den FileReader und steht in einer while-schleife. allerdings möchte ich zuvor gern den gesamten text der datei ausgeben lassen. das klappt auch mit diesem code.

static void liesDateiAus () throws FileNotFoundException, IOException, Exception {
String fileName = benutzerEingabe.readLine();
FileReader readFile = new FileReader( "C:/" + fileName + ".txt" );
//FileInputStream readFile = new FileInputStream( "C:/" + fileName + ".txt" );
int[] alphabet = new int[26];
int zähler = 0, buchstabe = 0; // buchstabe = der ASCII Wert jedes Buchstaben

konsolenAusgabe.println( "\nDateiinhalt:\n" );
for ( int chr; ( chr = readFile.read() ) != -1; ) {
System.out.print( (char) chr );
}
ABER wenn ich das tue, kann ich die ausgabe nicht formatieren. ich kann zum. beispiel nicht schreiben:

System.out.print( "\""(char) chr "\"");
denn wenn ich das so mache, wird jeder einzelne buchstabe in hochstriche gesetzt.

daher hatte ich die idee, mit dem PrintStream den inhalt aus einem zuvor angelegten String zu holen und einfach ausgeben zu lassen.

das problem hierbei ist, ich krieg die pipe einfach nicht richtig zusammengebaut.

bislang kannte ich nur das streaming nur über die benutzereingabe auf der konsole per InputStreamReader (Sys.in) --> BufferedReader (ISR) --> PrintStream (Sys.out)

aber welche StreamReader muss ich wie verknüpfen, um den inhalt aus der datei in einen string packen und nachher die ausgabe gescheit formatieren zu können?

tinobee

Waxolunist
05-01-2007, 15:47
Sry, ich weiß nicht ob du dir die Insel wirklich durchgelesen hast die dir mehlvogel empfohlen hat. Aber wenn du eine vorgekaute Lösung möchtest, hier.

Aber so liest man normalerweise eine Datei ein.



import java.io.BufferedReader;
import java.io.FileReader;

public class WriteFileOut {

public static void main(String[] args) {
try {
BufferedReader in = new BufferedReader(new FileReader(args[0]));
String line = null;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}


Das gibt die Datei auf System.out aus die du im Aufruf angegeben hast. Exceptionhandling kannst du dir selber zusammenreimen.

Wenn du den String formatieren möchtest musst du nur die line + ein newline Zeichen in einen StringBuffer einlesen.

Das newline-Zeichen bekommt man am besten mit



String newline = System.getProperty("line.separator");

lg, christian

Tinobee
05-01-2007, 16:21
[quote]ich weiß nicht ob du dir die Insel wirklich durchgelesen hast die dir mehlvogel empfohlen hat[quote]
das habe ich ... und zwar mehrfach. warum sollte ich es auch nicht getan haben, wenn ich auf der suche nach einer lösung bin!?

aber wie eingangs erwähnt, bin ich anfänger und hab gerade mal 2 monate mit java zu tun. so dass einiges an code dort für mich nicht lesbar bzw. verständlich ist. das fehlerhandling ist mir z.b. völlig neu. aber darum geht es ja auch nicht. jedenfalls sind die dort präsentierten beispielcodes bei meiner umsetzung nicht in der lage gewesen, meine vorstellung der formatierung entsprechend umzusetzen.

was deinen code betrifft, so danke ich für deinen vorschlag. ich verstehe daran nicht, ob du die parameter in der FileReader signatur einfach unberührt gelassen hast, so wie sie in der api stehen, oder ob das so gewollt war. wenn ja, dann wüsste ich gern anfängergerecht, warum du das (so) verwendest bzw. warum du da einen arrayindex reingebaut hast.

greets, tinobee

Waxolunist
05-01-2007, 16:40
Das ist die main-Methode.

public static void main(String[] args) {

args ist hier der Array der Übergabeparameter.

Wenn du nun mit

java WriteFileOut C:\a.txt hjds fjka fdsahjsa

das Programm aufrufst, so kannst du die Übergabeparameter mit args[0] bis args[3] abrufen.

args[0] ist die datei die ich ausgeben möchte.


Ad Exception-Handling:
Bei jeder Methode in der API steht dabei welche Exceptions geworfen werden können und weshalb:

Der Konstruktor von FileReader zeigt z.B. die Exception FileNotFoundException

http://java.sun.com/j2se/1.4.2/docs/api/java/io/FileReader.html#FileReader(java.lang.String)

lg, christian

mehlvogel
05-01-2007, 16:48
Also das arg[0] was waxolunist benutzt ist der Parameter der main Methode also der erste von der Kommandozeile übergebene Parameter.

Aber fangen wir von vorne an. Wenn du eine Datei lesen möchtest, brauchst du, wie du erkannt hast, einen FileReader.



FileReader fr = new FileReader(dateiname);


Diesen kannst du schön in einen BufferedReader packen, da dieser sehr viel performanter ist.



BufferedReader br = new BufferedReader(new FileReader(dateiname));


Um das was du liest in einen String zu speichern, initialisierst du zunächst einen String.



BufferedReader br = new BufferedReader(new FileReader(dateiname));
String s = new String();


Du brauchst weiterhin einen String, in dem du die aktuelle Zeile speicherst (siehe unten):



BufferedReader br = new BufferedReader(new FileReader(dateiname));
String s = new String();
String line = new String();


Das auslesen aus der Datei geht mit dem BufferedReader bequem über seine Methode readLine(), die eine Zeile ausliest und zurückgibt. Sie gibt null zurück sobald sie am Ende der Datei ist. Das auslesen wird uns also die jetzt hinzugefügte whiel Schleife bringen:



BufferedReader br = new BufferedReader(new FileReader(dateiname));
String s = new String();
String line = new String();

while ((line = br.readLine()) != null) {
s += line + System.getProperty("line.separator");
}


So, betrachten wir zunächst die Abbruchbedingung der While Schleife:



(line = br.readLine()) != null


Sieht etwas kryptisch aus, macht aber nur folgendes:
Zunächst wird das Ergebniss von br.readLine() in line gespeichert.
Danach wird geprüft ob line == null ist.
Sobald line == null bricht die Schleife ab.

In der Schleife wird dann an den String s die aktuelle Zeile und ein Zeilenendzeichen hinzugefügt. Letzteres weil readLine() es rausfallen lässt.

Ich hoffe das hat dir etwas geholfen. Generell hilft es mir, wenn ich mir ne kleine main Methode baue, in dem ich mit den Sachen die ich nicht verstehe oder nicht weiß wie sie funktionieren (wie Streams) seperat vom eigentlichen Projekt mit herumexperimentieren kann.

Tinobee
05-01-2007, 17:10
Generell hilft es mir, wenn ich mir ne kleine main Methode baue, in dem ich mit den Sachen die ich nicht verstehe oder nicht weiß wie sie funktionieren (wie Streams) seperat vom eigentlichen Projekt mit herumexperimentieren kann.
*hehe* so handhabe ich das auch. allerdings bleibt das problem da bestehen, weil nach wie vor die kenntnis fehlt, wenn sie fehlt.

danke für die gute erklärung! :) eine unklarheit bleibt aber noch:

was heißt das
System.getProperty("line.separator")greets, tinobee

peschmae
05-01-2007, 17:42
System ist so ein Ding das gewisse Eigentschaften zum aktuellen System auf dem das Programm gerade läuft beinhaltet.

Mit dem konkreten Aufruf findest du raus, was genau der Zeilentrenner auf der aktuellen Plattform ist.
Der Unterscheidet sich nämlich von Unix/Linux (lf) zu Windows (crlf) zu Mac (cr).

MfG Peschmä