Letzte txt.Datei nicht geschrieben

  • Themenstarter Themenstarter Spellsleeper
  • Beginndatum Beginndatum
S

Spellsleeper

Gast
Hallo ich war mit meiner positiven Prognose etwas vorschnell.
Ich habe ein Programm geschrieben das als .txt extrahierte ERP-Objekte trennen soll.
Alles schön und gut,dies tut es auch soweit nur das beim letzten Objekt zwar die .txt-Datei
erstellt wird aber diese keinen Inhalt enthält. Könnt ihr mir sagen wie ich den Writer so beende
das diese Datei geschrieben wird?:bahnhof:


Java:
	public void read(String oldPath) {
		String temp;
		
		boolean objectEnd=false;
		boolean realEnd=false;
		File directory=new File("C:\\NavObjekte");
		if(!directory.exists()){
		directory.mkdir();}
		Writer writer = new Writer();

		try {
			BufferedReader br = new BufferedReader(new FileReader(new File(oldPath)));
			int emptyLines = 0;
			do {
				temp = br.readLine();
				
				
				
				if (temp.equals(null)) {
					emptyLines++;
				}
				if (temp.contains("OBJECT") && !(temp.contains(" OBJECT"))) {
					objectEnd=false;
					int index1=temp.indexOf(" ");
					int index2=temp.indexOf(" ",index1+1);
					int index3=temp.indexOf(" ",index2+1);
					String temp1=temp.substring(index1, index2);
					temp1+=(temp.substring(index2,index3));
					writer.produce("C:\\NavObjekte\\" + temp1.trim()+".txt");
					System.out.println(temp1);
				}
				if (temp.contains("End."))
					
				{
					emptyLines = 0;
					objectEnd=true;
				}
				
				
				if(objectEnd==true&&emptyLines>=5){
					realEnd=true;
				}

				writer.write(temp);
				
			} while (!(realEnd==true && temp==null));
				writer.end();
		} catch (FileNotFoundException fnf) {
			System.out.println("Datei konnte nicht gefunden werden(fnf).");
			fnf.printStackTrace();
		} catch (IOException e) {
			System.out.println("IO-Fehler!!!");
			e.printStackTrace();
		}
		
	}

}


package version1;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class Writer {
	public BufferedWriter x;

	public void produce(String newPath) {
		
		try{if (x != null) {
			x.flush();
			x.close();}
			
			BufferedWriter bw = new BufferedWriter(new FileWriter(new File(
					newPath)));
			x = bw;}catch(IOException io){
				io.printStackTrace();
			}
		
		
	}
	
	public void write(String newLine) {
		try {
			x.write(newLine + "\n");
		} catch (IOException io) {
			System.out.println("Datei konnte nicht erstellt werden(io).");
			io.printStackTrace();
		}
	}public void end(){
		try{
			if (x != null) {
				x.flush();
				x.close();}
		}catch(IOException io){
			io.printStackTrace();}
		}
		
	}


package version1;
import javax.swing.*;
import javax.swing.border.BevelBorder;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class GUI   {

	public static void frameSetter(){
		
		
		JFrame frame =new JFrame("NAV.txt.ObjectSplitter");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(450,140);
		frame.setBackground(Color.darkGray);
		frame.setLocationRelativeTo(null);
		frame.setResizable(false);
		frame.setLayout(null);
		Font a=new Font("Arial",Font.BOLD,20);
		//Textfield
		final JTextField entry=new JTextField("C:\\ ");
		entry.setSize(400,30);
		entry.setBackground(Color.white);
		entry.setFont(a);
		//Button
		JButton command=new JButton("NAV-txt.Objekte Splitten");
		command.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
			String path=entry.getText();
			if(!path.contains(".txt")){
				path=path+".txt";
			}
			Reader reader=new Reader();
			reader.read(path);
			
			}
		});
		
		entry.setBounds(10,20,400,30);
		entry.setBorder(new BevelBorder(BevelBorder.RAISED));
		entry.setToolTipText("<html>Hier bitte den genauen Pfad der txt.Datei<br> mit den Objekten angeben!</html>");
		frame.getContentPane().add(entry);
		
		command.setBounds(210, 55, 200, 30);
		command.setBorder(new BevelBorder(BevelBorder.RAISED));
		frame.getContentPane().add(command);
		
		frame.setVisible(true);
		
	}		
}


package version1;

public class ObjectSplitter {

	String oldPath;
	public static void main(String[] args) {
	
	GUI.frameSetter();

	}

}
 
Du nimmst einen BufferedReader zum einlesen aber einen normalen writer zum schreiben? komisch...

Auf jeden Fall sollte der writer nach jedem Schreibvorgang geschlossen werden.

Java:
writer.write(temp);
writer.flush();
writer.close();

Da er danach geschlossen ist, sollte er am Schleifenbeginn neu initialisiert werden.

(Ich hoff ich schreib kein Schmarrn...)
 
was für ein Schmarrn 😉
Writer aus der API ist doch eine abstrakte Klasse, kann man nicht initialisieren,
Spellsleeper hat genialerweise eine eigene Klasse genauso benannt..

der Fehler dürfte
> if (temp.equals(null)) {
sein, wenn temp am Ende null ist, gibt es hier eine NullPointerException,
das letzte write.end() nach der Schleife wird übersprungen, die letzte Datei nicht fertig geschrieben

fällt so eine Exception nirgendwo auf? bedenklich,
die genannte Code-Zeile kann korrigiert werden, allgemein ist relativ sicher

Writer w = ..;
try {
..
} finally {
// Code wird auch bei Exceptions ausgeführt
if (w != null) { w.end(); }
}

aber auf diese Weise können bis alle Ewigkeit Exceptions unerkannt bleiben,
doch besser auch ein catch(Exception e) einbauen und diese Fehler loggen, wenn sie sonst nirgendwo auftauchen
(Konsole nachgeschaut bei GUI-Programm?)
 
Danke SlaterB,
auf das finally hätte ich eigentlich auch schon vorher kommen müssen !
Lösung sieht so aus
Java:
[code=Java]
package version1;

import java.io.*;

public class Reader {

	public void read(String oldPath) {
		String temp;
		
		boolean objectEnd=false;
		boolean realEnd=false;
		File directory=new File("C:\\NavObjekte");
		if(!directory.exists()){
		directory.mkdir();}
		Writer writer = new Writer();

		try {
			BufferedReader br = new BufferedReader(new FileReader(new File(oldPath)));
			int emptyLines = 0;
			do {
				temp = br.readLine();
				
				
				
				if (temp.equals(null)) {
					emptyLines++;
				}
				if (temp.contains("OBJECT") && !(temp.contains(" OBJECT"))) {
					objectEnd=false;
					int index1=temp.indexOf(" ");
					int index2=temp.indexOf(" ",index1+1);
					int index3=temp.indexOf(" ",index2+1);
					String temp1=temp.substring(index1, index2);
					temp1+=(temp.substring(index2,index3));
					writer.produce("C:\\NavObjekte\\" + temp1.trim()+".txt");
					System.out.println(temp1);
				}
				if (temp.contains("End."))
					
				{
					emptyLines = 0;
					objectEnd=true;
				}
				
				
				if(objectEnd==true&&emptyLines>=5){
					realEnd=true;
				}

				writer.write(temp);
				
			} while (!(realEnd==true && temp==null));
				
		} catch (FileNotFoundException fnf) {
			System.out.println("Datei konnte nicht gefunden werden(fnf).");
			fnf.printStackTrace();
		} catch (IOException e) {
			System.out.println("IO-Fehler!!!");
			e.printStackTrace();
		}finally{writer.end();}
		
	}

}
[/code]
 
aha, und über die NullPointerException willst du nicht weiter nachdenken?

wobei es bei Korrektur dieser Zeile in der Tat zu einer Endlosschleife käme, null muss Abbruch der Schleife sein, ist Ende der Datei,
Leerzeilen sind "", nicht null,

naja was solls, der derzeitige Stand läuft zumindest..
 

Neue Themen


Zurück
Oben