为什么我的程序没有读/写这些位?

时间:2018-02-27 14:45:58

标签: java bit-manipulation

我正在创建一个Huffman压缩程序。 但我在写/读这些位时遇到了一些麻烦。 我希望能够将特定位写入文件。 例如,首先应使用fileOutputStream将“0100”然后“0101”作为字节写入新文件“01000101”:69

类BitFileWriter - 通过将每个字节保存在缓冲区中然后在缓冲区已满(包含8位)时写入来将位写入文件。

在这个类的main函数中,如果所有字节都写入文件,我会进行一些测试。 但是打开文本文件它不会读取“AB”。

    /**
 * writes bits to file outPutStream.
 */
public class BitFileWriter {

    private BufferedOutputStream out;
    private int buffer; // 8-bit buffer of bits to write out
    private int n; // number of bits remaining in buffer
    private String filename;


    public BitFileWriter(String filename){

        this.filename = filename;

    }

    private void addBitToBuffer(boolean bit) throws IOException {

            // add bit to buffer
            this.buffer <<= 1;
            if (bit) this.buffer |= 1;
            n++;

            //if buffer is full write a whole byte.
            if(n == 8){

                writeByte(this.buffer);
                this.n = 0;
                this.buffer = 0;


            }

    }

    private void writeByte(int b) throws IOException {


            this.out = new BufferedOutputStream(new 
            FileOutputStream(filename));
            out.write(b);
    }

    public void flush() throws IOException {
        this.out.flush();
    }

    public static void main(String[] args) throws IOException {
        BitFileWriter bitFileWriter = new 
        BitFileWriter("./src/result.txt");


        // byte: 01000001, A
        bitFileWriter.addBitToBuffer(true);
        bitFileWriter.addBitToBuffer(true);
        bitFileWriter.addBitToBuffer(false);
        bitFileWriter.addBitToBuffer(false);
        bitFileWriter.addBitToBuffer(false);
        bitFileWriter.addBitToBuffer(false);
        bitFileWriter.addBitToBuffer(true);
        bitFileWriter.addBitToBuffer(false);

        //byte 01000011, B
        bitFileWriter.addBitToBuffer(false);
        bitFileWriter.addBitToBuffer(true);
        bitFileWriter.addBitToBuffer(true);
        bitFileWriter.addBitToBuffer(false);
        bitFileWriter.addBitToBuffer(false);
        bitFileWriter.addBitToBuffer(false);
        bitFileWriter.addBitToBuffer(false);
        bitFileWriter.addBitToBuffer(false);


        bitFileWriter.flush();



    }

}

类BitFileReader - 从文件中读取位。

但是读取我想写入result.txt的所有16位并没有给出我(想)写的位。

    /**
 * Reads one bit at a time from a file.
 *
 *
 */
public class BitFileReader {
    private BufferedInputStream in;
    private int currentByte; // -1 if no more data
    private int bitPos;      // position in currentByte

    /**
     * Creates a BitFileReader by opening a connection to an actual file,
     * the file named by the File object file in the file system.
     */
    public BitFileReader(File file) throws IOException {

        in = new BufferedInputStream(new FileInputStream(file));
        currentByte = in.read();
        bitPos = 7;
    }

    /** Returns true if this reader has another bit in its input. */
    public boolean hasNextBit() {
        return currentByte != -1 && in != null;
    }

    /** Reads a single bit. */
    public int nextBit() throws IOException {
        int res = (currentByte>>bitPos) & 1;
        --bitPos;
        if (bitPos < 0) {
            currentByte = in.read(); // -1 if end of file has been reached (read returns -1 if end of file).
            bitPos = 7;
        }
        return res ;
    }

    /** Closes this reader. */
    public void close() throws IOException {
        if (in != null) {
            in.close();
        }
    }

    //Test
    public static void main(String[] args) throws IOException {
        File temp;
        BitFileReader reader;



        reader = new BitFileReader(new File("./src/result.txt"));

        System.out.print("first byte: ");
        for(int i = 0; i <8; i++){
            System.out.print(reader.nextBit());
        }

        System.out.print(". second byte: ");
        for(int i = 0; i <8; i++){
            System.out.print(reader.nextBit());
        }




        reader.close();
    }
}

输出为:第一个字节:01100000。第二个字节:11111111

1 个答案:

答案 0 :(得分:1)

我要做的第一件事就是移动声明:

this.out = new BufferedOutputStream(new 
            FileOutputStream(filename));

writeByte到构造函数