Input/Output Binäres,zeilenorientiertes auslesen

  • Themenstarter Themenstarter Spellsleeper
  • Beginndatum Beginndatum
S

Spellsleeper

Gast
Hallo,

kann mir jemand helfen? Mein Problem besteht darin eine TXT.Datei binär einzulesen und zur gleichen Zeit zu wissen wo das Programm im Text steht um diesen zu splitten.Ich habe es schon mit Text versucht aber leider werden die Sonderzeichen dabei immer verändert.Es folgt unten der Versuch auf Text-Ebene der so ähnlich binär durchgeführt werden muss.

Und wie gesagt mein Problem liegt nicht darin die Klasse BufferedInputStream nicht zu kennen sondern wie ich es bei der Durchführung es schaffe die Datei (im binärem Stream) an der richtigen Stelle des Textes zu trennen.Vielen Dank an alle die sich des Problems annehmen.???:L

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();}
		
	}

}
 
Zuletzt bearbeitet von einem Moderator:
Ich hätte da kurz drei Fragen:
  • Wieso redest du von "binärem Lesen", verwendest dann aber keine InputStreams?
  • Wieso schreibt deine read-Methode auf die Festplatte?
  • Was willst du damit überhaupt erreichen (vielleicht gibt es ja einen besseren Weg)?
 
Zuletzt bearbeitet von einem Moderator:
Also ich glaube ich habe mich ein bischen unglücklich ausgedrückt.
Hier wären dann noch mal die Fakten:
-Ich muss mehrere Objekte eines ERP-Systems aus einer TXT.Datei filtern und als einzelne TXT.Dateien ausgeben(objekt startet mit"OBJECT" und endet bei der nächsten leeren Zeile nach "END.")
-Auf Char-Basis habe ich es schon probiert aber die Sonderzeichen waren immer verändert
-Es soll bei allen Encodings klappen
-Nur wie treffe ich die Stelle zum trennen der Objekte wenn ich es über Bytepuffer einlese
 
Die wichtigste Frage: Ist das nun wirklich binärer Inhalt? Denn nach dem was du schreibst hört es sich eher nach textuellem Inhalt an und die verwendest einfach das falsche Encoding.
Wenn es tatsächlich binärer Inhalt ist, dann brauchst du mit einem Reader gar nicht erst anzufangen.
 
Nein der Inhalt der Datei ist Text soll aber als ByteFormat eingelesen werden und danach ,wenn er an den richtigen Punkten gesplittet wurde auch so in die einzelnen Dateien ausgegeben werden
 
Ich habe es so umgesetzt wie ich es für möglich halte. Allerdings gibt mir das Programm keine Dateien in den Ordner.

Java:
package versuch2;
import java.io.*;



public class Reader {
	/*temp-aktuelle Textzeile
	 * begin-Anfangspunkt von Objekt
	 * charPos-aktueller Lesestand
	 * objectEnd-Hat der Reader schon die Position von "END." passiert
	 * 
	 */

	public static void read(String oldPath) {
		File directory = new File("C:\\NavObjekte\\Splitted");
		Writer writer =new Writer();
		if (!directory.exists()) {
			directory.mkdir();
		}
		String temp="";
		boolean objectEnd=false;
		int charPos=0;
		int begin=0;
		String fileName="";
		//input
		File file=new File(oldPath);
		try{
			InputStream is=new FileInputStream(file);
			BufferedInputStream bis=new BufferedInputStream(is);
			FileReader fr=new FileReader(file);
			BufferedReader br=new BufferedReader(fr);

			while ((temp = br.readLine()) != null) {
				charPos+=temp.length();
				if(temp.startsWith("OBJECT ")){

					objectEnd=false;
					begin=charPos-temp.length();
					int i0 = temp.indexOf(" ") + 1;
					int i1 = temp.indexOf(" ", i0 + 1);
					int i2 = temp.indexOf(" ", i1 + 1);
					fileName=temp.substring(i0, i2);
					fileName.trim();
					writer.produce("C:\\NavObjekte\\Splitted\\"+fileName+".txt");
				}
				if(temp.contains("END.")){
					objectEnd=true;
				}
				if(objectEnd==true&&temp==""){
					byte[]b=new byte[charPos-begin];
					bis.read(b, begin, charPos-begin);
					writer.write(b);
				}}
		}catch(IOException io)
		{io.printStackTrace();}
		finally{writer.end();}	
	}

}

Java:
package versuch2;
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();
		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.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 zu trennenden 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);
		
	}		
}
Java:
package versuch2;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class Writer {
	public BufferedOutputStream x;

	public void produce(String newPath) {

		try {
			if (x != null) {
				x.flush();
				x.close();
			}
			// Kann man hier das auszugebende Format bestimmen?
			BufferedOutputStream bos = new BufferedOutputStream(
					new FileOutputStream(new File(newPath)));

			x = bos;
		} catch (IOException io) {
			io.printStackTrace();
		}

	}

	public void write(char c) {
		try {
			x.write(c);
		} catch (IOException io) {
			System.out.println("Datei konnte nicht erstellt werden(io).");
			io.printStackTrace();
		}
	}

	public void write(int n) {
		try {
			x.write(n);
		} catch (IOException io) {
			System.out.println("Datei konnte nicht erstellt werden(io).");
			io.printStackTrace();
		}
	}

	public void write(byte[] b, int s, int l) {
		try {
			x.write(b, s, l);
		} catch (IOException io) {
			System.out.println("Datei konnte nicht erstellt werden(io).");
			io.printStackTrace();
		}
	}
	public void write(byte[] b){
		try{
		x.write(b);
		}catch(IOException io){io.printStackTrace();}
	}

	public void end() {
		try {
			if (x != null) {
				x.flush();
				x.close();
			}
		} catch (IOException io) {
			io.printStackTrace();
		}
	}

}
Wie ihr seht schon ziemlich überladen
Java:
package versuch2;

public class ObjectSplitter {

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

	}

}

So falls mir jemand beim in gang bringen helfen könnte ,das wäre super.
Bitte habt Verständnis! Dies ist bisher mein bei weitem größtes Projekt.
 
Zuletzt bearbeitet von einem Moderator:
Danke an alle die sich Gedanken gemacht haben, ein Freund konnte mir letztendlich helfen:
Java:
package versuch2;

import java.io.*;

public class Reader {
	/*
	 * temp-aktuelle Textzeile begin-Anfangspunkt von Objekt charPos-aktueller
	 * Lesestand objectEnd-Hat der Reader schon die Position von "END." passiert
	 */

	public static void read(String oldPath) {
		File directory = new File("C:\\NavObjekte\\Splitted");
		Writer writer = new Writer();
		if (!directory.exists()) {
			directory.mkdir();
		}
		String temp = "";
		boolean objectEnd = false;
		int charPos = 0;
		int begin = 0;
		String fileName = "";
		// input
		File file = new File(oldPath);
		try {
			InputStream is = new FileInputStream(file);
			BufferedInputStream bis = new BufferedInputStream(is);
			FileReader fr = new FileReader(file);
			BufferedReader br = new BufferedReader(fr);

			while ((temp = br.readLine()) != null) {
				if (temp.startsWith("OBJECT ")) {
					if (charPos > 0) {
						byte[] b = new byte[charPos - begin];
						int l = bis.read(b, 0, charPos - begin);
						writer.write(b, 0, l);
					}
					
					objectEnd = false;
					begin = charPos;
					// OBJECT Form 21 Customer Card
					int i0 = temp.indexOf(" ") + 1;
					int i1 = temp.indexOf(" ", i0 + 1);
					int i2 = temp.indexOf(" ", i1 + 1);
					fileName = temp.substring(i0, i2);
					fileName.trim();
					writer.produce("C:\\NavObjekte\\Splitted\\" + fileName + ".txt");
				}
				charPos += temp.length()+2;
			}
			byte[] b = new byte[charPos - begin];
			int l = bis.read(b, 0, charPos - begin);
			writer.write(b, 0, l);
		} catch (IOException io) {
			io.printStackTrace();
		} finally {
			writer.end();
		}
	}

}
 
Das ist ziemlich absurd was du da machst, aber solange du glücklich bist... (was vermutlich nicht lange ist)
 
Wenn du ein anderes Konzept vorschlägst wäre ich interessiert dieses zu erfahren.
Klar ich hab einen BufferedInputStream und einen FileInputstream auf einmal laufen das kann nicht das Optimum sein aber was schlägst du vor um dies zu verbessern?
 

Zurück
Oben