目录
编程练习题17_17BitOutputStream.java
题目:**17.17(BitOutputStream)
实现一个名为BitOutputStream的类,如图17-22所示,将比特写入一个输出流。方法writeBit(char bit)存储一个字节变量形式的比特。创建一个BitOutputStream时,该字节是空的。在调用writeBit(“1”)之后,这个字节就变成 00000001。在调用writeBit(“0101”)之后,这个字节就变成00010101。前三个字节还没有填充。当字节填满后,就发送到输出流。现在,字节重置为空。必须调用close()方法关闭这个流。如果这个字节非空也非满,close()方法就会先填充0以使字节的8个比特都被填满,然后输出字节并关闭这个流。可以参见编辑练习题5.44得到提示。编写一个测试程序,将比特010000100100001001101发送给一个名为Exercise17_17.dat的文件
-
代码示例
编程练习题17_17Test.java
package chapter_17;
import java.io.File;
import java.io.IOException;
public class 编程练习题17_17Test {
public static void main(String[] args) throws IOException{
File file = new File("src/Text/Exercise17_17.txt");
try(编程练习题17_17BitOutputStream bitOut = new 编程练习题17_17BitOutputStream(file)){
bitOut.writeBit("010000100100001001101");
}catch (Exception e) {
e.printStackTrace();
}
}
}
编程练习题17_17BitOutputStream.java
package chapter_17;
import java.io.Closeable;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class 编程练习题17_17BitOutputStream implements Closeable{
private File file;
private FileOutputStream fileOut;
private int currentByte;
private int bitPosition;
编程练习题17_17BitOutputStream(File file)throws FileNotFoundException{
this.file = file;
fileOut = new FileOutputStream(file);
}
public void writeBit(char bit) {
if (bit == '0' || bit == '1') {
// 计算掩码,只有一个1在bitPosition位上
int mask = 1 << bitPosition;
// 如果bit是'1',则使用按位或操作符将对应位置设为1
if (bit == '1') {
currentByte |= mask;
}
// 如果bit是'0',则使用按位与操作符和取反的掩码来清除对应位
else {
currentByte &= ~mask;
}
// 如果需要,可以递增bitPosition来准备下一个位的写入
// 这里可以根据需要调整或删除
bitPosition++;
// 如果bitPosition超出字节范围,可能需要重置它或执行其他操作
if (bitPosition > 7) {
bitPosition = 0; // 重置bitPosition
// 可能还需要执行其他操作,如处理溢出的字节等
}
} else {
// 处理非法输入,比如抛出异常
throw new IllegalArgumentException("Invalid bit value: " + bit);
}
}
public void writeBit(String bit) {
for(char c:bit.toCharArray())
writeBit(c);
}
public void close() {
try {
if (bitPosition > 0) {
int shift = 8 - bitPosition;
currentByte = currentByte << shift;
fileOut.write(currentByte);
}
fileOut.close();
} catch (IOException e) {
// 处理异常,例如记录日志或抛出运行时异常
e.printStackTrace();
throw new RuntimeException("Error closing file", e);
}
}
}