2015-10-10 37 views
0

我想在Java中實現huffman壓縮算法。我可以成功壓縮一個字符串並將其寫入文件(比如'compressed.java' )。現在我正在研究第二部分,我需要將'compressed.java'解壓縮到原始文件。BigInteger(line.getBytes())和Files.readAllBytes()給出不同的輸出

我需要讀取文件中的每一行作爲位。所以當我有一個非常小的'compressed.java'文件時,我使用Files.readAllBytes(path)然後使用String.format("%8s", Integer.toBinaryString(b & 0xFF)).replace(' ', '0')將文件內容轉換爲一串位,然後逐位解析,我可以成功解壓縮。但是當我有一個非常大的'compressed.java'(11 MB)文件時,Files.readAllBytes(path)花費了很多時間。所以我想讀每一行,然後將它轉換成一串字節,然後一點一點地解析。因此,我使用BufferedReader.readLine讀取每行,然後使用新的BigInteger(line.getBytes()).toString(2)轉換爲二進制字符串。但是這個字符串與我之前得到的不同。

你能告訴我我犯了什麼錯誤。

+0

閱讀文件「as bits」是不可能的,你可以用Java獲得的最小單位是Byte - 你可以自己將每個字節分成8位,並可能做你自己的事情,但那是關於它的。 – specializt

+0

是的,我知道我無法將文件作爲位讀取。如果我有一個小文件,使用Files.readAllBytes(路徑)工作得很快,我可以解壓縮壓縮文件的內容。但是如果壓縮文件是一個大文件,Files.readAllBytes(路徑)花費了很多時間。我正在尋找的是一種將文件讀爲字節塊的方式。但問題是,原始文件中的一些字符將駐留在壓縮文件中的兩個不同字節中。這也需要注意。 – UnderWood

+0

https://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html#read(byte[],%20int,%20int) 我認爲你需要放棄你目前的任務,首先從java編程基礎開始 - 如果不深入瞭解所選語言,就不可能實現複雜的壓縮算法 – specializt

回答

0

readLine()刪除行終止字符。它也返回字符,而不是字節。你在比較蘋果和橘子。如果你想要所有的字節,使用InputStream.read(byte[])循環。

+0

使用'readLine()'讀取的行將使用line.getBytes()轉換爲字節。 – UnderWood

+0

這對其他問題沒有幫助。 –