我有客户端/服务器应用程序,其中客户端应用程序将打开文件。这些文件被分成大块,并发送到服务器。如何设计:随机访问文件时避免资源泄漏
不仅客户端发送文件块,而且还发送其他数据。每条消息(数据或文件chunk)都有一个优先级。
根据消息的优先级将所有消息缓存并写入TCP流。 当文件完全发送或接收时,当前输入和输出流将在双方(客户机/服务器)上关闭。这意味着流只要发送文件就保持打开状态。
TCP连接被允许失败,因为它将重新连接并且消息发送将被恢复,因此,这些流将在某个点被关闭。
但是,如果和当JVM将被杀死,例如,流不会被清理。
我首先想到解决这个问题的方法是在终结器中添加清理代码,但我明白当JVM被杀死(或者如果调用System.exit)时,这些可能无法运行。
我的第二个想法是重写应用程序的一部分,只需要使用流就可以读取/写入一个块。因此,我最终会打开/关闭文件的次数与块的次数相同。这种方法的优点是允许我使用try-catch-finally构造,但是我有直觉感觉开放和关闭文件,这往往意味着一定的开销。
那么当设计不允许最后{}块时如何清理资源?或者应该避免这样的设计,可能与我所描述的方式类似?
我还担心可能有多少文件打开,因为有优先级(理论上这是无限的)。
大多数文件通常是几个KiB的大,但在某些情况下,它们可能会达到几GB的大。
在此先感谢您的意见。
编辑:添加图像
也许我并不清楚:该流我指的是的FileInputStream/FileOutputStreams。另一方面,TCP连接永远保持联机状态(如果失败,则会发生重新连接)。 – 2012-03-24 13:33:26
我不确定我了解你的问题。通过清理流,你的意思是删除部分转移的文件? – WilQu 2012-03-24 13:39:45
不,我的意思是在不同文件的FileInputStream/FileOutputStream上调用close()。我会尽量画出一些东西来减少这个问题的含义。几分钟后我会回来修改。 – 2012-03-24 13:47:17