2016-05-03 12 views
1

Ich arbeite mich durch einige Sonar Qube Berichte und repariere die Dinge, wo es angebracht ist. Ein Muster, das einige Kollegen in Bezug auf den Dateizugriff verwendet haben, besteht darin, eine RandomAccessFile Instanz zu erstellen und daraus eine Channel zu erhalten. Dieser Kanal kann an den aufrufenden Code zurückgegeben werden, dessen Aufgabe es dann ist, ihn zu schließen. Das Problem ist, dass es durch das Zurückgeben eines Kanals nicht möglich ist, das RandomAccessFile Objekt zu schließen, das es erstellt hat - so beschwert sich Sonar.Ist es genug, um einen Kanal zu schließen oder RandomAccessFile zu schließen?

Ist es in Ordnung, einen Channel zu schließen und den RandomAccessFile zu ignorieren. Ich habe die RandomAccessFile#close() Methode angeschaut und kann sehen, dass es den Kanal schließt, aber die Umkehrung ist nicht wahr.

würde Ein weiteres ähnliches Beispiel eine Klasse der einen Kanal von einem new RandomAccessFile(...) und später in einem anderen Verfahren schließt hat die Channel schafft aber keinen Hinweis auf die RandomAccessFile gehalten. Soll der Code so geändert werden, dass ein Feld auf die Datei zeigt und stattdessen schließt? Oder ist es nicht wichtig?

+0

Was macht der aufrufende Code mit dem Kanal? Kann die Methode, die RandomAccessFile() neu erstellt, mit dem Kanal arbeiten und die Informationen in einem POJO zurückgeben? Ich denke, es ist ein Anti-Pattern für die Weitergabe des Kanals, wenn das Schließen der Datei auch den Kanal schließt, aber das Schließen des Kanals kann die Datei möglicherweise nicht bereinigen. –

+0

Das Schließen schließt entweder das andere. – EJP

Antwort

0

Die API-Dokumentation enthält keine explizite Angabe, was bedeuten kann, dass es keine Garantie gibt.

Angenommen, die Channel ist eine FileChannel, dann ist der Kanal mit der implCloseChannel Methode geschlossen. Wenn Sie die Implementierung betrachten, wird das übergeordnete Element geschlossen, wenn es sich um eine Instanz von Closeable handelt.