3

FileOutputStreamたとえば、コードを乱雑にすることなく 使用するための最良の方法は何ですか。

次のコードの例:

私がする必要があるのは:

FileOutputStream fOut = new FileOutputStream(file);    
while(!Thread.currentThread().isInterrupted()){  
   fOut.write(data);  
   //other code  
}   

しかし、例外を追加すると、処理がすべて面倒になります。たとえば、次のようなことを考えました。

private FileOutputStream openStream(String file){  
   try{  
      return new FileOutputStream(file);    
   }  
   catch(FileNotFoundException e){  
      return null;  
   }    
 }  

しかし、それは論理を奇妙にします。たとえば、別の方法などでストリームを閉じるときを意味します。
より明確なコードを取得する方法は何ですか

4

4 に答える 4

2

このようなラッパーはどうですか?

public class StreamWrapper {

    private FileOutputStream fileOutputStream;

    public FileOutputStream open(String file) {
        try {
            fileOutputStream = new FileOutputStream(file);
        } catch (FileNotFoundException e) {
            // Define action
        }
        return fileOutputStream;
    }

    public void close() {
        try {
            fileOutputStream.close();
        } catch (IOException e) {
            // Define action
        }
    }

}

そしてそれを次のように使用します:

StreamWrapper wrapper = new StreamWrapper();
FileOutputStream fOut = wrapper.open("file");
// something
wrapper.close();
于 2013-02-19T08:13:18.980 に答える
2

残念ながら、Javaでチェックされた例外を回避する直接的な方法はありません。いくつかの回避策:

別の言語を使用する

はどちらも、チェックされた例外をチェックされていないものとして扱います。

Java7のtry-with-resourcesイディオム

それは実際には役に立ちませんが、周囲catchのブロックの量を大幅に減らします。finallyclose()

Throwables.propagate(Throwable)グアバで

例外を返しnullたり飲み込んだりしないでください。

private FileOutputStream openStream(String file){  
   try{  
      return new FileOutputStream(file);    
   }  
   catch(FileNotFoundException e){  
      return Throwables.propagate(e);  
   }    
 } 

参照:Longtryステートメント

于 2013-02-19T08:13:48.367 に答える
1

適用可能な例外には理由があります(そしてRT例外を好む人は誰もいません...)ファクトリを使用して例外処理を非表示にすることもできますが、コードのどこかに「catch」句を含める必要があります。

1つのアイデアは、インスタンス化中に例外を飲み込む独自のラッパーをFileOutputStreamに実装することですが、例外がコンストラクターでスローされるため、ファイルが実際に存在しない場合は不安定な状態になります。

public class MyFileOutputStream {

private FileOutputStream fis;

public MyFileOutputStream(File file){
    try{
        fis = new FileOutputStream(file);
    } catch (FileNotFoundException e){
        fis = null;
    }
}

public boolean isOpened(){
    return fis!=null;
}

public void write(Byte b) throws IOException {
    fis.write(b);
}

}

于 2013-02-19T08:20:50.010 に答える
0

実行できるオプションがいくつかあります。

まず、サンプルコードが適切であるのは、「例外の場合、nullオブジェクトを返す」ことだけです。したがって、オブジェクトを返すのではなく、FileOutputStream実際にを送信して、オブジェクトをクラス変数としてboolean格納できます。FileOutputStream

したがって、他のプログラムがこの呼び出しを行うことができるアクセスを希望し、呼び出し元がオブジェクトを正常に作成できるかどうかに応じてTrue / Falseを取得し、それがTrueの場合、FileOutputStreamオブジェクトのクラス変数を使用できます。私はそれでいくつかのサンプルコードを添付しています:

FileOutputStream fOutSt;

private boolean isOpenStream(String file){  
       try{  
          fOutSt = new FileOutputStream(file);
          return true;
       }  
       catch(FileNotFoundException e){  
           return false;  
       }    
 } 

次に、発信者は次のように電話をかけることができます。

if(isOpenStream) {
    obj.GetfOutSt;
}
于 2013-02-19T08:17:49.753 に答える