Input/Output Testen ob Datei leer

henpara

Bekanntes Mitglied
Hallo,
ich habe eine Methode geschrieben, die testen soll, ob eine Datei leer ist:
Java:
	private boolean isEmpty(File file) throws IOException {
		File test = file;
		FileReader fr = new FileReader(test);
		BufferedReader br = new BufferedReader(fr);
		String empty = br.readLine();
		br.close();
		fr.close();
		if (empty == null)
			return true;
		else if (empty.isEmpty())
			return true;
		else 
			return false;
	}

Wenn ich das mit einer Test-datei mache, funktioniert auch alles einwandfrei.
Wenn ich sie in mein Programm einbinde, werden aber alle Dateien immer als empty angezeigt, obwohl sie definitiv "vorher" nicht leer waren.

Hier mal der Code der Klasse:
Java:
package common;


import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;

import log.Log;

public class Checks {
	ArrayList<String> dnafileList;
	ArrayList<String> dnafolderList;

	public Checks ( ) {
		
		dnafileList = new ArrayList<String>();
		dnafolderList = new ArrayList<String>();

		fillArrayLists();
		checkDnaDis();
	}
	private void fillArrayLists() {

		dnafileList.add(GlobalVariables.getVal(Programms.DnaDis, "OutputFile"));

		dnafolderList.add(GlobalVariables.getVal(Programms.DnaDis, "SqlPath"));
		dnafolderList.add(GlobalVariables.getVal(Programms.DnaDis, "OutPath"));
		dnafolderList.add(GlobalVariables.getVal(Programms.DnaDis, "LastOutPath"));
	}
	
	
	
	
	private void checkDnaDis() {
		// TODO Auto-generated method stub
		for (Iterator<String> iter = dnafolderList.iterator(); iter.hasNext();) {
			String file = iter.next();
			checkfolder(new File(file));
		}
		for (Iterator<String> iter = dnafileList.iterator(); iter.hasNext();) {
			String file = iter.next();
			checkfile(new File(file), common.Programms.DnaDis);
		}
	}
	private boolean checkfolder (File outfolder) {
		//Alle Ordner checken und ggf neu erstellen (Out-Folder):
		if (!outfolder.exists()) {
			outfolder.mkdir();
			return true;
		}
		return false;
	}
	private boolean checkfile(File file, common.Programms pg) {
		if (!file.exists()) {
			try {
				file.createNewFile();
				return true;
			} catch (IOException e) {
				Log.log("Logfile " + file + " konnte nicht erstellt werden" + GlobalVariables.getVal("lsep"));
				e.printStackTrace();
				return false;
			}
		} else {
			System.out.println(file + " existierte schon, check ob leer!");
			try {
				if (pg != null && !isEmpty(file)) {
					moveFile(file, pg);
				}
				System.out.println(isEmpty(file)); //hier wird bei isEmpty immer true geliefert, egal ob die Datei leer ist oder nicht.
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			//System.out.println(file.getAbsolutePath() + " wird nun gelöscht");
			try {
				file.delete(); // Das löschen und neu erstellen soll NACH dem verschieben passieren.
				file.createNewFile();
				return true;
			} catch (IOException e) {
				Log.log("Logfile " + file + " konnte nicht erstellt werden" + GlobalVariables.getVal("lsep"));
				e.printStackTrace();
				return false;
			}
		}
	}
	private boolean isEmpty(File file) throws IOException { //funktionert in Testprogramm
		File test = file;
		FileReader fr = new FileReader(test);
		BufferedReader br = new BufferedReader(fr);
		String empty = br.readLine();
		br.close();
		fr.close();
		if (empty == null)
			return true;
		else if (empty.isEmpty())
			return true;
		else 
			return false;
	}
	private void moveFile(File file, Programms pg) { //kann noch fehlerbehaftet sein, da die Methode noch nie erfolgreich aufgerufen wurde, hab ich dort noch nicht getestet.
		System.out.println("moveFile wird aufgerufen mit " + file);
		switch (pg) {
		case DnaDis: {
			//Dateien verschieben
			//Dateien über Java zu verschieben ist relativ einfach, nämlich zum Beispiel so:
			try {
				File quellDatei = new File(file.getAbsolutePath());
				System.out.println(file.getAbsolutePath());
				File zielDatei = new File(common.GlobalVariables.getVal(common.Programms.DnaDis, "LastOutPath") + file.getName());
				quellDatei.renameTo(zielDatei);
				//file.createNewFile();
				Log.log(file.getName() + " erfolgreich gespeichert nach " + zielDatei.getAbsolutePath());
			} catch (Exception e) {
				e.printStackTrace();
			}
			break;
		}
		case MTx: {
			//Dateien verschieben
			//Dateien über Java zu verschieben ist relativ einfach, nämlich zum Beispiel so:
                       // wie man sieht hab ich das Verschieben ausm Netz Copy-Pasted.
			try {
				File quellDatei = new File(file.getAbsolutePath());
				File zielDatei = new File(common.GlobalVariables.getVal(common.Programms.MTx, "LastOutPath") + file.getName());
				quellDatei.renameTo(zielDatei);
				//file.createNewFile();
				Log.log(file.getName() + "erfolgreich verschoben nach " + zielDatei.getAbsolutePath());
			} catch (Exception e) {
				e.printStackTrace();
			}
			break;
		}
		case RepMM: {
			//Dateien verschieben
			//Dateien über Java zu verschieben ist relativ einfach, nämlich zum Beispiel so:
			try {
				File quellDatei = new File(file.getAbsolutePath());
				File zielDatei = new File(common.GlobalVariables.getVal(common.Programms.RepMM, "LastOutPath") + file.getName());
				quellDatei.renameTo(zielDatei);
				//file.createNewFile();
				Log.log(file.getName() + "erfolgreich verschoben nach " + zielDatei.getAbsolutePath());
			} catch (Exception e) {
				e.printStackTrace();
			}
			break;
		}
		case Xtractor: {
			//Dateien verschieben
			//Dateien über Java zu verschieben ist relativ einfach, nämlich zum Beispiel so:
			try {
				File quellDatei = new File(file.getAbsolutePath());
				File zielDatei = new File(common.GlobalVariables.getVal(common.Programms.Xtractor, "LastOutPath") + file.getName());
				quellDatei.renameTo(zielDatei);
				//file.createNewFile();
				Log.log(file.getName() + "erfolgreich verschoben nach " + zielDatei.getAbsolutePath());
			} catch (Exception e) {
				e.printStackTrace();
			}
			break;
		}
}
	}
}

Die Hoffnung stirbt zu Letzt, ich finde einfach nicht, warum das isEmpty() im einer Test-Main- Umgebung problemlos funktioniert, aber im Programm eingebettet eben nicht 🙁.

Danke schonmal für hilfreiche Antworten

mfG
henpara

€Ich lese absichtlich nur die erste Zeile, weil die Dateien, die es betrifft, sind entweder "ganz" befüllt oder garnicht (sind nur Textdateien).

@Guardi: Ich versteh dich nicht ganz, zum "moveFile()" kommt er doch garnicht erst, weil isEmpty immer true zurückliefert.
 
Zuletzt bearbeitet:
Da hast du natürlich Recht, hab das beim Überfliegen übersehen.
Schau mal bitte nach was der Grund dafür ist, dass true zuürckkommt.
Also ob empty = null oder ob is.Empty = true der Grund ist.
 
Da hast du natürlich Recht, hab das beim Überfliegen übersehen.
Schau mal bitte nach was der Grund dafür ist, dass true zuürckkommt.
Also ob empty = null oder ob is.Empty = true der Grund ist.
Das kann ich dir sagen: Ich lass mir den String ja ausgeben und der is immer null.
also gibt empty = null den Ausschlag.

mfg und thx schonmal fürs drüberschauen!
 
Sicher, dass dort ausschliesslich Textdateien geprüft werden sollen oder aus welchem Grund wird dort FileReader verwendet? Also die Klasse File verfügt schon mal über die Methoden "isFile()" und "length()". Demnach könnte deine Methode so aussehen:
[Java]private boolean isEmpty(File file)
{
if(file != null) {
return file.isFile() && file.length() == 0;
}
return true;
}[/code]
 
Sicher, dass dort ausschliesslich Textdateien
Ja da bin ich sicher.

Werd deinen Hinweis mal umsetzen -thx dafür.

€Habs umgesetzt, wieder das gleiche Problem: In meiner TestKlasse mit Main Methode funktioniert das ganze einwandfrei, im Programm (Klasse siehe erster Post) liefert er bei der gleichen Datei trotzdem das andere falsche Ergebnis.

Ich kapiers einfach nicht, ich änder doch an der Datei garnichts, wie kann einmal true und einmal false mit der gleichen Methode zurückkommen - richtig garnicht, leider seh ich nicht, wo der Unterschied ist, bzw. woher der Unterschied kommt 🙁
 
Zuletzt bearbeitet:
Okay, denn könnt's möglicherweise noch daran liegen, dass "file" nicht gefunden wird. In diesem Fall müssten absolute Pfade verwendet werden. In der Methode (meine Version oder deine ist dabei egal) müsste dann noch als erste Zeile
Java:
file = file.getAbsoluteFile();
eingefügt werden.
 
File nicht gefunden kann ich auch ausschließen, siehe auch die Klasse:
Java:
private boolean checkfile(File file, common.Programms pg) {
		if (!file.exists()) {
			try {
				file.createNewFile();
				return true;
			} catch (IOException e) {
				Log.log("Logfile " + file + " konnte nicht erstellt werden" + GlobalVariables.getVal("lsep"));
				e.printStackTrace();
				return false;
			}
		} else {
			System.out.println(file + " existierte schon, check ob leer!");
			try {
				if (pg != null && !isEmpty(file)) {
					moveFile(file, pg);
				}
				System.out.println(isEmpty(file));
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			//System.out.println(file.getAbsolutePath() + " wird nun gelöscht");
			try {
				file.delete();
				file.createNewFile();
				return true;
			} catch (IOException e) {
				Log.log("Logfile " + file + " konnte nicht erstellt werden" + GlobalVariables.getVal("lsep"));
				e.printStackTrace();
				return false;
			}
		}
	}

Und die Datei wird schon mit relativer Pfadangabe eingegeben.
 
"schon mit relativer Pfadangabe" ist gut 😉 deswegen solltest du es ja mit den absoluten Pfaden testen. Ich nehme mal stark an, dass diese auf verschiedene Dateien zeigen.
 
Was spricht dagegen in isempty(...) einfach mal den Pfad auf die Konsole auszugeben,
um zu sehen welche Datei tatsächlich geprüft wird?

VG ROlf
 
Was spricht dagegen in isempty(...) einfach mal den Pfad auf die Konsole auszugeben,
um zu sehen welche Datei tatsächlich geprüft wird?
wird doch schon getan

Java:
System.out.println(file + " existierte schon, check ob leer!");
und es sind die richtigen Dateien, das ist ja das komische :/

Es wird ja sogar vorher geprüft ob die Dateien überhaupt existieren, und das tun sie.

Es gibt also die Dateien, aber irgendwie müssen sie vorher gelöscht oder sonstwie verändert worden sein, anders kann ich mir das nicht erklären, daß isEmpty leer anzeigt, obwohl vor dem Start des Programms die dateien nicht leer sind.
 
Naja da empty==null kann es nur daran liegen dass der BufferedReader nichts finden kann was er lesen könnte.
readLine liefer null wenn das Ende des Streams erreicht ist. Demzufolge sind deine Dateien wohl definitiv leer.

Vielleicht fängt das Problem ja schon damit an, dass checkFile IMMER false liefert.
 
"schon mit relativer Pfadangabe" ist gut deswegen solltest du es ja mit den absoluten Pfaden testen. Ich nehme mal stark an, dass diese auf verschiedene Dateien zeigen.
Beides probiert, beides hat in der Testklasse funktioniert.
Und in anderen Klassen schreibe ich in die Files und das funktioniert ja auch, also der File-String zeigt definitiv auf das richtige File.
 
Oh man sind wir eigentlich alle - und da schliesse ich mich keineswegs aus - blind? Okay... Guardi hat es ja bereits angedeutet. "moveFile()" ist das Problem! Da wird aus dem übergebenen Fileobjekt ein neues mit dem Namen "quelldatei" erstellt und dieses dann anschliessend per "renameTo()" umbenannt. Davon bekommt das ursprüngliche Fileobjekt natürlich herzlich wenig mit und behält deswegen auch den Namen der eben verschobenen Datei. Klar, dass "isEmpty()" auf das unveränderte Fileobjekt dadurch im Folgenden "true" liefert.
[JAVA=12] System.out.println(file + " existierte schon, check ob leer!");
try {
boolean empty = isEmptyFile(file);
if (pg != null && !empty) {
moveFile(file, pg);
}
System.out.println(empty);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}[/code]Versuch's halt so.
...und in Zukunft merken wir uns, dass ein Objekt des Typs File in keinster Weise mit der darin benannten Datei fest verbunden ist 😉
 

Neue Themen


Zurück
Oben