|
You last visited: Today at 00:34
Advertisement
[Java] Jar-Datei splitten
Discussion on [Java] Jar-Datei splitten within the General Coding forum part of the Coders Den category.
07/29/2012, 14:04
|
#1
|
elite*gold: 17
Join Date: Jul 2009
Posts: 1,562
Received Thanks: 478
|
[Java] Jar-Datei splitten
Hi
ich spiele zZ ein bisschen mit Java rum und möchte eine Jar-Datei splitten.
Ich habe davor 2 mal das selbe hallo_welt Programm durch einen Splitstring getrennt aneinander gehängt. Dazu der Code:
Code:
public void combineFiles ( String file1, String file2, String output, String split )
{
try
{
RandomAccessFile data1 = new RandomAccessFile ( file1, "r" ) ;
RandomAccessFile data2 = new RandomAccessFile ( file2, "r" ) ;
byte [ ] byte1 = new byte [ ( int ) data1.length ( ) ] ;
byte [ ] byte2 = new byte [ ( int ) data2.length ( ) ] ;
byte [ ] splitBytes = new byte [ split . length ( ) ] ;
byte [ ] both = new byte [ split . length ( ) + byte1 . length + byte2 . length ] ;
splitBytes = split . getBytes ( ) ;
data1.read ( byte1 ) ;
data2.read ( byte2 ) ;
data1.close ( ) ;
data2.close ( ) ;
both = concat ( byte1, splitBytes, byte2 ) ;
RandomAccessFile newFile = new RandomAccessFile ( output, "rw" ) ;
newFile . write ( both ) ;
newFile . close ( ) ;
}
catch ( Exception e ) { }
}
public byte [ ] concat ( byte [ ] A, byte [ ] B, byte [ ] C )
{
byte [ ] D = new byte [ A . length + B . length + C . length ] ;
System . arraycopy ( A, 0, D, 0, A . length ) ;
System . arraycopy ( B, 0, D, A . length, B . length ) ;
System . arraycopy ( C, 0, D, A . length + B . length, C . length ) ;
return D ;
}
Das hat super funktioniert. Ich habe dannach eine Datei, die ich immer noch ausführen kann (das erste hallo_welt Programm wird ausgeführt) und die Dateigröße stimmt auch (datei1+datei2+splitString)
Jetzt will ich mithilfe von split() die beiden ursprünglichen Dateien wieder herstellen:
Code:
public String [ ] getOldFile ( String file, String splitStr )
{
try
{
StringBuffer fileData = new StringBuffer ( 1000 ) ;
BufferedReader reader = new BufferedReader ( new FileReader ( file ) ) ;
char [ ] buf = new char [ 1024 ] ;
int numRead = 0 ;
while ( ( numRead = reader . read ( buf ) ) != -1 )
{
String readData = String . valueOf ( buf, 0, numRead ) ;
fileData . append ( readData ) ;
buf = new char [ 1024 ] ;
}
reader.close();
String data = fileData . toString ( ) ;
String [ ] splited ;
splited = data . split ( splitStr ) ;
return splited ;
}
catch ( Exception e ) { return null ; }
}
Und die beiden Felder des String Arrays wieder in 2 neue Dateien schreiben:
Code:
public void writeFile ( String fi, String data )
{
try
{
File file = new File ( fi ) ;
FileWriter fw = new FileWriter ( file ) ;
fw . write ( data ) ;
fw . flush ( ) ;
fw . close ( ) ;
}
catch ( Exception e ) { }
}
Die beiden neuen Dateien sind aber größer als die beiden ursprünglichen Dateien und lassen sich nicht mehr ausführen:
Code:
invalid file (bad magic number): Exec format error
Dateigrößen:
hallo_welt1.jar: 17362 byte
hallo_welt2.jar: 17362 byte
splitString: 1234567890 entspricht 10 byte
hallo_welt12.jar (beide zusammen): 34734 byte <- lässt sich problemlos ausführen
Nach dem Splitten:
file0.jar: 29473 byte
file1.jar: 29473 byte
er erkennt also den SplitString und splittet auch in 2 gleich große Dateien. Diese sind aber nicht mehr die ursprünglichen Dateien.
Woran könnte das liegen?
|
|
|
07/29/2012, 16:26
|
#2
|
elite*gold: 0
Join Date: Jun 2012
Posts: 8
Received Thanks: 3
|
Hi,
ich hab da mal ein bischen was geändert. Zum einen wird die Datei jetzt mit dem FileInputStream eingelesen und die zwei neuen Dateien über den FileOutputStream geschreiben. Der FileWriter ist für raw-bytes nix^^.
Dann musst du aber noch darauf achten, das der splitStr nicht irgendwie schon in den beiden Dateien vorkommt. Allgemein ist die Technik ned so ideal und muss noch optimiert werden ;P
Code:
public static byte[][] getOldFile(String file, String splitStr) {
try {
FileInputStream fis = new FileInputStream(file);
byte[] dataByte = new byte[(int) (new File(file)).length()];
fis.read(dataByte);
fis.close();
byte[] splitByte = splitStr.getBytes();
int splitPos = -1;
for(int i = 0; i < dataByte.length - splitByte.length;i++){
for (int j = 0; j < splitByte.length; j++) {
if (dataByte[i+j] != splitByte[j]) {
break;
}
if (j == splitByte.length-1) {
splitPos = i;
}
}
if(splitPos != -1){
break;
}
}
byte[] rByte1 = new byte[splitPos];
byte[] rByte2 = new byte[dataByte.length - splitPos - splitByte.length];
System.arraycopy(dataByte, 0, rByte1, 0, rByte1.length);
System.arraycopy(dataByte, splitPos + splitByte.length, rByte2, 0, rByte2.length);
byte[][] returnByte = {rByte1,rByte2};
return returnByte;
} catch (Exception e) {
return null;
}
}
Code:
public static void writeFile(String fi, byte[] data) {
try {
FileOutputStream output = new FileOutputStream(fi);
output.write(data, 0, data.length);
output.flush();
output.close();
} catch (Exception e) {
}
}
|
|
|
07/29/2012, 16:47
|
#3
|
elite*gold: 17
Join Date: Jul 2009
Posts: 1,562
Received Thanks: 478
|
Nice. Funktioniert 
Ich denk mal das das Problem die umwandlung von Byte in String und wieder zurück war?
Und wie meinst du, dass man die Technik optimieren könnte?
|
|
|
07/29/2012, 17:52
|
#4
|
elite*gold: 0
Join Date: Jun 2012
Posts: 8
Received Thanks: 3
|
Also ein Ansatz wär z.B. ein "Pseudo-Filesystem". Die Dateien direkt hintereinander setzen und dann noch n bytes hinten anzuhängen die dazu dienen die Anzahl der bytes einer der Dateien abzuspeichern. Bei 10 bytes (80 bit) hat man somit die Möglichkeit 2^80 bytes (1 Yottabyte ? (villeicht etwas überdimensioniert ;P)) für eine Datei zu "markieren".
|
|
|
07/29/2012, 18:30
|
#5
|
elite*gold: 17
Join Date: Jul 2009
Posts: 1,562
Received Thanks: 478
|
Ich glaub ich versteh was du meinst ^^
Das versuche ich demnächst mal umzusetzen.
Danke für deine Hilfe
|
|
|
 |
Similar Threads
|
Textdatei in 14 kleine datei splitten
07/26/2012 - Technical Support - 3 Replies
Hey
Ich Fab folgendes Problem: Ich hab eine textdatei,die 7 gigabyte groß ist,also zu groß für meinen arbeitsspeicher (RAM) und somit auch zu groß für den text editor.
nun will ich 14 kleine teile davon haben, wie get das??
Bekommt auch ein dickes thanks.
Wenn möglich eine ordendliche erklährung wie das gehen soll^^
|
MP4 Datei splitten?
02/04/2012 - Off Topic - 3 Replies
Servus leute,
Ich habe eine mp4 Datei, und ich habe schon etliche Programme benutzt,
alles nicht geklappt.
Könnt ihr mir da irgendwie helfen?
|
Java - Eine Datei ausführen
01/25/2012 - General Coding - 2 Replies
hallo ich würde gerne ein programm in java durch den code starten
weiß aber nicht wie das geht
bitte um schnelle antwort :)
|
Problem beim Splitten einer .m2ts-Datei mit tsMuxer GUI!
01/14/2012 - Technical Support - 0 Replies
Hallo.
Wenn ich eine .m2ts (AVCHD-Video) splitten will, und ich diese in den Input von tsmuxer GUI (v1.10.6) schiebe, kommt folgende Meldung :
http://s14.directupload.net/images/120114/wlz93lv 9.png
Kann mir wer helfen? Bei den Tracks wird überhaupt gar nichts angezeigt!
Vielen Dank im voraus.
|
[HowTo] Datei splitten und wieder zusammenfügen
05/08/2010 - Tutorials - 2 Replies
Hallo!
Hier beschreibe ich euch wie ihr mit (einfachen) Shell-Befehlen grosse Dateien aufsplitten und wieder zusammefügen könnt.
Als Beispiel nehmen wir eine Datei mit dem Namen "image.iso".
Diese Datei ist z.b. 100 MB gross und soll in 5 MB grosse Teile gesplittet werden.
Damit der Wiedererkennungwert der Datei nicht verloren geht lassen wir die Datei nicht umbenennen, sondern lassen das Suffix ".part_" gefolgt von einer 2-stelligen Zahl anhängen.
Aus "image.iso" wird nach dem...
|
All times are GMT +1. The time now is 00:35.
|
|