2016-04-10 19 views
-1

Ich arbeite an einem Komprimierungsalgorithmus und dafür muss ich Bitfolgen in eine Binärdatei schreiben und genau dasselbe wieder zu einem String zurückholen! sagen, ich habe eine Zeichenfolge "10100100100 ....." und ich werde sie in einer Datei als BitsSchreiben Sie Bits in eine Datei und rufen Sie sie in einer Zeichenkette von "0101 .." in Java ab?

(nicht Zeichen '0' '1')

schreiben. und zurücklesen als bits und konvertieren in string ... und dies ist für eine große datenmenge (> 100 megabyte). gibt es eine nette und schnelle Möglichkeit, dies zu tun?

Bisher habe ich es versucht (und gescheitert), sie in Bytes zu schreiben, indem ich sie in 8 Bits und dann als ASCII-Zeichen in eine Zeichenkette und schließlich in eine .txt-Datei untergeordnet habe.

{ 
    String Bits="10001010100000000000"; // a lot larger in actual program 

    String nCoded=""; 
    char nextChar; 
    int i = 0; 
    for(i=0; i < Bits.length()-8; i += 8){ 

     nextChar = (char)Integer.parseInt(Bits.substring(i, i+8), 2); 
     nCoded += nextChar; 
    } 

    // for the remainding bits, padding 
    if(newBits.length()%8 != 0){ 
     nCoded+=(char)Integer.parseInt(Bits.substring(i), 2); 
    } 
    nCoded+=(char)Bits.length()%8; //to track the remainder of Bits that was padded 

    writeToTextFile(nCoded, "file.txt"); //write the nCoded string to file 
}    

aber dies scheint Informationen zu korrumpieren und ineffizient. wieder zur Klarstellung, ich möchte nicht die String geschrieben werden, es ist nur eine Darstellung der tatsächlichen Daten. So möchte ich

convert jeweils 0 und 1 aus der String-Darstellung seiner binären Form und schreiben, dass einzureichen.

+0

Wird die Zeichenfolge immer eine binäre Zeichenfolge sein:

Ein Hinweis, wie man ein Byte zu einem schönen String-Format konvertieren kann hier gefunden werden? –

+2

Ist es wirklich notwendig, die Bits in einem tatsächlichen 'String' zu haben? Das scheint eine unnötige Komplikation zu sein. Wenn Sie sie ausschreiben, während Sie sie generieren, können Sie einen einfachen Bitpuffer in einem int verwenden, den Sie regelmäßig leeren. – harold

+0

ja. sie werden nur 1s und 0s enthalten @DarshanMehta –

Antwort

-1

Sie können eine InputStream von einem String erhalten, jedes Byte lesen und schreiben ihn in eine Datei (Byte ist eine kleinste Einheit, die Sie Lese-/Schreibzugriff kann). Sobald alles geschrieben ist, können Sie die Daten auf ähnliche Weise lesen (d. H.) und sie verwenden. Im Folgenden ein Beispiel:

String hugeSting = "10101010010101010110101001010101"; 
InputStream in = new ByteArrayInputStream(hugeSting.getBytes()); 
OutputStream out = new FileOutputStream("Test.txt"); 
byte b; 
while((b = (byte) in.read()) != -1){ 
    out.write(b); 
} 
in.close(); 
in = new FileInputStream("Test.txt"); 
//Read data 
+0

geschrieben haben Sie haben es falsch gemacht. Ich möchte nicht, dass der String geschrieben wird, es ist nur eine Repräsentation der binären Daten. Ich möchte jede 0 und 1 aus der Zeichenfolgendarstellung in ihre binäre Form konvertieren und diese in Datei schreiben. –

+0

Wie gesagt, Sie können nicht ein bisschen in eine Datei schreiben. Die kleinste Einheit, die Sie schreiben können, ist Byte. –

0

Hier ist eine Methode, die Sie den String in eine Reihe von Bits zu konvertieren verwenden können, bereit für die Ausgabe in Datei: den String „01010101“

private byte[] toByteArray(String input){ 
    //to charArray 
    char[] preBitChars = input.toCharArray(); 
    int bitShortage = (8 - (preBitChars.length%8)); 
    char[] bitChars = new char[preBitChars.length + bitShortage]; 
    System.arraycopy(preBitChars, 0, bitChars, 0, preBitChars.length); 

    for (int i= 0; i < bitShortage; i++) { 
     bitChars[preBitChars.length + i]='0'; 
    } 

    //to bytearray 
    byte[] byteArray = new byte[bitChars.length/8]; 
    for(int i=0; i<bitChars.length; i++) { 
     if (bitChars[i]=='1'){ 
      byteArray[byteArray.length - (i/8) - 1] |= 1<<(i%8); 
     } 
    } 
    return byteArray; 
} 

Passing zurückkehren das Ergebnis [85] als ein Byte [].

Es stellt sich heraus, dass es einen einfacheren Weg gibt. Es gibt eine statische Byte.parseByte(String), die Byte Objekt zurückgibt. Aufruf:

Byte aByte = Byte.parseByte("01010101"); 
System.out.println(aByte); 

Zeigt den gleichen Wert: 85.

So können Sie hier ein paar Fragen stellen.

  1. Warum übergeben wir einen String, der 8 Zeichen lang ist. Nun, Sie können der Zeichenfolge ein 9. Zeichen voranstellen, das ein Vorzeichenbit darstellen würde. Ich glaube nicht, dass Sie diesen Fall, aber wenn Sie benötigt werden, die Dokumentation für Byte.parseByte() heißt es sein sollte:

Ein ASCII Minuszeichen ‚-‘ (‚\ u002D‘) eine negative, um anzuzeigen, Wert oder ein ASCII-Pluszeichen '+' ('\ u002B'), um einen positiven Wert anzuzeigen.

Also aus diesen Informationen, würden Sie benötigen, um Ihren String manuell in 8-Bit-Strings zu brechen und Byte.parseByte() rufen für jeweils ein Byte Objekt zu erhalten.

2) Was ist mit dem Schreiben von Bits in eine Datei? Nein, das Schreiben von Dateien erfolgt in Bytes. Wenn Sie die Datei schreiben, sie dann wieder einlesen und zurück in einen String konvertieren müssen, müssen Sie den Prozess umkehren und die Datei als byte[] lesen und dann in die String-Darstellung konvertieren.

Convert byte (java data type) value to bits (a string containing only 8 bits)

+0

Warum vermeiden Sie das Zeichen so? Es gibt kein Problem mit der Verwendung des Vorzeichen-Bits, als ob es ein normales Bit wäre, und tatsächlich erfordert java * das, weil es keine Bytes ohne Vorzeichen hat. – harold

+0

Ja ok, aber mein Punkt ist, er hat Bytes, also wird es 8 Bits in ihnen haben. Nimm nur alle 7 von 8 würde zu viele Bytes – harold

+0

Ihr Recht Harold führen. Ich werde die Antwort klären – pczeus