【问题标题】:Is dumping a lot of DataInputStreams bad practice?倾倒大量 DataInputStreams 是不好的做法吗?
【发布时间】:2023-04-07 19:57:01
【问题描述】:

假设我有一个包含 3 维向量的数据类。

class Vec3 {
    float x, y, z;
    public Vec3(float x, float y, float z) { /* ... */ } 
} 

然后我想赋予它从流中读取的功能。我有花车,所以最简单的选择是DataInputStream

public static Vec3 read(DataInputStream in) {
    float x = in.readFloat();
    float y = in.readFloat();
    float z = in.readFloat();
    return new Vec3(x, y, z);
} 

当然,我希望它支持所有InputStream 类型。因此,我将创建一个包含任何流的重载。

public static Vec3 read(InputStream in) {
    return read(new DataInputStream(in));
} 

但是,此方法会创建一个DataInputStream,它永远不会关闭,只是在读取后转储。这是不好的做法,会导致问题吗?如果我有很多 Vec3 要阅读怎么办?

【问题讨论】:

    标签: java datainputstream


    【解决方案1】:

    DataInputStream 是对InputStream 的薄包装,几乎没有自己的资源。他们的close() 方法只关闭包装的输入流。创建大量它们仅意味着创建许多临时对象以供 GC 收集。创建和丢弃许多 DataInputStream 对象没有危险,但如果您尝试优化性能,则可能需要避免它。

    另一方面,尝试支持所有输入流类型对我来说似乎是一种过度概括。我会让该方法只接受DataInputStreamDataInput 接口。

    【讨论】:

      【解决方案2】:

      据我所知,您打算做的事情是安全的。 (DataInputStream 不做任何缓冲……但如果您使用已弃用的 readLine 方法,则预读可能会出现问题。)

      但是,创建大量临时 DataInputStream 实例确实会产生相关成本,因此如果您关心性能,则应避免这样做。


      当然,我希望它支持所有 InputStream 类型 ....

      我没有看到“当然”。如果它会对性能产生影响,那么也许你不应该那样做。仅仅因为您认为某人可能想要使用重载而这样做可能是个坏主意。

      另一方面,您可以将其留给使用您的 API 的程序员来决定是否使用“方便”重载。

      【讨论】:

        【解决方案3】:

        将签名更改为 DataInputStream 并强制调用者提供它。然后保存它们是调用者的问题 :-) 但他也比你更能保存它们。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-13
          • 1970-01-01
          • 2020-09-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多