Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

リソースの確認方法

ストリームなんかのリソースを close メソッドで閉じますが本当に閉じられているか確認するにはどうしたらいいでしょうか?
「Java io リソース解法確認方法」で検索してみましたが見つけられませんでした。
ちなみにリソースを閉じたオブジェクトが null になるのかなって思ってチェックを入れてみましたが null にはなってないようです。
close メソッドは finally 句に入れてみました.
try 句でも結果は同じでした.
根本適に考え方を間違ってる恐れも大なのでアドバイスいただけるとうれしいです。
よろしくお願いします.

9

回答

88124

閲覧

9件の回答

評価

0

何故それをやりたいのか、理由を教えてもらえますでしょうか?

評価

0

特に理由はないのですが、finally句に closeメソッドを書いとけば必ず閉じられると推奨されているのでそれを確認したいだけのことです。
ストリームがオープン状態かクローズ状態かの確認っていったいどうすればいいのでしょうか?

評価

0

>closeメソッドを書いとけば必ず閉じられる
必ず「閉じるルートを通る」の読み間違い。

もっとも、「必ず」というのは語弊があるが、環境的な問題でもない限りはまず「必ず」と言っていい。

評価

0

もしかして・・・

期待される結果
「closeメソッドを実行したら、そのstreamを格納していた変数が即座にnullになる」

そう考えた理由
「finally句に closeメソッドを書いとけば必ず閉じられると推奨されている」

実際の結果
「closeメソッドの直後の行でSystem.out.println()を実行して結果を見るとnullではなかった」

ということでしょうか?

ご希望の確認方法を探すよりも、ガベージコレクションについて調べたほうがいいような気がします。

評価

0

>ストリームがオープン状態かクローズ状態かの確認っていったいどうすればいいのでしょうか?

close()を呼んだ後で、
実際にデータを読み出してみればいいのでは。
読み出せなかったら、IOExceptionが返るでしょ。

評価

0

Rさん、$さん、不良社員さん、レスありがとうございます。

下記のようなコードを実行させてみました。

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class CloseTest {

    public static void main(String[] args) {

        try {
            FileReader in = new FileReader("C:\\file.txt");
            BufferedReader br = new BufferedReader(in);
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
            br.close();
            in.close();
            System.gc();
            if (br == null) {
                System.out.println("br : null");
            }else{
                System.out.println("br : notNull");
            }
            if (in == null) {
                System.out.println("in : null");
            }else{
                 System.out.println("in : notNull");
            }
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }


        } catch (IOException e) {
            System.out.println(e);
        }finally {
            System.out.println("終わり");
        }

    }
}

実行結果は

1982
Sun
2010
END
br : notNull
in : notNull
java.io.IOException: Stream closed
終わり

となり不良社員さんの指摘のとおりエラーが確認されました。
ストリームオブジェクトは close メソッドによって閉じられても null にはならない(すぐならない?)ようです。
今回のコードでは finally 句に close メソッドをかいてませんが結果は同じでしょう。
Rさんの推測どおり私はcloseメソッドが実行されストリームが閉じられたら即座に null になって GC 対象とされると思ってました。
今ひとつ仕組みが良く理解できてないので恐縮ですけど close メソッドが実行されてから JVM によって適時 null にして GC されるってことなのでしょうか?
Java SE 7 から自動リソース解放機能が搭載されるからあまり深く追求するようなことではないかもしれませんがよろしくお願いします。

評価

0

まず、基本的なことから・・オブジェクトはnullにはなりません。なるのはオブジェクトを指し示している変数です。
そして、自分自身を指し示している変数をnullにするというメソッドというのは存在していません。

一度、「参照変数」という言葉を再確認してみることをおすすめします。

その後、もう一人のRさんの言うとおりガーベッジコレクションについても再確認してみるといいかもしれません。

評価

0

>今ひとつ仕組みが良く理解できてないので恐縮ですけど close メソッドが実行されてから JVM によって適時 null にして GC されるってことなのでしょうか?

Streamの状態がオープンかクローズかと、
そのStreamを格納した変数がnullかどうかは、
ぜんぜん別の話だ。混同してんじゃないよ。

だいたい、参照されているオブジェクトをnullに
勝手にするような動作は、Javaにはない。
んなヤバイ言語、使ってられるか。

「スレ主さんにとって不必要」てな主観なんぞ、
Javaには、なんの関係もない。

>(別の)R 氏
>なるのはオブジェクトを指し示している変数です。

「自分で明示的に変数にnullを代入をしでもしないかぎりは」
ってつけてくれ。
それとも、俺が間違ってる?(・ω・)

評価

0

日本語ムツカシイデスw

>不良社員さんの指摘
その通りです。
スレの流れから、closeメソッドが変数をnullにするような印象を与えてしまうような書き方だったかもしれませんね、yさんすみません。

簡潔にいうと次のようなことが言いたかったのです。
「(どんな場合でも)nullは変数に対して設定される状態のことです。」

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。