用Java编写文件时如何避免额外的头字节?

2024-01-12

首先,我没有使用高水平Java默认序列化将对象写入文件中。我是manually在文件中写入一些基本类型变量。这是示例:

public class TestMain {
    public static void main(String[] args) {
        ObjectOutputStream out = null;
        try {
            out = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("Test.bin")));

            out.writeInt(1024);
            out.writeInt(512);
            out.writeInt(256);
            out.writeInt(128);

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

现在我已经测试了创建的文件“Test.bin”。文件大小是22 bytes。但是计算我实际在文件中写入的内容,文件大小应该是16 bytes. [int每个为 4 个字节。 4int变量。所以 4 * 4 = 16 字节。]

那么额外的是什么6 bytes? [22 - 16 = 6 字节] 我已经使用十六进制编辑器测试了该文件。这就是我发现的:

交流 20 05 77 1020 20 04 20 20 20 02 20 20 20 01 20 20 20 20 80

我用不同的代码测试了更多文件。我发现文件的前 5 个字节完全相同。第 6 个字节代表实际尺寸该文件应该是什么。在这个例子中,它是10十六进制,即十进制 16 - 这是正确的。

现在,我的问题是如何在 Java 中避免这些字节?为什么即使对于原始类型也要保存它们?我的真实应用程序仍然具有用于版本兼容性目的的显式标头信息。我不需要 Java 的额外字节用于任何目的。虽然它是6 bytes,简直就是浪费。


从文档ObjectOutputStream http://docs.oracle.com/javase/8/docs/api/java/io/ObjectOutputStream.html:

原始数据(不包括可序列化字段和可外部化数据)以块数据记录的形式写入 ObjectOutputStream。块数据记录由头和数据组成。块数据标头由标记和标头后面的字节数组成。连续的原始数据写入被合并到一个块数据记录中。用于块数据记录的块因子将为 1024 字节。每个块数据记录最多将填充 1024 字节,或者在块数据模式终止时写入。对 ObjectOutputStream 方法 writeObject、defaultWriteObject 和 writeFields 的调用最初会终止任何现有的块数据记录。

如果你只想写bytes,使用FileOutputStream http://docs.oracle.com/javase/8/docs/api/java/io/FileOutputStream.html.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用Java编写文件时如何避免额外的头字节? 的相关文章

随机推荐

  • 我如何让 Eclipse 将 .ejs 文件解释为 .html?

    我最近开始了一个节点项目 我使用的两个模块是express和EJS 但默认情况下我通常使用 eclipse 作为我的 IDE 它对于 java 运行良好 对于 html 和 javascript 也很不错 但我遇到的一个问题是 对于 ejs
  • 在 Vim 中打开特定文件的快捷方式?

    有没有办法在我的系统中配置快捷方式 vimrc自动在新缓冲区中打开特定文件 我有一个经常需要访问的文件 我想在编码或写入会话期间在新缓冲区中快速打开该文件 我并不是在寻找可以使用 Command T 或 PeepOpen 实现的模糊搜索 而
  • Android 发送包含 PDF 文件的邮件

    我正在尝试发送位于设备上文件夹中的 PDF 文件 文件已选择并发送 但它是空的 我哪里错了 String inviare n fr getText toString Uri uri Uri fromFile new File Environ
  • 如何在数据表中创建可水平滚动的单元格

    这是 PrimeFaces 的情况 但我认为这个问题同样适用于标准 JSF 数据表 我有一个数据表列 其中的条目被自动换行 因为内容可能很长 为了使显示更具可读性 我希望内容不被换行 而是提供水平滚动来查看默认情况下不显示的任何内容 我确信
  • Gson 中的 Stackoverflow 异常

    我正在尝试使用 Gson 库将 Json 字符串解析为 Java 对象 但遇到了 StackoverflowException java lang StackOverflowError com google gson internal Gs
  • 将NodaTime转换为Unix时间戳以及LocalDateTime的重要性

    我目前正在使用 NodaTime 因为我对 C 中的时区处理感到沮丧DateTime班级 到目前为止 我真的很高兴 public static string nodaTimeTest string input var defaultValu
  • AWS SageMaker - 在本地训练但部署到 AWS?

    我在使用 SageMaker 时面临以下挑战 我已经下载了一本教程笔记本 https github com awslabs amazon sagemaker examples blob master sagemaker python sdk
  • Json 解析器捕获 Java 中的尾随逗号?

    我使用以下命令来检查 json 文件是否有效 JsonParser parser new JsonParser parser parse new String Files readAllBytes Paths get filePath to
  • 是否有干净的方法将上下文数据传递给 @Asynchronous ejb 调用?

    在 Wildfly 中 我异步执行无状态 ejb 方法 它使用 Asynchronous 注释进行映射 在调用方法中 我在线程本地有一些上下文信息 将此数据传递给异步方法的最佳方法是什么 我不想向异步方法签名添加额外的参数 本质上你只有两个
  • 使用 SqlMembershipProvider 禁用帐户锁定

    如何禁用账户锁定功能SqlMembershipProvider MSDN 文档的最大无效密码尝试次数 http msdn microsoft com en us library system web security membership
  • Python - 比 2 个嵌套 for 循环更快的东西

    def fancymatching fname1 fname2 This function will do much smarter and fancy kinds of compares if fname1 fname2 return 1
  • C# 如何为集合创建公共 getter 和 setter 以及私有方法?

    我想要一个带有 例如 SortedList 集合 SrtdLst 属性的类 A 并且在该类 A 内允许添加或减去 SrtdLst 项目 但在 A 类的实例中 只允许获取或设置项目的内容 不允许添加新项目或减去现有项目 在代码中 class
  • 获得我的域名 (facebook) 上的所有点赞

    我正在尝试获取我的域上的点赞统计信息 我希望获得我的域 有数万个页面 上所有页面的所有赞 如果可能的话 使用用户 ID domain like adds 实际上返回什么 从洞察中选择指标和价值 WHERE object id 域 ID AN
  • 如何产生多点线性插值? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个线性插值方法 这是当 x1 y1 x2 y2 和 x0 已知时计算插值 计算y0值 但我需要在已知多点时执行此操作 我不是在谈
  • 从Python中的ArgumentParser解析的args创建arg字符串[重复]

    这个问题在这里已经有答案了 如果我有一个argparser ArgumentParser 加上返回的命名空间parser parse args 是否有一种简单的方法可以将命名空间转换回 argv 列表 以便它们可以传递回程序 本质上 par
  • lexical_cast int 到 string

    忽略异常是否安全boost lexical cast http www boost org doc libs 1 42 0 libs conversion lexical cast htm转换时int to std string 转换时词法
  • python3 解压缩元组列表

    在python2 7中 以下代码取字典fd 在本例中表示单词及其计数的频率分布 并将其分成两个列表的列表 键 值 sortedDKandVs zip sorted fd items key itemgetter 1 reverse True
  • For 循环未针对浮点值运行

    我有一个如下所示的 for 循环 此代码打印 i 的值直到 9 6 而不是 10 为什么它最后返回i 10的值 Use 来增加它 而不仅仅是加 就像现在一样 对我来说这是一个无限循环 编辑 由于某种原因 PHP 无法在循环中的不同类型中正常
  • SurfaceView或TextureView组合

    我在尝试着将实时效果应用于相机预览并在多个视图中显示 我能怎么做 就像camera2 https play google com store apps details id com dama camera2 snapshot https l
  • 用Java编写文件时如何避免额外的头字节?

    首先 我没有使用高水平Java默认序列化将对象写入文件中 我是manually在文件中写入一些基本类型变量 这是示例 public class TestMain public static void main String args Obj