Java™ 教程(数据流)

数据流

数据流支持原始数据类型值(booleancharbyteshortintlongfloatdouble)以及String值的二进制I/O,全部数据流都实现DataInput接口或DataOutput接口,本节重点介绍这些接口最普遍使用的实现,DataInputStreamDataOutputStreamhtml

DataStreams示例经过写出一组数据记录,而后再次读取它们来演示数据流,每条记录包含三个与发票上的条目相关的值,以下表所示:java

订单记录 数据类型 数据描述 输出方法 输入方法 样例值
1 double 条目价格 DataOutputStream.writeDouble DataInputStream.readDouble 19.99
2 int 单位数 DataOutputStream.writeInt DataInputStream.readInt 12
3 String 条目描述 DataOutputStream.writeUTF DataInputStream.readUTF "Java T-Shirt"

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

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写出记录并关闭输出流。github

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必须构造为字节流的包装器。segmentfault

in = new DataInputStream(new
            BufferedInputStream(new FileInputStream(dataFile)));

double price;
int unit;
String desc;
double total = 0.0;

如今,DataStreams能够读取流中的每条记录,报告它遇到的数据。api

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而不是返回值。oracle

另请注意,DataStream中的每一个专用write都与相应的专用read彻底匹配,程序员应该确保以这种方式匹配输出类型和输入类型:输入流由简单的二进制数据组成,没有指示单个值的类型或它们在流中开始的位置。测试

DataStreams使用一种很是糟糕的编程技术:它使用浮点数来表示货币值,一般,浮点对于精确值是不利的,对于小数部分尤为很差,由于常见值(例如0.1)没有二进制表示。

用于货币值的正确类型是java.math.BigDecimal,不幸的是,BigDecimal是一种对象类型,所以它不适用于数据流,可是,BigDecimal将使用对象流,这将在下一节中介绍。


上一篇:命令行I/O

下一篇:对象流

相关文章
相关标签/搜索