Swing/ProgressMonitorInputStream のバックアップソース(No.3)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- バックアップ を表示
- Swing/ProgressMonitorInputStream へ行く。
- 1 (2013-04-22 (月) 03:35:42)
- 2 (2013-09-16 (月) 20:04:19)
- 3 (2014-02-04 (火) 15:03:27)
- 4 (2014-12-19 (金) 14:13:43)
- 5 (2014-12-19 (金) 21:05:16)
- 6 (2015-09-17 (木) 18:10:52)
- 7 (2016-05-30 (月) 16:11:37)
- 8 (2017-08-16 (水) 17:31:33)
- 9 (2018-08-22 (水) 20:05:54)
- 10 (2020-08-16 (日) 17:12:26)
- 11 (2022-01-14 (金) 07:59:19)
- 12 (2024-02-16 (金) 08:25:14)
TITLE:ProgressMonitorInputStreamを使用してテキストファイルのダウンロード状況を表示 #navi(../) #tags(ProgressMonitorInputStream, ProgressMonitor, JProgressBar, SwingWorker, URLConnection, JTextArea) RIGHT:Posted by &author(aterai); at 2013-04-22 * ProgressMonitorInputStreamを使用してテキストファイルのダウンロード状況を表示 [#e62dec86] `ProgressMonitorInputStream`を使用してテキストファイルのダウンロード状態を進捗表示します。 #download #ref(https://lh4.googleusercontent.com/-gXnU23f7iiw/UXQuzmKdfVI/AAAAAAAABp8/aPk0QR78NlY/s800/ProgressMonitorInputStream.png) ** サンプルコード [#pabe4298] #code(link){{ worker = new SwingWorker<String, Chunk>() { @Override public String doInBackground() { Charset cs = Charset.forName("EUC-JP"); String ret = "Done"; String path = "http://terai.xrea.jp/"; URLConnection urlConnection; try{ urlConnection = new URL(path).openConnection(); System.out.println(urlConnection.getContentEncoding()); System.out.println(urlConnection.getContentType()); String encoding = urlConnection.getContentEncoding(); if(encoding!=null) { cs = Charset.forName(encoding); }else{ String contentType = urlConnection.getContentType(); for(String value: contentType.split(";")) { value = value.trim(); if(value.toLowerCase().startsWith("charset=")) { encoding = value.substring("charset=".length()); } } if(encoding!=null) { cs = Charset.forName(encoding); } } System.out.println(cs); }catch(Exception ex) { ex.printStackTrace(); ret = "Error"; return ret; } int length = urlConnection.getContentLength(); try(InputStream is = urlConnection.getInputStream(); ProgressMonitorInputStream pmis = new ProgressMonitorInputStream(frame, "Loading", is); BufferedReader reader = new BufferedReader(new InputStreamReader(pmis, cs))) { monitor = pmis.getProgressMonitor(); monitor.setNote(" "); //Need for JLabel#getPreferredSize monitor.setMillisToDecideToPopup(0); monitor.setMillisToPopup(0); monitor.setMinimum(0); monitor.setMaximum(length); int i = 0; int size = 0; String line; while((line = reader.readLine()) != null) { if(i++%50==0) { //Wait Thread.sleep(10); } size += line.getBytes(cs).length + 1; //+1: \n String note = String.format("%03d%% - %d/%d%n", 100*size/length, size, length); publish(new Chunk(line, note)); } }catch(InterruptedException | IOException ex) { ret = "Exception"; cancel(true); } return ret; } @Override protected void process(List<Chunk> chunks) { for(Chunk c: chunks) { textArea.append(c.line+"\n"); monitor.setNote(c.note); //System.out.println(c.note); } textArea.setCaretPosition(textArea.getDocument().getLength()); } @Override public void done() { frame.getGlassPane().setVisible(false); runButton.setEnabled(true); String text = null; try{ text = isCancelled() ? "Cancelled" : get(); }catch(Exception ex) { ex.printStackTrace(); text = "Exception"; } System.out.println(text); } }; worker.execute(); }} ** 解説 [#xaf420db] 上記のサンプルでは、`URLConnection`から開いた`InputStream`に`ProgressMonitorInputStream`をラップして、ファイルのダウンロード進捗状態を`ProgressMonitor`で表示しています。 - `ProgressMonitorInputStream`の使用する`ProgressMonitor`の最大値は、ファイルサイズ(バイト) -- `ProgressMonitorInputStream`がデフォルトで設定する最大値は、`InputStream#available()`の値 -- この値がダウンロード中のストリームの合計バイト数を返す訳ではないので、これを最大値のままにしておくと、`ProgressMonitor`が表示されない、またはすぐ閉じてしまう -- `URLConnection#getContentLength()`で取得したバイト数を`ProgressMonitor#setMaximum(...)`で設定 - 一行ずつ`JTextArea`に文字列として読み込ませるために、`InputStreamReader`を使用しているので、エンコードを`URLConnection#getContentEncoding()`や`URLConnection#getContentType()`などで取得 -- 何パーセント読み込んだかを`ProgressMonitor#setNote(...)`で表示する場合は、一行が何バイトかを`String#getBytes(Charset)`で取得して計算 -- 注: 改行は`1`バイトで決め打ちしている -- 進捗を表示する前に`ProgressMonitor#setNote("dummy note");`としておかないと、`Note`に使用する`JLabel`が`null`のままで表示されない、またはレイアウトがおかしくなる ** 参考リンク [#ie55372f] - [[ProgressMonitorがダイアログを表示するまでの待ち時間>Swing/MillisToDecideToPopup]] ** コメント [#f8c160df] #comment