专栏首页Apache IoTDB什么是文件格式?

什么是文件格式?

java 字节流汇总: java 字节流入门(读文件)

有了之前 4 篇对文件的操作工具之后,终于到了文件格式的介绍部分!本文介绍文件格式的定义,并实现一个自己的文件格式。这个文件格式十分简单,只用来说明原理。

文件格式的定义

wiki 定义:

A file format is a standard way that information is encoded for storage in a computer file. It specifies how bits are used to encode information in a digital storage medium.

翻译一下:

文件格式是将信息进行编码并存储在计算机文件中的标准方式。它指定如何使用字节来编码信息,并存储在数字存储媒介中。

人话:

就是告诉你数据是怎么存在文件中的。有了文件格式,你就可以将数据写成这种格式的文件,并且将数据从这种格式的文件中读出来。文件格式的本质就是一种协议。

举个例子,word、excel、PPT 就是文件格式,他们按照自己的格式进行组织,计算机中不同的文件后缀就代表不同格式的文件,同样格式的文件的内容可以不同。

开发一种文件格式,一般都需要开发读写接口。最简单的写接口是将一个数据写入到文件中,最简单的读接口就是把里边的所有数据全部读出来(这里的读出来,一般需要以用户可认识的格式读出来。不能用户写了个a,你读出来个#,然后跟用户说 # 就是 a ,这是耍流氓)。

再举例子,word 给人提供了一个界面,让你可以写文字。保存关闭之后再打开。他还能给你展示之前写入的内容,这就是读文件。

文件格式一般包含两部分:data 和 metadata。data 即数据;metadata 即元数据(描述数据的数据),比如这个文件中一共有几条数据,数据的起始位置是多少,长度是多少。

下面介绍一个自己的文件格式:

实现自己的文件格式!

这个文件格式的功能为:写 int 数据;读取所有数据。

文件结构如下图:因为文件在磁盘上是一维结构,因此文件格式就直接画成一条线了,这个文件格式中,前边是数据,最后是元数据。当然你也可以设计成其他样子,比如元数据和数据交叉存放。这里只介绍一个比较简单的。

原料如下:写流程用到了 ByteArrayOutputStream 和 FileOutputStream。 读流程用到了 RandomAccessFile。这里的 metadata 就是一个 int 类型的 count,记录文件中数据的个数。isWrite 用来判断此实例是读流程还是写流程。一般文件格式都是先写,关闭之后再另起线程进行读取。

两个小工具,用来将 int 和 bytes 间的转换

写入方法:将数据缓存进 baos,计数+1。这时候只把数据的字节数组放在了内存中,还没有真正往文件里写数据。

close 方法:先将 metadata (count)写入 baos 末尾,然后将 baos 中的所有bytes 写入文件。最后关闭文件。

读方法:先读文件末尾的 metadata,再读数据。上边我们说了,metadata 一般包括了数据的个数,所在位置,长度。但是这里的 metadata 只有一个数据的个数。这是不是有问题了?没问题,因为我们的数据都是 int,占 4 个字节,所以数据整体长度就有了。并且我们的数据是从 文件开头开始写的,因此所在位置也是预先知道的。 这就是文件格式,怎么写的怎么读。

另一个方面也不能忽略,那就是 metadata 其实也是一种数据,那么 metadata 我们是怎么读的呢?其实 metadata 也需要自己的 metadata,这样就无穷无尽无止境了,metadta 还有 metadata。。。但是,是有止境的,一般那个终止点再文件的开头或结尾,存储了一个位置相邻的 metadata 的长度。这样,就找到了第一个metadata。之后的就可以一连串找出来了。比如在这个例子中,这个终止点是一个 int,存在文件的末尾,占 4 个字节。

主方法:先起一个实例写文件,再起一个实例读文件。每次用完实例后需要关闭。

运行结果:所有数据被读出来了

总结

是不是很开心,今天我们对文件格式有了一个初步了解,并且实现了一个自己的文件格式。你也可以自己设计文件格式。

一般设计一款文件格式需要考虑以下几个事:

(1)data 和 metadtata 如何组织:放在一起还是分开,metadata有几层等。

(2)写入流程中内存占用:在内存缓存多少数据后刷到磁盘。

(3)如何降低磁盘占用:用什么压缩编码方式。

(4)如何加速查询:用什么索引,如何过滤。

(5)文件是否支持修改:是直接覆盖还是生成新文件。

代码:

https://github.com/qiaojialin/Java-IO-Learning

如果觉得不错,可以推荐给身边的人。还可以随手点赞,长按关注!

本文分享自微信公众号 - IoTDB漫游指南(Apache-IoTDB),作者:乔老师

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-06-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 索引 vs 全表扫描

    索引是数据库的重要技术,本质是用空间换时间,或者放慢写入加速查询。通常我们会将索引和全表扫描来对比,并且一般都会觉得全表扫描很 low,真的是这样吗?

    Apache IoTDB
  • java 字节流入门(内存数组流->文件流)

    本文介绍如何将内存数组流的数据写入文件流中。即将内存数组流中的数据通过文件流写到磁盘上,也叫flush,或持久化。毕竟内存是短暂的,磁盘才是永恒。

    Apache IoTDB
  • 行百里者半九十,文件写90%崩了呢?

    在这里没有对文件有任何的异常处理。假如文件写坏了怎么办?如果一个文件很大,比如你在下片,好几个G,下到一半网断了,是不是很崩溃?这时候就需要断点续传。本文介绍一...

    Apache IoTDB
  • AI 技术讲座精选:如何利用 Python 读取数据科学中常见几种文件?

    前 言 如果你是数据行业的一份子,那么你肯定会知道和不同的数据类型打交道是件多么麻烦的事。不同数据格式、不同压缩算法、不同系统下的不同解析方法——很快就会让你...

    AI科技大本营
  • slice 去重

    solate
  • python 等差数列末项计算方式

    思路一:等差数列,先求差m是多少,第n项的值很多种方法算,我就采用这种a1 + m*(n-1)

    砸漏
  • 区块链数字内容播客平台ContentASTBoxOX登陆区块链应用落地

    加利福尼亚州旧金山,2018年5月25日讯——由前谷歌人王小雨创立的Castbox,一个屡获殊荣的全球播客内容平台应用,于今日宣布推出一个为分散式数字内容产业所...

    区块链领域
  • 图像处理基础-均值滤波

    图像处理中,有几种常见的基础算法,比如“模糊”、“灰度”、“浮雕”、“黑白”、“底片”、“锐化”。这篇文章讲述采用“均值滤波”的算法实现“模糊”。

    sumsmile
  • DataOps数据仓库与建设 顶

    当一个交换机出现故障,SRE去排查问题的时候往往是执行一堆命令最后根据命令的结果做出结论性的判断。实际上这里有2个步骤:

    BGBiao
  • 3(文件IO,不带缓冲的IO)

    成功则返回文件描述符,失败则返回-1 第三个参数写成/*mode_t mode */ 表示这个参数仅在创建新文件时使用 Pathname表示要打开或者创...

    提莫队长

扫码关注云+社区

领取腾讯云代金券