`
红桃貳
  • 浏览: 40366 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java 学习笔记- I/O - DataStream

 
阅读更多

Data Streams支持 primitive 数据类型以及字符串类型的字节流I/O,所有的Data Stream 类都实现了DataInput 与DataqOutput 这两个接口,在实现这两个接口的类中最为常用是:DataInputStream,DataOutputStream。官方文档的例子:

package io.datastream;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class DataStreams {

    static final String dataFile = "D:\\360云盘\\javase\\src\\io\\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" };

    public static void main(String[] args) throws IOException {
        DataOutputStream out = null;
        try {
            out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(dataFile)));
            for (int i = 0; i < prices.length; i++) {
                out.writeDouble(prices[i]);
                out.writeInt(units[i]);
                out.writeUTF(descs[i]);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (out != null) {
                out.close();
            }
        }

        // ========================= Read the file ============

        DataInputStream in = null;
        double price;
        int unit;
        String desc;
        double total = 0.0;
        try {
            in = new DataInputStream(new BufferedInputStream(new FileInputStream(dataFile)));
            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 += price * unit;
                }

            } catch (EOFException e) {
                e.printStackTrace();
            }
            System.out.format("Total amount %.2f", total);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            in.close();
        }
    }
}

 这段代码是先将3个分别存放着相同个数,不同primitive类型或字符串类型的数组的数据写到invoicedata文件中,然后再将这些数据从文件中读出。上面这段代码的运行结果为:

 

运行结果1: 
You ordered 12 units of Java T-shirt at $19.99
You ordered 8 units of Java Mug at $9.99
You ordered 13 units of Duke Juggling Dolls at $15.99
You ordered 29 units of Java Pin at $3.99
You ordered 50 units of Java Key Chain at $4.99
java.io.EOFException
at java.io.DataInputStream.readFully(DataInputStream.java:197)
at java.io.DataInputStream.readLong(DataInputStream.java:416)
at java.io.DataInputStream.readDouble(DataInputStream.java:468)
at io.datastream.DataStreams.main(DataStreams.java:51)
Total amount 892.88

 上面得到的结果都是正常的,但是如果将上面的代码稍作改动:

 

 

package io.datastream;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class DataStreams {

    static final String dataFile = "D:\\360云盘\\javase\\src\\io\\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" };

    public static void main(String[] args) throws IOException {
        DataOutputStream out = null;
        DataInputStream in = null;
        double price;
        int unit;
        String desc;
        double total = 0.0;

        try {
            out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(dataFile)));
            for (int i = 0; i < prices.length; i++) {
                out.writeDouble(prices[i]);
                out.writeInt(units[i]);
                out.writeUTF(descs[i]);
            }
            
            // ========================= Read the file =====================
            in = new DataInputStream(new BufferedInputStream(new FileInputStream(dataFile)));
            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 += price * unit;
                }

            } catch (EOFException e) {
                e.printStackTrace();
            }
            System.out.format("Total amount %.2f", total);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (in != null) {
                in.close();
            }
            if (out != null) {
                out.close();
            }
        }

    }
}

 

 将读取文件的代码移动写入文件代码片段后面,而且是在同一个try里面,也就是在outputstream关闭之前读取,其结果:

 

运行结果2 
java.io.EOFException
at java.io.DataInputStream.readFully(DataInputStream.java:197)
at java.io.DataInputStream.readLong(DataInputStream.java:416)
at java.io.DataInputStream.readDouble(DataInputStream.java:468)
at io.datastream.DataStreams.main(DataStreams.java:42)
Total amount 0.00
 也就是读取文件的代码并没有读到希望读到的数据。
所以我猜测再输出流关闭之前对文件的修改,输入流是读取不到了?
不知道是不是这样?请懂的多多赐教。
后来发现,在输出流向文件写入完以后调用一下flush方法,这样DataInputStream 就可以读取到文件的内容了,其中,flush方法就是把数据流从内存刷新到文件中。
分享到:
评论

相关推荐

    flink系列-使用/教程/实例/配置/文档/代码.zip

    你可以使用Java或Scala API编写Flink程序,也可以利用Table API和SQL进行更直观的编程。在资源包中,你可能会找到如何设置本地或集群环境,如何使用命令行工具提交作业,以及如何查看作业状态和日志的教程。 三、...

    HadoopCon2016-Apache-Flink-Tutorial-DataStream-API

    ### Apache Flink DataStream API 教程:深入理解流处理技术 #### 一、概述 在本次教程中,我们将深入探讨 Apache Flink 的 DataStream API,这是一个强大的工具,用于实现高性能的大规模数据流处理任务。Flink 的...

    PyPI 官网下载 | pytorch_datastream-0.3.8-py36-none-any.whl

    "pytorch_datastream-0.3.8-py36-none-any.whl"正是这样一个专为PyTorch设计的数据流库,它旨在简化数据预处理和管理,提高数据处理的效率。 首先,我们要明确pytorch_datastream的核心功能。这个库提供了一种流式...

    java io 2nd

    通过《Java I/O, 2nd Edition》的学习,开发者可以深入掌握Java I/O编程的方方面面,无论是数据的基本读写,还是网络通信、数据压缩、文件归档等高级I/O操作。这本书为Java I/O操作提供了全面而深入的指南,是Java...

    PyPI 官网下载 | datastream-0.1.1.tar.gz

    本资源“datastream-0.1.1.tar.gz”是从Python的官方软件包索引(PyPI)获取的,它是一个名为"datastream"的Python库的版本0.1.1的压缩包。 首先,让我们了解一下PyPI(Python Package Index)。PyPI是Python开发者...

    datastream-client-js:用于连接到IDEX Datastream Realtime API的Typescript库

    @ auroradao / datastream-client 此monorepo提供了必要的程序包,可轻松将Javascript / Typescript应用程序连接到IDEX Datastream API。 它包括各种连接器,可让您根据您的环境选择最佳的WebSocket实现。 客户端...

    flink-java-本地例子

    在本教程中,我们将深入探讨"flink-java-本地例子"这一主题,它涉及Apache Flink的Java API以及如何在本地环境中运行Flink程序。Apache Flink是一个强大的开源流处理和批处理框架,广泛用于实时数据处理。我们将讨论...

    vicon-datastream-sdk:具有cmake支持的非正式VICON DataStream SDK

    vicon-datastream-sdk 具有cmake支持的非正式VICON DataStream SDK 从1.8.0版开始,VICON DataStream SDK在MIT许可下可用。 这个非正式的分支包含SDK以及对cmake构建系统的支持,可轻松集成到基于cmake的项目中。 您...

    java8源码-flinkstudy:flink学习

    包括java8,es,flink等学习(java和scala,可以阅读源码) 见: flink-table-common:通过自定义函数、格式等扩展表生态系统的通用模块。 flink-table-api-java:使用 Java 开发 Table & SQL API 依赖(早期开发...

    阿里云Blink DataStream开发

    阿里云Blink DataStream开发,集成datahub,通过blink 获取datahub相关数据,将数据进行转化成对象,由于实时数据是binlog日志,所以对数据进行过滤,数据输出时需要将对象转化成json对象提供给下游,所以集成了...

    Flink学习精要-Java版-最终修订版

    《Flink学习精要-Java版-最终修订版》 Flink,作为Apache软件基金会旗下的一个开源大数据处理框架,自其诞生以来,便受到了广泛关注,特别是在国内,以阿里巴巴为代表的互联网巨头对其投入了大量的研发资源,使其...

    Flink学习笔记.docx

    Flink 学习笔记 Apache Flink 是近年来越来越流行的一款开源大数据计算引擎,它同时支持了批处理和流处理。Flink 的主要特点是它可以实时处理大规模数据,并且可以与其他大数据处理工具集成,例如 Hadoop、Spark 等...

    java io流PPT课件.pptx

    在Java中,IO流的概念首次被引入是为了方便数据在不同源和目的地之间流动,它将各种I/O操作抽象为流的形式。本章节将深入探讨Java IO流的基本原理、分类以及常用类。 首先,让我们了解什么是流。在计算机科学中,...

    基于Flink CDC使用datastream方式全量增量同步mysql to mysql

    基于Flink CDC使用datastream方式全量增量同步mysql to mysql 使用的是java语言,只需配置完源数据库和目标数据库信息,运行MysqlCDC中的main函数,即可实现多库多表同步。

    Datastream7i的帮助文件

    总的来说,这个压缩包可能是一个学习和参考Datastream7i EAM系统的资源集合,包括可能的培训材料、实用指南以及可能的案例分析。用户可以通过这些资料深入理解Datastream7i的功能,了解如何有效地实施和利用EAM策略...

    用Flume采集多台机器上的多种日志并存储于HDFS

    a1.sinks.k1.hdfs.fileType=DataStream a1.sinks.k1.hdfs.rollCount=0 ``` 这里的配置中,`%{type}` 表示根据日志类型将数据写入不同的HDFS路径下;`%Y%m%d` 表示根据日期动态创建文件夹,这样可以方便地按照日期对...

    hpcc-java-streaming-example:HPCC 的 Java 流示例

    javac DataStream.java javac Row.java 然后您可以通过以下方式启动 ECL: ecl run data-stream.ecl --target hthor --server=localhost:8010 您应该看到以下输出: &lt;Row&gt;&lt;value&gt;row&lt;/value&gt;&lt;/Row&gt; &lt;Row&gt;...

    flink(java)笔记

    **Flink(Java)笔记** 在大数据处理领域,Apache Flink是一个开源的流处理和批处理框架,以其高效、实时和容错性而备受推崇。本笔记将专注于使用Java API来操作Flink,以帮助开发者深入理解其核心概念和功能。 ### ...

    datastream7i

    在IT领域,特别是企业级数据管理与集成解决方案中,Datastream Systems, Inc.是一家领先的公司,其旗舰产品Datastream 7i(以下简称DS7i)是行业内的佼佼者。根据给定文件的信息,我们可以深入探讨DS7i的概述、功能...

Global site tag (gtag.js) - Google Analytics