【问题标题】:Object Serialization/Deserialization and FileInputStream.available()对象序列化/反序列化和 FileInputStream.available()
【发布时间】:2013-04-11 06:03:13
【问题描述】:

我正在想办法改掉使用无限循环读取对象的整个坏习惯。我的算法涉及迭代检查

if (FileInputStream("myFile.ser").available() != 0) 然后反序列化 next 对象。否则,我会关闭文件。

我想知道这是否是解决此问题的正确方法。

我已阅读此问题的答案:May the FileInputStream.available foolish me? 并且不知道是否为空,它们是否意味着读取指针位于文件末尾。

换句话说,我可以信任FileInputStream.available() 检查还有多少数据可用于从文件中读取?

【问题讨论】:

  • 请检查markdown help :)
  • 是的,该文件与正在使用它的程序位于同一台计算机上。

标签: java file object serialization


【解决方案1】:

不,您永远不应该将InputStream.available() 用于任何事情。该方法的定义(和实现)过于松散,没有任何意义。

为什么无限循环是“坏习惯”?

【讨论】:

  • 如果你是一个多语言程序员,这是一个坏习惯。例如,如果您转而使用 C++ 之类的语言,则必须小心。在那里,它可能会导致机器崩溃!我确实想出了一个替代方案(这将花费 O(33 字节)的数据:将记录数保存到二进制文件中,如下所示:'1。)保存记录数将跨越到二进制文件的字节数' '2.) 将数字逐字节保存到二进制文件中' 这样,您就知道该数字跨越了多少字节,并且可以将其作为 int 数组读取,并将其操作为实际数字!这适用于 2^32-1 个对象。
  • 该算法适用于 Math.pow(2,32) - 1 个对象(数量惊人的对象;在达到这么多对象之前,序列化可能会崩溃!!)
  • @MikeWarren - 无限循环在 c++ 中的工作方式与在 java 中的工作方式没有任何不同。
猜你喜欢
  • 2016-10-14
  • 2014-12-24
  • 1970-01-01
  • 1970-01-01
  • 2015-10-06
  • 2020-02-24
  • 2020-05-03
  • 2013-05-01
  • 2016-11-20
相关资源
最近更新 更多