数据流
数据流支持原始数据类型值(boolean、char、byte、short、int、long、float和double)以及String值的二进制I/O,所有数据流都实现DataInput接口或DataOutput接口,本节重点介绍这些接口最广泛使用的实现,DataInputStream和DataOutputStream。
DataStreams示例通过写出一组数据记录,然后再次读取它们来演示数据流,每条记录包含三个与发票上的条目相关的值,如下表所示:
订单记录 | 数据类型 | 数据描述 | 输出方法 | 输入方法 | 样例值 |
---|---|---|---|---|---|
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中的关键代码,首先,程序定义了一些常量,包含数据文件的名称和将写入的数据:
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而不是返回值。
另请注意,DataStream中的每个专用write都与相应的专用read完全匹配,程序员应该确保以这种方式匹配输出类型和输入类型:输入流由简单的二进制数据组成,没有指示单个值的类型或它们在流中开始的位置。
DataStreams使用一种非常糟糕的编程技术:它使用浮点数来表示货币值,通常,浮点对于精确值是不利的,对于小数部分尤其不好,因为常见值(例如0.1)没有二进制表示。
用于货币值的正确类型是java.math.BigDecimal,不幸的是,BigDecimal是一种对象类型,因此它不适用于数据流,但是,BigDecimal将使用对象流,这将在下一节中介绍。
上一篇:命令行I/O 下一篇:对象流文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/72961.html
摘要:资源获取方式根据下面的索引,大家可以选择自己需要的资源,然后在松哥公众号牧码小子后台回复对应的口令,就可以获取到资源的百度云盘下载地址。公众号二维码如下另外本文会定期更新,松哥有新资源的时候会及时分享给大家,欢迎各位小伙伴保持关注。 没有一条路是容易的,特别是转行计算机这条路。 松哥接触过很多转行做开发的小伙伴,我了解到很多转行人的不容易,记得松哥大二时刚刚决定转行计算机,完全不知道这...
Java™ 教程 Java教程是为JDK 8编写的,本页面中描述的示例和实践没有利用在后续版本中引入的改进。 Java教程是希望使用Java编程语言创建应用程序的程序员的实用指南,其中包括数百个完整的工作示例和数十个课程,相关课程组被组织成教程。 覆盖基础知识的路径 这些教程以书籍的形式提供,如Java教程,第六版,前往Amazon.com购买。 入门 介绍Java技术和安装Java开发软件并使用...
摘要:前两篇教程我们介绍了如何搭建的本地环境最简单的入门教程之一环境搭建以及如何用读取里的记录最简单的入门教程之二使用访问这篇教程我们会介绍如何使用代码来连接。代码如下和教程二相比,上述代码的方法里还展示了如何用代码给数据库里增加记录。 前两篇教程我们介绍了如何搭建MongoDB的本地环境: MongoDB最简单的入门教程之一 环境搭建 以及如何用nodejs读取MongoDB里的记录: M...
摘要:前两篇教程我们介绍了如何搭建的本地环境最简单的入门教程之一环境搭建以及如何用读取里的记录最简单的入门教程之二使用访问这篇教程我们会介绍如何使用代码来连接。代码如下和教程二相比,上述代码的方法里还展示了如何用代码给数据库里增加记录。 前两篇教程我们介绍了如何搭建MongoDB的本地环境: MongoDB最简单的入门教程之一 环境搭建 以及如何用nodejs读取MongoDB里的记录: M...
阅读 1120·2023-04-26 02:46
阅读 623·2023-04-25 19:38
阅读 638·2021-10-14 09:42
阅读 1234·2021-09-08 09:36
阅读 1353·2019-08-30 15:44
阅读 1318·2019-08-29 17:23
阅读 2236·2019-08-29 15:27
阅读 801·2019-08-29 14:15