算法第四版 BinaryStdIn&BinaryStdOut

  在看数据压缩这一部分的时候,这个两个API看了很久也没看太懂,书上也没有详细解释,调用的时候出现的数据总是理解不了,看源码看的有点头大,现在理解了一点,就想写写记录一下,同时也想给遇到此方面问题的同学一点提供一点帮助。

BinaryStdIn

主要静态方法

问题

重定向方式

管道

BinaryStdOut

主要静态方法

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();


    }


}

输出:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值