# Dateien zeichenweise auslesen



## mhamp (12. Aug 2010)

Hallo zusammen!

Ich habe folgendes Problem:
Ich möchte eine Datei laden, die ich dann später zeichenweise auslesen möchte.
Vorzugsweise möchte ich dabei angeben an welcher Stelle der Datei begonnen werden soll auszulesen und wieviele Zeichen (ab Stelle A) eingelesen werden sollen.

Ich habe schon ein bisschen mit dem File, FileReader und FileInputStream Klassen herumprobiert, allerdings komme ich auf keinen grünen Zweig 

Ich wäre froh wenn mir jemand von euch einen Tipp geben könnte!
Danke


----------



## ProgX (12. Aug 2010)

poste mal vielleicht den Code den du bisher hast


----------



## mhamp (12. Aug 2010)

Danke für die schnelle Antwort 
Also ich hatte schon ein paar Dinge ausprobiert, und das ist der Quelltext der zur Zeit vorhanden ist..

Mir wird außerdem eine NullPointerException ausgegeben (siehe Ende des Post).


```
File f = new File("G:\\datei.dat");

        char cbuf[] = null;
        String wort = "";
        int zeichen = 0;

        try
        {
            FileReader fr = new FileReader(f);
            try
            {
                while(zeichen != -1)
                {
                    zeichen = fr.read(cbuf, 40, 32);

                    wort += cbuf;
                    System.out.println(wort);
                }

            }
            catch (IOException ex)
            {
                System.out.println("fehler1");
            }
        }
        catch (FileNotFoundException ex)
        {
            System.out.println("fehler2");
        }
```


```
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:129)
        at java.io.InputStreamReader.read(InputStreamReader.java:167)
        at lfsreplays.Hauptfenster.jButton1ActionPerformed(Hauptfenster.java:104)
        at lfsreplays.Hauptfenster.access$000(Hauptfenster.java:27)
        at lfsreplays.Hauptfenster$1.actionPerformed(Hauptfenster.java:57)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6263)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
        at java.awt.Component.processEvent(Component.java:6028)
        at java.awt.Container.processEvent(Container.java:2041)
        at java.awt.Component.dispatchEventImpl(Component.java:4630)
        at java.awt.Container.dispatchEventImpl(Container.java:2099)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
        at java.awt.Container.dispatchEventImpl(Container.java:2085)
        at java.awt.Window.dispatchEventImpl(Window.java:2478)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
ERSTELLEN ERFOLGREICH (Gesamtzeit: 0 Minuten 8 Sekunden)
```


----------



## Gast2 (12. Aug 2010)

Interessant zu wissen wäre was in Zeile 104 in Hauptfenster.java steht. Dort ist irgendwas null.


----------



## SlaterB (12. Aug 2010)

das dürfte Zeile 14 im geposteten Code entsprechen
> zeichen = fr.read(cbuf, 40, 32);

und das Buffer-Array ist null, was der Stream nicht so witzig findet


----------



## mhamp (12. Aug 2010)

Zeile 104 ist folgender Code:

```
zeichen = fr.read(cbuf, 40, 32);
```


----------



## ProgX (12. Aug 2010)

Ich hätts ein bisschen anders und vielleicht etwas schöner gemacht:


```
import java.io.*;

public class test{

	public static void main(String[] args) {
		
		File file = new File("versuch.txt");
		String text = "";
		char[] array;
		
		try {
			BufferedReader r = new BufferedReader(new FileReader(file));
			String line = "";
			
			while((line = r.readLine()) != null){
				text += line;
			}
			
			r.close();
		} catch (IOException e) {
			System.out.println("Exception: "+e.getMessage());
		}
		
		array = text.toCharArray();

		
		for(char c:array){
			System.out.print(c);
		}
	}
}
```

zum Schluss geb ich einfach das Array mit einer foreach Schleife aus


----------



## XHelp (12. Aug 2010)

Dir fehlen dann aber die Zeilenumbrüche


----------



## ProgX (12. Aug 2010)

tja, ein wenig wird er sich dann wohl selbst drum kümmern müssen, ich weiss ja nicht genau was er damit machen will! ;-)


----------



## mhamp (12. Aug 2010)

Okay,
ich danke erstmal für eure Hilfe!

Ich habe mich noch ein bisschen anders durchgewuselt und bin nun auf die Lösung gekommen, dass ganze mit einem BufferReader Objekt und der Methode read() zu lösen.
Diese Methode bietet auch die Möglichkeit nur bestimmte Zeichen auszulesen (also von Stelle A bis Stelle B).

Allerdings habe ich noch einen kleinen Stolperstein.
Die Signatur sieht folgendermaßen aus:

public int read(char[] cbuf, int off, int len);

Nun komme ich an der stelle "char[] cbuf" nicht weiter.
Was ist mit dem *cbuf - Destination buffer* gemeint?


Edit:

Okay, GIDF 

Habe es gerade rausgefunden: Lesen und Schreiben von Textdateien

Danke vielmals für eure  Hilfe!


----------



## ARadauer (12. Aug 2010)

dort wird hineingeschrieben... der rückgabewert ist die anzahl der gelesenen zeichen...

dein Problem war vorher, dass dein buffer null war, du musst ihn initialisieren... char cbuf[] = new char[32];


----------

