Chat&Messenger - チャット & メッセンジャーでビジネスが加速する -
IP Messenger 互換。チャット、メッセンジャー、テレビ会議、スケジュール、文書共有、キャプチャを統合したフリーソフト

Java ファイルコピー(バッファサイズを変更)

Java ファイルコピー(バッファサイズを変更)

 Java で java.io.InputStreamjava.io.OutputStream での 入出力ストリームを利用したコピー処理を行うサンプルプログラムを紹介します。
ストリームを利用したコピー処理では、読み込みバファサイズを大きくすることで、大きなファイルでも比較的高速にコピーを行えます。
サンプルプログラムではデータの読み込みバッファーサイズを引数で指定可能としています。

 指定した読み込みバファ領域はJavaVMのヒープ内に確保されますので、あまり大きくしすぎても効率が悪くなります。そのため、ファイルをコピーする上で、効率の良いデータ読み込みバッファサイズについても同時に確認します。

サンプルプログラム

実行

 サンプルプログラムのファイルコピーを行うために、Cドライブ直下に 100MB のファイル「100M.txt」を用意しました。サンプルプログラムでは、 C:\100M.txt を、バッファサイズ 1000KB 単位でデータを読み込み C:\a.txt にコピーします。

尚、サンプルの実行は以下の環境で行いました。
OS : WindowsXP
CPU : Athlon 1.46GHz
メモリー : 1GB
JRE : 1.6.4

◆実行例
/**
 * 実行例
 * @param args
 */
public static void main(String[] args) {
    try {
        copyStream("C:\\100M.txt", "C:\\a.txt",1000);
    } catch (IOException e) {
        e.printStackTrace();
    }
}
◆実行結果

バッファサイズの変更

 ファイルをコピーする上で、効率の良いデータ読み込みバッファサイズを確認するため、copyStream の第3引数に 1KB、100KB、1000KB、10000KB単位で同様のコピー処理を行った結果を以下にまとめています。


 上記の結果だけで断定することはできませんが、データ読み込みバッファサイズを 1000KB 単位に指定すると、 コピー処理中のヒープ使用量、処理時間において効率が良いと言う結果が出ました。
尚、ファイルサイズを大きくした場合( 1GB 程度)でも同様の結果が得られました。

逆にサイズが小さいファイル( 1MB 以下ぐらい )をコピーする場合は、バッファサイズを大きくしても無駄になりますので 100KB ぐらいで指定するのが良いかと思います。


FileChannelを利用してもっと高速に

 java.io.InputStreamjava.io.OutputStream でのコピー処理は入出力ストリームを理解する上で、重要ではありますが、 J2SE1.4 で導入された New I/O の java.nio.channels.FileChannel#transferTo メソッドを利用することで、さらに効率良くファイルコピーを行うことができます。
次は、FileChannel を利用して簡単・高速にファイルコピーを行う方法を紹介します。
Java ファイルコピー(簡単・高速)


ページトップへ
ダウンロード - ダウンロード詳細
更新履歴 - 更新履歴 2014 - 2015
応用編 - ショートカットキー一覧
その他 - プレミアムエディション
その他 - 確認されている問題点と解消方法
その他 - IP Messenger 互換について
インストール / Verup - インストール方法
インストール / Verup - バージョンアップ方法
Thanks Links・リンク集 - おすすめフリーソフトまとめ
インストール / Verup - バージョンアップ方法 インストール無し版
インストール / Verup - 初回起動時におけるWindowsファイアウォール
更新履歴 - 更新履歴 2011 - 2013
更新履歴 - 更新履歴 2009
インストール / Verup - インスートール方法 Mac OSX
インストール / Verup - JREのインストール方法
CAMServer - CAMServer 概要
CAMServer - CAMServer の導入方法
CAMServer - ライセンスのご購入
インストール / Verup - バージョンアップとリリースポリシー
CAMServer - 文書・ファイル共有
ダウンロード - 過去のバージョンのダウンロード
CAMServer - 外部ユーザ取得・ルータ超え
Thanks Links・リンク集 - Thanks Links
インストール / Verup - アンインストール方法
応用編 - バックアップ設定
CAMServer - クライアント利用制限
CAMServer - メッセージログのサーバ集中管理
CAMServer - オフライン時の Email 転送
CAMServer - CAMServer のバージョンアップ
ダウンロード - CAMServer のダウンロード
テレビ会議 / 音声通話 - テレビ会議・音声通話
CAMServer - CAMServer を Windows サービスとして起動
応用編 - パケット追跡について
テレビ会議 / 音声通話 - ヘッドセット・カメラの準備
テレビ会議 / 音声通話 - ヘッドセット・カメラの推奨商品
その他 - SaaS型 オンデマンド型サービスとして提供
その他 - よくある質問
更新履歴 - 更新履歴 2008
Thanks Links・リンク集 - 相互リンク募集
CAMServer - よくある質問 CAMServer 編
メッセンジャー / チャット - 使い方、使用方法
応用編 - 便利な使い方(Tips)
メッセンジャー / チャット - 起動及び初期設定方法
メッセンジャー / チャット - メッセンジャー
メッセンジャー / チャット - メッセージ内のアイコン説明
メッセンジャー / チャット - チャット
メッセンジャー / チャット - ログ参照
メッセンジャー / チャット - ファイルやフォルダの送信・受信
メッセンジャー / チャット - アプリケーションの環境設定
メッセンジャー / チャット - ソート設定と優先順位設定
メッセンジャー / チャット - メッセージの保管
メッセンジャー / チャット - 不在モード
スケジュール / カレンダー - カレンダー
スケジュール / カレンダー - スケジュール共有
メッセンジャー / チャット - キャプチャ
メッセンジャー / チャット - 付箋
スケジュール / カレンダー - ToDo
応用編 - フォント設定
メッセンジャー / チャット - 概要資料PDF版
スケジュール / カレンダー - 会議室・施設予約
応用編 - configフォルダ及び各種設定ファイルについて
CAMServer - 特定商取引に関する法律に基づく表記
インストール / Verup - ソフトに個別のJREを適用させる方法
更新履歴 - 更新履歴 2007 Java システム系 - Java 外部コマンドを実行し3つの結果を取得
Java 文字列 - Java LPAD、RPADで整形
Java 日付・時刻 - Java 2つの日付の差を求める
Java システム系 - Java システムプロパティを見やすく出力
Java システム系 - Java メモリー使用量を取得
Java 文字列 - Java ファイル名から拡張子を取り除く
Java 文字列 - Java ファイル名から拡張子を取得
Java ファイル・I/O - Java ディレクトリ内のファイル一覧を表示
Java ファイル・I/O - Java XMLEncoderでオブジェクトを保存
その他 - Windows100% 2008年9月号に掲載
Java 日付・時刻 - Java 2つの日付の月数の差を求める
Java 日付・時刻 - Java 日付・時刻の計算 加算・減算が簡単に
Web関連 - 10の翻訳エンジンを比較できるサイト 翻訳くらべ
Web関連 - Excelの表からHTMLテーブルタグ一発作成
Web関連 - IETester - 複数のIEバージョンの動作確認を行える便利なソフト
Java ファイル・I/O - Java 再帰的にファイルを検索
Java 特集 - Java タスクトレイのアイコンを表示・点滅
応用編 - タスクトレイに格納しメモリを節約
Java ファイル・I/O - Java ファイルコピー(バッファサイズを変更)
Java ファイル・I/O - Java ファイルコピー(簡単・高速)
Java 特集 - Java ログフィルタでHTTPを解析
その他 - おとなのWindows 2008年 12月号に掲載
Java 特集 - Java リフレクション が簡単に
その他 - iP ! (アイピー) 2008年 04月号に掲載
Java 日付・時刻 - Java 日付の妥当性・存在チェック
Java 日付・時刻 - Java 月末日付を取得する
Java 日付・時刻 - Java 現在(今日)の曜日を求める
Java 日付・時刻 - Java 日付文字列をDate型へ変換
Java 日付・時刻 - Java あらゆる日付・時刻文字列をDate、Calendar型へ
更新履歴 - 更新履歴 2006
Java 文字列 - Java 文字列内のURLをリンクに変換
Java ネットワーク - Java 実行しているマシンのホスト名を取得
Java ネットワーク - Java IPアドレスからホスト名を取得
Java Swing - Java システムアイコンを抽出
Java Swing - Java クリップボードへコピー
Thanks Links・リンク集 - リンク集・その他お勧め

Java ファイルコピー(簡単・高速)

Java ファイルコピー(簡単・高速)FileChannel#transferTo

 Java でファイルをコピーするサンプルプログラムを紹介します。
サンプルプログラムは、J2SE1.4 で導入された New I/O の java.nio.channels.FileChannel#transferTo メソッドを利用します。
データの読み込みに必要なバッファを意識すること無く、コピー処理のプログラムを記述でき、最もシンプルなコーディングとなります。

チャネルとは

 チャネルという言葉は、様々な意味で使われていますが、 基本的には他のデバイスとのあいだでデータの入出力を行うための伝送路を示すようです。java.nio.channels.FileChannel はファイルへの読み込み、書き込みを行うための接続を表すクラスとなります。
transferTo メソッドは、コピー元となるファイルから、コピー先のチャネルにバイトデータを転送することができます。
以下、JavaAPI ドキュメントから引用。

transferTo(long position, long count, WritableByteChannel target)
このチャネルのファイルから指定された書き込み可能なバイトチャネルへバイトを転送します。
このチャネルからデータを読み込んでターゲットチャネルに書き込むという単純なループよりも、このメソッドのほうがずっと効率的に処理できる可能性があります。多くのオペレーティングシステムは、ファイルシステムキャッシュからターゲットチャネルへバイトを直接転送できます。 このとき、バイトのコピーは行われません。

 今回の検証結果では、通常のストリームを利用する方法や、 FileChannel の他の方法( ByteBuffer#allocateDirect メソッドを使用する方法等)より高速にコピー処理が行えました。

サンプルプログラム

実行

 サンプルプログラムのファイルコピーを行うために、Cドライブ直下に 100MB のファイル「100M.txt」を用意しました。
サンプルプログラムでは C:\100M.txt をコピーして C:\a.txt のファイルを作成します。

尚、サンプルの実行は以下の環境で行いました。
OS : WindowsXP
CPU : Athlon 1.46GHz
メモリー : 1GB
JRE : 1.6.4

◆実行例
/**
 * 実行例
 * @param args
 */
public static void main(String[] args) {
    try {
        copyTransfer("C:\\100M.txt", "C:\\a.txt");
    } catch (IOException e) {
        e.printStackTrace();
    }
}
◆実行結果

 FileChannel#transferTo メソッドを利用したコピー処理では 100MB のファイルのコピー処理が 3 秒程度で完了しました。またコピー処理中のヒープ使用量についても 300 (KB) 程でした。
ちなみに、Java ファイルコピー(バッファサイズを変更)で紹介している方法では、 最も効率の良かった 1000KB のバッファサイズを指定した場合で、処理時間は 4 秒程度、ヒープ使用量は 1,300KB 程度でした。

 ストリームによるファイルコピーでも、バッファサイズをチューニングする事で高速化されるため、 一つのファイルをコピーする処理ではそれ程差は無いと言えるでしょう。
しかしながら、大きなファイルを連続してコピーする場合や、複数のコピー処理を平行して実行する場合では、処理速度・ヒープ使用量の観点で FileChannel は効果を発揮できるでしょう。

Chat&Messenger でのファイル転送機能では

 Chat&Messenger でのファイル転送機能では、Java ファイルコピー(バッファサイズを変更)で紹介しているストリームを利用したコピーを行っています。
理由は、ソフトを不特定多数の環境へ配布するため、少しでも実績があり枯れた機能を利用した方が、開発当時は安心だったためです。ただ、将来的にはチャネルを利用した方法に切り替えるよう検討しています。


ページトップへ
ダウンロード - ダウンロード詳細
更新履歴 - 更新履歴 2014 - 2015
応用編 - ショートカットキー一覧
その他 - プレミアムエディション
その他 - 確認されている問題点と解消方法
その他 - IP Messenger 互換について
インストール / Verup - インストール方法
インストール / Verup - バージョンアップ方法
Thanks Links・リンク集 - おすすめフリーソフトまとめ
インストール / Verup - バージョンアップ方法 インストール無し版
インストール / Verup - 初回起動時におけるWindowsファイアウォール
更新履歴 - 更新履歴 2011 - 2013
更新履歴 - 更新履歴 2009
インストール / Verup - インスートール方法 Mac OSX
インストール / Verup - JREのインストール方法
CAMServer - CAMServer 概要
CAMServer - CAMServer の導入方法
CAMServer - ライセンスのご購入
インストール / Verup - バージョンアップとリリースポリシー
CAMServer - 文書・ファイル共有
ダウンロード - 過去のバージョンのダウンロード
CAMServer - 外部ユーザ取得・ルータ超え
Thanks Links・リンク集 - Thanks Links
インストール / Verup - アンインストール方法
応用編 - バックアップ設定
CAMServer - クライアント利用制限
CAMServer - メッセージログのサーバ集中管理
CAMServer - オフライン時の Email 転送
CAMServer - CAMServer のバージョンアップ
ダウンロード - CAMServer のダウンロード
テレビ会議 / 音声通話 - テレビ会議・音声通話
CAMServer - CAMServer を Windows サービスとして起動
応用編 - パケット追跡について
テレビ会議 / 音声通話 - ヘッドセット・カメラの準備
テレビ会議 / 音声通話 - ヘッドセット・カメラの推奨商品
その他 - SaaS型 オンデマンド型サービスとして提供
その他 - よくある質問
更新履歴 - 更新履歴 2008
Thanks Links・リンク集 - 相互リンク募集
CAMServer - よくある質問 CAMServer 編
メッセンジャー / チャット - 使い方、使用方法
応用編 - 便利な使い方(Tips)
メッセンジャー / チャット - 起動及び初期設定方法
メッセンジャー / チャット - メッセンジャー
メッセンジャー / チャット - メッセージ内のアイコン説明
メッセンジャー / チャット - チャット
メッセンジャー / チャット - ログ参照
メッセンジャー / チャット - ファイルやフォルダの送信・受信
メッセンジャー / チャット - アプリケーションの環境設定
メッセンジャー / チャット - ソート設定と優先順位設定
メッセンジャー / チャット - メッセージの保管
メッセンジャー / チャット - 不在モード
スケジュール / カレンダー - カレンダー
スケジュール / カレンダー - スケジュール共有
メッセンジャー / チャット - キャプチャ
メッセンジャー / チャット - 付箋
スケジュール / カレンダー - ToDo
応用編 - フォント設定
メッセンジャー / チャット - 概要資料PDF版
スケジュール / カレンダー - 会議室・施設予約
応用編 - configフォルダ及び各種設定ファイルについて
CAMServer - 特定商取引に関する法律に基づく表記
インストール / Verup - ソフトに個別のJREを適用させる方法
更新履歴 - 更新履歴 2007 Java システム系 - Java 外部コマンドを実行し3つの結果を取得
Java 文字列 - Java LPAD、RPADで整形
Java 日付・時刻 - Java 2つの日付の差を求める
Java システム系 - Java システムプロパティを見やすく出力
Java システム系 - Java メモリー使用量を取得
Java 文字列 - Java ファイル名から拡張子を取り除く
Java 文字列 - Java ファイル名から拡張子を取得
Java ファイル・I/O - Java ディレクトリ内のファイル一覧を表示
Java ファイル・I/O - Java XMLEncoderでオブジェクトを保存
その他 - Windows100% 2008年9月号に掲載
Java 日付・時刻 - Java 2つの日付の月数の差を求める
Java 日付・時刻 - Java 日付・時刻の計算 加算・減算が簡単に
Web関連 - 10の翻訳エンジンを比較できるサイト 翻訳くらべ
Web関連 - Excelの表からHTMLテーブルタグ一発作成
Web関連 - IETester - 複数のIEバージョンの動作確認を行える便利なソフト
Java ファイル・I/O - Java 再帰的にファイルを検索
Java 特集 - Java タスクトレイのアイコンを表示・点滅
応用編 - タスクトレイに格納しメモリを節約
Java ファイル・I/O - Java ファイルコピー(バッファサイズを変更)
Java ファイル・I/O - Java ファイルコピー(簡単・高速)
Java 特集 - Java ログフィルタでHTTPを解析
その他 - おとなのWindows 2008年 12月号に掲載
Java 特集 - Java リフレクション が簡単に
その他 - iP ! (アイピー) 2008年 04月号に掲載
Java 日付・時刻 - Java 日付の妥当性・存在チェック
Java 日付・時刻 - Java 月末日付を取得する
Java 日付・時刻 - Java 現在(今日)の曜日を求める
Java 日付・時刻 - Java 日付文字列をDate型へ変換
Java 日付・時刻 - Java あらゆる日付・時刻文字列をDate、Calendar型へ
更新履歴 - 更新履歴 2006
Java 文字列 - Java 文字列内のURLをリンクに変換
Java ネットワーク - Java 実行しているマシンのホスト名を取得
Java ネットワーク - Java IPアドレスからホスト名を取得
Java Swing - Java システムアイコンを抽出
Java Swing - Java クリップボードへコピー
Thanks Links・リンク集 - リンク集・その他お勧め