zoukankan      html  css  js  c++  java
  • IO Streams:数据流

    数据流支持原始数据类型值(布尔型,字符型,字节型,短型,长整型,浮点型和双倍型)的二进制I / O以及字符串值。所有数据流都实现了DataInput接口或DataOutput接口。本节重点介绍这些接口DataInputStream和DataOutputStream中最广泛使用的实现。

    DataStreams示例通过写出一组数据记录来演示数据流,然后再次读取它们。每个记录由与发票上的项目相关的三个值组成,如下表所示:


    我们来看看DataStreams中的关键代码。首先,程序定义了一些包含数据文件的名称和要写入的数据的常量:

    static final String dataFile = "invoicedata";
    
    static final double[] prices = { 19.99, 9.99, 15.99, 3.99, 4.99 };
    static final int[] units = { 12, 8, 13, 29, 50 };
    static final String[] descs = {
        "Java T-shirt",
        "Java Mug",
        "Duke Juggling Dolls",
        "Java Pin",
        "Java Key Chain"
    };

    然后DataStreams打开一个输出流。 由于DataOutputStream只能作为现有字节流对象的包装器创建,因此DataStreams提供缓冲的文件输出字节流。

    out = new DataOutputStream(new BufferedOutputStream(
                  new FileOutputStream(dataFile)));

    DataStreams 输出记录并关闭输出流:

    for (int i = 0; i < prices.length; i ++) {
        out.writeDouble(prices[i]);
        out.writeInt(units[i]);
        out.writeUTF(descs[i]);
    }

    writeUTF方法以UTF-8的修改形式写出String值。 这是一个可变宽度的字符编码,对于常见的西方字符只需要一个字节。 现在DataStreams再次读取数据。 首先,它必须提供一个输入流,和变量来保存输入数据。 像DataOutputStream一样,DataInputStream必须构造为字节流的包装器

    in = new DataInputStream(new
                BufferedInputStream(new FileInputStream(dataFile)));
    
    double price;
    int unit;
    String desc;
    double total = 0.0;

    现在,DataStreams可以读取每一个流中的记录,输出它所遇到的每一个数据:

    try {
        while (true) {
            price = in.readDouble();
            unit = in.readInt();
            desc = in.readUTF();
            System.out.format("You ordered %d" + " units of %s at $%.2f%n",
                unit, desc, price);
            total += unit * price;
        }
    } catch (EOFException e) {
    }

    请注意,DataStreams通过捕获EOFException来检测文件结束条件,而不是测试无效的返回值。 DataInput方法的所有实现都使用EOFException而不是返回值。

    还要注意,DataStreams中的每个特定写入都有完全与之相应的特定读取匹配。它是由程序员来确保输出类型和输入类型相匹配,以这种方式:

    输入流由简单的二进制数据,用什么来表示个体值的类型,或者他们在流中的什么地方开始。 

    DataStreams使用一种非常糟糕的编程技术:它使用浮点数来表示货币值。一般来说,浮点对精确值是不利的。它对于小数分数特别不好,因为常用值(如0.1)不具有二进制表示形式。

    用于货币值的正确类型是java.math.BigDecimal。不幸的是,BigDecimal是一个对象类型,因此它不会与数据流一起使用。然而,BigDecimal将与对象流一起工作,这将在下一节中介绍

  • 相关阅读:
    Ubuntu创建VLAN接口配置
    Ubuntu配置网桥方法
    Ubuntu重启网卡的三种方法
    kvm存储池和存储卷
    ubuntu如何切换到root用户
    修改Ubuntu默认apt下载源
    Java之泛型<T> T与T的用法(转载)
    Java关键字(一)——instanceof(转载)-BeanCopier相关
    java代码之美(12)---CollectionUtils工具类(转载)
    Lombok-注解@Slf4j的使用
  • 原文地址:https://www.cnblogs.com/hhx626/p/8320408.html
Copyright © 2011-2022 走看看