Dekomprimieren einer Datei.txt

Krizz1990

Mitglied
Guten Tag,

Habe ein Programm zum komprimieren einer Datei.txt geschrieben und die klappt auch ohne Probleme. Jedoch möchte ich nun das Programm rückgängig programmieren. Also eine "komprimierte" Datei zu dekomprimieren, jedoch hänge ich da ein bischen. Könntet ihr mir da Bitte helfen ?

Hier ist das Programm zum Komprimieren. Was muss ich da ändern um eine Datei.txt dekomprimieren zu können ?

Danke

Java:
import java.io.File;
import java.io.FileInputStream;


public class komprimieren {
	public static void main(String[]args)
	{
	String dateiName = "unkomprimiert.txt";
	File meineDatei = new File(dateiName);
	try{
	FileInputStream fis = new FileInputStream(meineDatei);
	
	int fr=0;
	int act=fis.read();
	while(fr!=-1) 
	{int zaehler =1; 
	while (act==(fr=fis.read())){zaehler++;}
	System.out.print((char)act);
	System.out.print(zaehler+" ");
	act=fr;}
	
	} catch(Exception e){}
	}
}
 
Erinnert mich etwas an:
Coder1: Hey, ich habe ein Archiv-Algo entwickelt, welches jede beliebige Datei auf 5 bytes komprimiert
Coder2: Ui, das ist super!
Coder1: Ja, aber beim Entpacken happert es im Moment
:joke:

Wenn ich es richtig sehen sieht deine komrpimierte Datei so aus:
Code:
a1 b2 c1 d5
Was bedeuten würde:
Code:
abbcddddd
(ganz davon mal abgesehen zweifle ich an der komprimierenden Wirkung des Algos)

Also ließ doch ein Char ein und anschließend die Zahl bis zum Leerzeichen, dann schreib X mal diesen Char hin.
 
Ja die Überlegung die einzelnen Buchstaben mit der Zahl daneben zu multiplizieren hatte ich auch schon , jedoch ist mein Problem dies im Java umzusetzen.

Ich muss dem Programm sagen er soll bis zur Leerstelle lesen, und dann die Zahl die vor der Leerstelle steht mit dem Buchstaben vor der Zahl ( zwei Stellen vor der Leerstelle ) multiplizieren. Aber wie kann ich das in Java ausdrücken ? Und woher weiss dass Programm das nach dem ersten A1 noch vielleicht B23 und C3 kommt ?

Vielen Dank
 
Was willst du da multiplizieren? :bahnhof:
Bei der Aufgabe wäre RegEx angebracht:
Code:
(.)(\d+)\
Dann kriegst du auch das Zeichen und die Anzahl zurückgeliefert. Wie du das Zeichen dann n mal ausgibst solltest du auch so wissen, wenn du den Code selber geschrieben hast.
 
"Ich bin kein Sprachprofessor, was euch sicherlich aufgefallen ist"
"i1c1h1 b1i1n1 k1e1i1n1 s1p1r1a1c1g1p1r1o1f1e1s2o1r1....."
irg wo seh ich da keine kompermierung ^^ sieht mehr so nach brain**** dialekt aus
 
was soll das für eine textdatei sein?
wer macht eine datei mit aaaccccdddeeddasaassas?

es gibt in einer ordentlichen information keine vokal doppelungen in keiner normalen sprache
 
Es ist so gedacht dass die gleichen Buchstaben immer hintereinander stehen : aaaaaaaaaabbbbbbbbbbrrrrrrrrrrrnnnnnnnnnnnnnnn.

Kann mir denn Bitte jemand helfen, wie ich die komprimierte Datei.txt lesen und dekomprimieren kann?

Danke
 
wenn in diesem (obskuren, ich denke zu lernzwecken entworfenen) spezifizierten format NUR buchstaben bzw nicht numerische zeichen vorkommen, und das wirklich die aufgabe ist, sollte es in diesem speziellen fall ja auch etwas platz sparen

aaaaabbbbbccccc ist ja augenscheinlich auch länger als a5b5c5

und eigentlich ist das doch

einzelne zeichen lesen, ein char weiter schauen wie oft er vorkommt und das in die datei schreiben.

zweimal lesen -> schreiben
zweimal lesen -> schreiben
zweimal lesen -> schreiben
...
 
Zuletzt bearbeitet:
wenn in diesem (obskuren, ich denke zu lernzwecken entworfenen) spezifizierten format NUR buchstaben bzw nicht numerische zeichen vorkommen, und das wirklich die aufgabe ist, sollte es in diesem speziellen fall ja auch etwas platz sparen
Zahlen dürfen ja durch aus vorkommen:
Code:
a1 b23 412 12
. Es ist klar definiert, dass das 1. Zeichen das echte Zeichen ist und anschließend die Anzahl steht. Also wäre hier 12 mal die 4 und 2 mal die 1.
einzelne zeichen lesen, ein char weiter schauen wie oft er vorkommt und das in die datei
Wie auch in dem Beispiel von oben angedeutet reich nicht ein Char weiter zu lesen, sondern immer bis zum nächsten Leerzeichen.
 
Ja, ich bin auch zuerst zu der Meinung gekommen, dass es mit Zahlen ein Problem sein würde 🙂
Ich halte es immer noch für den "einfachsten" Weg den Scanner auf den RegEx von oben anzusetzen und einfach nur abzulesen.
 
Java:
 Scanner s = new Scanner(filename).useDelimiter("\\s*  \\s*");
System.out.println(s.nextInt());
	zahl=s.nextInt();
	Buchstabe=s.next();

Kann man so die Zahlen und Buchstaben abspeichern ?
 
Probier es aus?
Dabei wirst du vermutlich merken, dass du Scanner falsch benutzt (sofern filename das ist, was der Name vermuten sollte) und dass der RegEx falsch ist. Was hast du dir bei dem RegEx gedacht?
 
Regex soll die Leerstelle als Ausgangspunkt nehmen, wie beim Beispiel vom Scanner. Da wird ja auch fish als Ausgangspunkt genommen.

Filenme habe ich vorher deklariert :

Java:
  String filename = "komprimiert.txt";
    File meineDatei = new File(filename);
	try{
	FileInputStream fis = new FileInputStream(filename);
	Scanner s = new Scanner(filename).useDelimiter("\\s*  \\s*");
	int zahl;
	String Buchstabe;
	System.out.println(s.nextInt());
	zahl=s.nextInt();
	Buchstabe=s.next();
 
Du hast ja ein völlig anderen aufbau als in dem Beispiel. Darüber hinaus steht paar Zeilen weiter oben in den Javadocs wie du Scanner richtig mit einer Datei verwendest.
Einen möglichen RegEx habe ich dir schon oben geschrieben. Darüber hinaus solltest du dir noch mal die Arbeit mit den regulären Ausdrücken anschauen.
 
Ok weiss jetzt wie man die Scanner Datei liest

Java:
   String filename = "komprimiert.txt";
    File meineDatei = new File(filename);
	try{
	
		
	Scanner scanner = new Scanner(filename);
	while (scanner.hasNextLine()) {
	String line = scanner.nextLine();
	System.out.println(line);
		}
		} catch (FileNotFoundException e) {
		e.printStackTrace();
		}

Sitze beim Rest wirklich auf dem Schlauch ... Weiss echt nicht wie ich die Zahl sowie die Buchstaben herausscannen kann 🙁
 

Neue Themen


Zurück
Oben