假设我有一个包含三维向量的数据类。
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
要阅读怎么办?
答案 0 :(得分:2)
DataInputStream
是InputStream
上的一个瘦包装器,几乎没有自己的资源。他们的close()
方法只关闭包装的输入流。创建大量只是意味着创建许多临时对象供GC收集。创建和丢弃许多DataInputStream
对象没有任何危险,但如果您尝试优化性能,则可能需要避免它。
另一方面,尝试支持所有输入流类型似乎对我来说过于概括。我会让方法只接受DataInputStream
或DataInput
接口。
答案 1 :(得分:1)
据我所知,你提出的建议是安全的。 (DataInputStream
没有进行任何缓冲......但如果您使用弃用的readLine
方法,则预读可能存在问题。)
但是,创建大量临时DataInputStream
实例确实会产生相关成本,因此如果您关心性能,则应避免这样做。
当然,我希望它支持所有InputStream类型....
我当然没有看到""。如果它会产生性能影响,那么也许你不应该这样做。简单地这样做是因为你认为某人可能想要使用重载可能是一个坏主意。
另一方面,您可以将其留给使用您的API来决定是否使用"方便性的程序员。重载。
答案 2 :(得分:0)
将签名更改为DataInputStream并强制调用者提供它。然后保存它们是来电者的问题:-)但是他也比你更能保护他们。