Welchen Reader?

Status
Nicht offen für weitere Antworten.

mobile

Bekanntes Mitglied
HI,

stehe hier vor einem kleinen Problem. Ich möchte aus einer Datei einen Text einlesen. Habe das grad mit einem BufferedReader zusammen mit FileReader und einmal nur mit FileReader gemacht. Erfüllen zwar beide Ihren Zweck aber ich habe da so ein paar Zweifel.

Ich muss einmal nur Zeilen einlesen, in denen nur 1 Wort steht, wäre ja das mit dem BufferedReader perfekt für, da würde es auch noch klappen, mit dem was noch kommt, aber dazu gleich mehr, der Text wird dann in einer ArrayList gespeichert. Dann habe ich eine Liste mit den ganzen Wörtern.

Dann muss ich aber einen zusammenhängenden Text aus einer Datei einlesen. Dieser soll aber Wort für Wort eingelesen werden und jedes Wort soll mit den Wörtern aus der ArrayList verglichen werden, so ne Art Rechtschreib Prüfung.

Gehen die Reader die ich da genommen habe oder muss ich das irgendwie anders machen? Mir ist grad aufgefallen eigentlich muss ich ja beide Dateien Wort für Wort lesen, da ich ja einzellne Wörter in die Liste speichern will.

Könnte man das nich so machen, dass man vielleicht irgendwie sagt, wenn der FileReader auf ein Leerzeichen stößt soll er die gelesenen Zeichen zurück gehen, diese dann als String speichern (natürlich richtig rum) und diesen String kann ich dann in die ArrayList speichern und auch später mit den Wörter aus der dann vorhandenen Liste vergleichen.

Geht das vielleicht so in der Art? Also so das man von Leerzeichen zu Leerzeichen lesen lässt, sich den Abschnitt irgendwie merkt ihn dann noch mal einließt und ds Wort dann als String speichern, wenn das geschen ist geht es an der Stelle in dem Text weiter, also müsste man sich auch noch merken können, wo man grade war. Das geht aber glaub ich mit Blockieren oder so.

so hoffe ihr könnt mir ein wenig helfen!

Vielelicht noch mal kurz zusammen gefasst.

1. Aus einer Datei Worter einlesen (in jeder Zeile steht eins)
2. Gelesenes Wort in eine ArrayList speichern

Das war der erste Teil, wobei es mir nur um das einlesen geht

3.Aus einer neuen Datei einen zusammenhängenden Text Wort für Wort lesen
4.Jedes Wort mit denen aus der ArrayList vergleichen.
5.Dann im Text fortfahren

Wie gesagt mir geht es nur um das richtige einlesen, der Rest kommt vielleicht später :)

Danke euch sehr für hilfe!
 

Marcel_Handball

Bekanntes Mitglied
Dieses Programm trennt die einzelnen Wörter einer Textdatei (müssen halt nur noch in eine ArrayList rein geschrieben werden):
Code:
import java.io.*;

public class Test{

   public static void main(String args[]) {
      
      Reader r = null;
      int zahl=1;
      String wort="";

      try{r = new FileReader("original.txt");
         
         for(int c; ((c = r.read()) != -1);){
        	 if((char) c!=' ' && (char) c != '\n' && (char)c != '.' && (char)c !=','){wort+=(char)c;}
               else{
            	   if(wort!=""){System.out.println(zahl +" "+ wort); zahl++; wort="";}}   
         }
         System.out.println(zahl +" " +wort);
         
      }catch(IOException e){System.err.println("Fehler beim Datenaustausch");}
      finally{
         if(r != null){try{r.close();}catch(IOException e){}}
      }
      
   }
}
 

mobile

Bekanntes Mitglied
danke für deine schnelle Antwort. Habe das inzwischen so geregelt, kann man das auch vertreten?

Code:
try {
			/**FileReader mit einzulesender Datei erzeugen*/
			FileReader f = new FileReader(datei);
			
			/**Speichert Wert aus dem Text als int*/
			int c;
			
			/**Speichert den eingelesenden Text*/
			String text = "";
			
			/**Die Datei wird komplett abgearbeitet und nach und nach in text geschrieben*/
			while((c = f.read()) != -1) {
				text += (char)c;
			}
			
			/**Erzeugt StringTokenizer mit dem Text aus text*/
			StringTokenizer st = new StringTokenizer(text);
			
			/**Eingelesener Text wird zerlegt und dann mit Trennung an Leerzeichen ausgegeben*/
			while(st.hasMoreTokens()) {
				System.out.println(st.nextToken());
			}
			
			/**Datei wird wieder geschlosssen*/
			f.close();
		}
		catch(IOException e) {
			System.out.println("***Fehler beim Einlesen der Datei***");
		}

Vielleicht etwas viel Kommentar :)
 

kleiner_held

Top Contributor
Nur so als Tip: statt
Code:
String text = "";
while((c = f.read()) != -1) {
    text += (char)c;
}
ist
Code:
char[] buffer = new char[1024];
StringBuilder builder = new StringBuilder();
int length;
while((length = f.read(buffer)) != -1) 
{
     builder.append(buffer, 0, length);
}
String text = builder.toString();
wesentlich performanter.

Ansonsten gibt es für deine Anforderungen sicherlich viele verschiedene Lösungsmöglichkeiten. Ich würde aus Gründen der Wiederverwendbarkeit wahrscheinlich einen eigenen FilterReader schreiben.
 

Wildcard

Top Contributor
Und noch performanter ist es den StringBuilder in der richtigen Größe zu initialisieren :wink:
 

kleiner_held

Top Contributor
Und woher bekommt man die?
Man kann zwar File.length() verwenden, aber das ist eher nur ein Richtwert, da das die Länge in byte ist. Je nach Encoding ist die Länge des gelesenen Strings dann unterschiedlich. Aber du hast recht, in diesem Anwendungsfall ist so ziemlich jeder Wert besser als die defaultmäßig eingestellten 16 chars. (fast jeder ;-) )
 

Wildcard

Top Contributor
Da hast du natürlich recht. Sofern keine genaueren Informationen vorliegen (und die Größe im Rahmen ist) würde ich file.length als Richtwert nehmen.
 
G

Guest

Gast
habe jetzt ein neues Problem. Kann jetzt zwar alles einlesen richtig in meine Liste speichern, darin auch einfügen, das ganze dann auch sortieren, aber jetzt soll ich ja noch ne ausgabe.txt schreiben. Die soll ja auch bisschen gut aussehen. Den Text lese ich so ein:

Code:
try {
			/**FileReader mit einzulesender Datei erzeugen*/
			BufferedReader f = new BufferedReader(new FileReader(getDatei()));
			String line;
			
			/**Die Datei wird komplett abgearbeitet und nach und nach in text geschrieben*/
			while((line = f.readLine()) != null) {
				text += "\n" + line;
			}
			f.close();
		}
		catch(FileNotFoundException e) {
			System.out.println("***Fehler - Datei konnte nicht gefunden werden***");
		}
		catch(IOException e) {
			System.out.println("***Fehler - Datei konnte nicht eingelesen werden***");
		}
		finally {
			return text;
		}

Dann habe ich ja in text meinen kompletten text. Der enthält ja eigentlich auch Zeilenumbrüche, aber die sind dann irgendwie weg. Wie kann ich denn ein text gleich mit Zeilenumbrücheneinlesen, trotzdem dann noch schritt für schritt auf jedes Wort zugreifen (jetz mit StringTokenizer) und dann am Ende alles wieder so mit richtigen Zeilenumbrüchen in eine Date schreiben?
 
G

Guest

Gast
Also was brauche erstmal einen sauberen Reader, darf aber nur Java Collections Frameworks verwenden, mit dem ich aus einer Datei einlesen kann, mit richtigen Leerzeichen und auch mit den Zeilenumbrüchen. Es müssen damit 2 dateien eingelesen werden. Einmal stehe in jeder Zeile nur ein Wort, da muss ich dann jedes Wort in meine Liste speichern und einmal ist ein normaler zusammen hängender Text mit mehreren Zeilenumbrüchen und mehreren Wörtern in einer zeile. Die Wörter muss ich dann mit denene aus meiner Liste vergleichen, wenn sie in der Liste sind, sollen sie in die ausgabe.txt geschrieben werden, aber auch eben wieder mit den Zeilenumbrüchen an der richigen Stelle.

So soll das mal aussehen!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Welchen Packager soll ich verwenden. Allgemeine Java-Themen 7
B Mit welchen Datentypen und Strukturierung am Besten dutzende Baccaratspiele Shcritt für Schritt durchsimulieren? Allgemeine Java-Themen 26
S Interface Welchen Interface Stil favorisiert ihr? (usability) Allgemeine Java-Themen 17
J Welchen Obfuscator nehmen? Allgemeine Java-Themen 11
D welchen line brak benutzt ein geg. textfile Allgemeine Java-Themen 3
H String - Hat welchen Zeichensatz? Allgemeine Java-Themen 6
B Log4j --- Welchen Appender, wie konfigurieren Allgemeine Java-Themen 3
B welchen port muss ich angeben? Allgemeine Java-Themen 11
F Welcher Datentyp in welchen casten? Allgemeine Java-Themen 11
K Welchen Editor? Allgemeine Java-Themen 31
N Ermitteln welchen Typ ein "Object"-Objekt enthält Allgemeine Java-Themen 11
S welchen editor Allgemeine Java-Themen 5
S Welchen Editor soll man für Graphische lösungen benutzen Allgemeine Java-Themen 2
Master3000 Java Konsole über Buffered Reader Zeilenweise auslesen ? Allgemeine Java-Themen 26
Joker4632 Klassen Buffered Reader liest die Leerzeichen am Zeilen Ende nicht mehr Allgemeine Java-Themen 2
Tausendsassa Ycad dxf Reader/Writer Allgemeine Java-Themen 8
B Input/Output BufferedWriter/Reader replace line Allgemeine Java-Themen 6
nrg Spezieller gepufferter Reader Allgemeine Java-Themen 2
D Datentypen Reader/InputStream wiederverwenden? Allgemeine Java-Themen 11
X Java Log Reader empfehlungen? Allgemeine Java-Themen 2
nrg new Reader(dateiname) und getResourceAsStream Allgemeine Java-Themen 17
S API File Reader Allgemeine Java-Themen 3
P PDF öffnen mit Acrobat Reader Allgemeine Java-Themen 9

Ähnliche Java Themen

Neue Themen


Oben