在看数据压缩这一部分的时候,这个两个API看了很久也没看太懂,书上也没有详细解释,调用的时候出现的数据总是理解不了,看源码看的有点头大,现在理解了一点,就想写写记录一下,同时也想给遇到此方面问题的同学一点提供一点帮助。
BinaryStdIn
BinaryStdIn类,它提供了一组方法来读取二进制输入。
这个API的关键特性在于标准输入的数据并不一定与字节边界对齐。如果只含有一个字节,可以使用readBoolean()一个比特一个比特地读取它。
主要静态方法
public static boolean isEmpty():返回输入是否已经读完。
public static boolean readBoolean():读取一个布尔值。
public static char readChar():读取一个字符。
public static double readDouble():读取一个双精度浮点数。
public static float readFloat():读取一个单精度浮点数。
public static int readInt():读取一个整数。
public static long readLong():读取一个长整数。
public static String readString():读取一个字符串。
问题
import edu.princeton.cs.algs4.BinaryStdIn;
public class isEmpty_Demo {
public static void main(String[] args) {
while (!BinaryStdIn.isEmpty()){
boolean b=BinaryStdIn.readBoolean();
System.out.print(b+" ");
}
BinaryStdIn.close();
}
}
这里咱们输入一个字符1,看看输出的是什么:
在输入一个字符a,查看结果:
这个时候就应该搬出来我们的ASCII码表:
咱们来对比一下
计算机按照ASCII编译字符,这里ASCII码表里按16进制的30表示字符0,二进制为:
ASCII码表里的a按16进制表示61,二进制为:
对应0,a字符打印出来的Boolean值的前8位,但这后7位我当时不清楚是是怎么回事,但我发现它们都是相同的,于是我什么字符都没有输入,按下Enter键:
出现的就是后七位Boolean值,再按照ASCII码表查询:
对应着ENQ (Enquiry),原来读取数据流时把Enter键的按下也当作数据流读取。
可以使用管道和重定向方式去避免。
“ < ” , " > " 这是重定向的提示符。
使用算法第四版BinaryDump实例,将字符以二进制形式打印出来:
package Algorithms_FE.DataZip;
import edu.princeton.cs.algs4.BinaryStdIn;
import edu.princeton.cs.algs4.StdOut;
public class BinaryDump {
private BinaryDump() { }
public static void main(String[] args) {
int bitsPerLine = 16;
if (args.length == 1) {
bitsPerLine = Integer.parseInt(args[0]);
}
int count;
for (count = 0; !BinaryStdIn.isEmpty(); count++) {
if (bitsPerLine == 0) {
BinaryStdIn.readBoolean();
continue;
}
else if (count != 0 && count % bitsPerLine == 0) StdOut.println();
if (BinaryStdIn.readBoolean()) StdOut.print(1);
else StdOut.print(0);
}
if (bitsPerLine != 0) StdOut.println();
StdOut.println(count + " bits");
}
}
重定向方式
输入文本:
A的ASCII码为41,五个字符每个字符8bits一共40bits。这样就避免了读取操作符。
管道
通过管道将输出写入文件中:
执行代码查看效果:
BinaryStdOut
BinaryStdOut是一个用于写二进制输出流的Java类,它可以用于将二进制数据写入标准输出(即控制台)或文件。
主要静态方法
- void write(boolean x):将布尔值写入输出流。
- void write(char x):将字符写入输出流。
- void write(char x, int r):将字符写入输出流,并在其前面填充零使其具有指定位数。
- void write(double x):将双精度浮点数写入输出流。
- void write(float x):将单精度浮点数写入输出流。
- void write(int x):将整数写入输出流。
- void write(int x, int r):将整数写入输出流,并在其前面填充零使其具有指定位数。
- void write(long x):将长整数写入输出流。
- void write(long x, int r):将长整数写入输出流,并在其前面填充零使其具有指定位数。
- void write(short x):将短整数写入输出流。
- void write(short x, int r):将短整数写入输出流,并在其前面填充零使其具有指定位数。
- void write(String s):将字符串写入输出流。
- void write(String s, int r):将字符串写入输出流,并
实例:
package Algorithms_FE.DataZip;
import edu.princeton.cs.algs4.BinaryStdOut;
import java.io.IOException;
public class demo {
public static void main(String[] args) throws IOException{
// 写入一个整数
BinaryStdOut.write(12345);
// 写入一个布尔值
BinaryStdOut.write(true);
// 写入一个字符串
BinaryStdOut.write("Hello, World!");
// 刷新输出缓冲区
BinaryStdOut.flush();
// 关闭输出流
BinaryStdOut.close();
}
}
输出: