1

アプリケーションのファイルから大きなオブジェクトを読み取ろうとしています。これには時間がかかる可能性があるため、ファイルの読み取りをJProgressBarに接続したいと思います。ファイルの読み取りの進行状況を見つける簡単な方法はありますか?(ロード自体はswingworkerスレッドで行われるため、プログレスバーの更新は問題になりません。)FileInputStreamのreadByte()メソッドをオーバーライドして、ある種のプログレス値を返すことを考えていましたが、これは非常に悪質なようです。仕方。これを実現する方法についての提案は大歓迎です。

ファイルを読み取るためのコードは次のとおりです。

public class MapLoader extends SwingWorker<Void, Integer> {

String path;
WorldMap map;

public void load(String mapName) {
    this.path = Game.MAP_DIR + mapName + ".map";
    this.execute();
}

public WorldMap getMap() {
    return map;
}

@Override
protected Void doInBackground() throws Exception {
    File f = new File(path);
    if (! f.exists())
        throw new IllegalArgumentException(path + " is not a valid map name.");
    try {
        FileInputStream fs = new FileInputStream(f);
        ObjectInputStream os = new ObjectInputStream(fs);
        map = (WorldMap) os.readObject();
        os.close();
        fs.close();
    } catch (IOException | ClassCastException | ClassNotFoundException e) {
        e.printStackTrace();
    }
    return null;
}

@Override
protected void done() {
    firePropertyChange("map", null, map);
}
}
4

3 に答える 3

1

それが私なら、FileInputStreamのオーバーライドを台無しにすることはありません。デコレータはここにぴったりかもしれないと思います。アイデアは、ObjectInputStreamに渡すデコレータ入力ストリームを作成することです。デコレータは読み取りの進行状況を更新し、実際の入力ストリームに委任します。

おそらく最も簡単な解決策は、Apachecommons-ioのCountingInputStreamを使用することです。基本的な手順は次のとおりです。

  • CountingInputStreamのサブクラスをマップローダーの非静的内部クラスとして作成します
  • メソッドをオーバーライドしafterReadます。super.afterReadを呼び出して、更新されたステータスを公開します
  • 新しいデコレータ入力ストリームのインスタンスを出力ストリームに渡し、ファイル入力ストリームをデコレータのコンストラクタに渡します
于 2012-11-10T17:57:07.277 に答える
0

RandomAccessFileを使用すると、 getFilePointer()を呼び出して、読み取られたバイト数を知ることができます。

時間のかかる操作はバックグラウンドスレッドで実行される場合があります。SwingUtilities.invokeLater()を使用してバックグラウンドタスクとGUIスレッド間で通信することを忘れないでください。

于 2012-11-10T17:18:41.773 に答える
0

でオーバーライドすることを検討している場合read()FileInputStream合法的に検討できるのは、progress-monitorコールバックを受け入れる独自のラッパークラスを作成することです。 ただし、バイトごとにメソッド呼び出しを行うのは非常に非効率的であるためInputStream、実装ほど簡単ではないことがわかります。代わりに、もう少し複雑read()なに対処する必要があります。read(byte[], int, int)

于 2012-11-10T17:55:46.680 に答える