Datentypen Einlesen von char in Array schlägt unerwartet fehl

Semox

Bekanntes Mitglied
Liebes Forum

Ich habe eine Funktion geschrieben, die eine Textdatei mit 15k Zeichen in entsprechend viele zerlegen soll, wenn die max. erlaubte Anzahl 5k sind. Das sollten 3 sein.

Das Problem beginnt schon beim einlesen. Mittels einer Schleife lasse ich die Datei lesen, jedoch bricht die Schleife schon nach dem 4. Zeichen ab, obwohl ich bedingte, daß die read()-Funktion bis zum Dateiende (-1) lesen soll. Warum geht es nicht, wie ich das gemacht habe?

Java:
public static void aufspalten(String file) throws IOException {
		char[] cbuf = new char[4999];
		int dateien = 0;
		int off = 0;
		int len = 4999;
		int cBufSize = 0;
		String newFiles = "";

		FileReader fr = new FileReader(file);
		FileWriter fw;

		int n = 0; // Debug Krempel

		while (fr.read(cbuf) != -1) {
			cBufSize++;
			System.out.println(cbuf[n]); // Debug Krempel
			n++;
		}

		while (fr.read(cbuf) != -1) {
			if (cBufSize <= 4999) {
				// if (cbuf.length <= 4999) {
				System.out.println("<5000 Zeichen. Abbruch.");
				break;
			} else {
				newFiles = file + ++dateien;
			}

			fw = new FileWriter(newFiles);

			if (cBufSize >= 4999) {
				// if (cbuf.length >= 4999) {
				fw.write(cbuf, off, len);
				off += 4999;
			} else {
				len -= off;
				fw.write(cbuf, off, len);
			}
		}
		fr.close();
	}

Danke Euch und Grüße,
Semo
 
>fr.read(cbuf)

Diese Zeile liest 4999 char auf einmal rein.

In diese Schleife
Java:
        // reads 4999 chars at once !!!
        while (fr.read(cbuf) != -1) {
            cBufSize++;
        }
liest du schon x Mal 4999 Zeichen ein. Also in CBufSize steht dann wiviele male du gelesen hast.
Weiter zu lesen macht dann keinen Sinn mehr, Der Stream ist leer (-1). Also beim 2ten while ist nix mehr da.

EDIT:
als Bsp:
Java:
public static void main(String... _) throws Throwable  {
    StringBuilder builder = new StringBuilder(5001);
    for(int i  = 0 ; i < 5001;i++) {
        builder.append('a');
    }
    char[] cbuf = new char[4999];
    StringReader fr = new StringReader(builder.toString());
    
    // reads 4999 chars at once !!!
    int charsReaded = 0;
    while ( (charsReaded =fr.read(cbuf)) != -1) {
        System.out.println("Read: " + charsReaded);
    }
}
 
Zuletzt bearbeitet:
Hallo MüderJoe

Danke. Ich nahm an, daß die Buchstaben einzeln gelesen würden und ich somit eine Schleife bräuchte, um eine festgelegte Anzahl in das Array aufzunehmen. :bloed:

Das ändert natürlich alles.

Gruß,
Semo
 
Hallo zusammen

Ich habe den Code umgeschrieben. Er ist denke ich schon fast fertig, aber ich verstehe nicht, warum sich dann am Ende des Prozesses die vormals mit einem Buchstaben vollgeschriebene Datei komplett leer ist und keine Zeichen geschrieben werden. Ich bitte um Euren Rat...

Java:
public static void splitCharChain(String file) throws IOException {
		int partNo = 0;
		int zeichenAnz = 0;
		String part = file;
		int c = 0;

		FileReader fr = new FileReader(file);
		FileWriter fw = new FileWriter(file);

		while ((c = fr.read()) != -1) {
			if (partNo == 0) {
				file = part + partNo;
				fw = new FileWriter(file);
				fw.write(c);
			}
		
			fw.write(c);
			zeichenAnz++;

			if (zeichenAnz == 5000) {
				fw.close();
				zeichenAnz = 0;
				partNo++;
			}
			if (zeichenAnz != 5000) {
				fw.close();
				fr.close();
			}
		}
	}

Viele Grüße,
Semo
 
Hello again,

Trotz mehrerer weiterer Versuche habe ich nicht herausgefunden, warum nun das zeichenweise kopieren nicht funktioniert. Könnte mir bitte jemand den Fehler zeigen? Das Programm läuft sauber bis an die Stelle, wo eine Datei mit 15k Zeichen gefüllt und gespeichert wird.

Bei der Zerlegung jedoch ist dann am Ende die Originaldatei leer und es wurden keine neuen Teil-Dateien erstellt.

Liegt es daran, daß es eine Überschneidung von Prozessen gibt, die die Datei zerlegen will bevor sie geschlossen wurde? Ist sowas überhaupt denkbar oder hat da das OS seine Hände drauf, daß so etwas nicht passiert?

Anbei poste ich mal den gesamten Code des Programms:

Java:
import java.io.BufferedWriter;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;

public class SplitFile {

	private static BufferedReader br = new BufferedReader(
			new InputStreamReader(System.in));

	private static String file;

	public static void fillFileChars(String file) throws IOException {
		int count = 1;
		char c = 'a';
		BufferedWriter bW = new BufferedWriter(new FileWriter(file));
		// Datenfluss: Programm --> bWriter --> FileWriter --> Datei
		while (count <= 14999) {
			bW.write(c);
			bW.flush();
			count++;
		}
		bW.close();
	}


	public static void splitCharChain(String file) throws IOException {
		int partNo = 0;
		int zeichenAnz = 0;
		String part = file;
		int c = 0;

		FileReader fr = new FileReader(file);
		FileWriter fw = new FileWriter(file);

		while ((c = fr.read()) != -1) {
			if (partNo == 0) {
				file = part + partNo;
				fw = new FileWriter(file);
				fw.write(c);
			}

			fw.write(c);
			fw.flush();
			zeichenAnz++;

			if (zeichenAnz == 5000) {
				fw.flush();
				fw.close();
				zeichenAnz = 0;
				partNo++;
			}
			if (zeichenAnz != 5000) {
				fw.flush();
				fw.close();
				fr.close();
			}
		}
	}

	public static void main(String[] args) throws IOException {
		System.out.println("****Datei mit 15k Zeichen erzeugen***");
		System.out.println("Bitte geben Sie die zu erzeugende Datei an: ");
		file = br.readLine();
		fillFileChars(file);
		System.out.println("Ok. Dieselbe Datei wird nun aufgeteilt.");
		splitCharChain(file);
		System.out.println("Fertig.");
	}
}

Danke, für Eure Hilfe.

Viele Grüße,
Semo
 

Zurück
Oben