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

Chat&Messenger チャットもメッセンジャーも!! Chat&Messenger チャットもメッセンジャーも!!
LAN上でチャットとメッセンジャーが簡単に利用できるフリーソフトChat&Messengerを紹介します。IP Messenger互換。付箋紙にも対応。

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




ページトップへ
ダウンロード - ダウンロード
更新履歴 - 更新履歴 2008
Java 日付・時刻 - Java 2つの日付の差を求める
Java 日付・時刻 - Java 2つの日付の月数の差を求める
Java 日付・時刻 - Java 日付・時刻の計算 加算・減算が簡単に
Web関連 - IE7で閉じる(window.close)と強制終了の対策
Web関連 - 10の翻訳エンジンを比較できるサイト 翻訳くらべ
Web関連 - Excelの表からHTMLテーブルタグ一発作成
Web関連 - IETester - 複数のIEバージョンの動作確認を行える便利なソフト
Java ファイル・I/O - Java 再帰的にファイルを検索
Thanks Links・リンク集 - おすすめフリーソフトまとめ
Java 特集 - Java タスクトレイのアイコンを表示・点滅
使い方・応用編 - タスクトレイに格納しメモリを節約
使い方・応用編 - ショートカットキー一覧
Thanks Links・リンク集 - Thanks Links
Java ファイル・I/O - Java ファイルコピー(バッファサイズを変更)
Java ファイル・I/O - Java ファイルコピー(簡単・高速)
その他 - 今後の開発予定
その他 - よくある質問
Web関連 - IE7で画面が真っ白の対策
使い方 - 使い方、使用方法
使い方 - ソフト内の名称
使い方 - 起動及び初期設定方法
使い方 - メッセンジャー機能
使い方 - メッセージペインの各種アイコン説明
使い方 - チャット機能
使い方 - ログ参照
使い方 - ファイルやフォルダの送信・受信
使い方 - アプリケーションの環境設定
使い方 - ソート設定と優先順位設定
使い方 - メッセージの保管
使い方 - 不在モード
使い方 - カレンダー機能
使い方 - キャプチャ機能
使い方 - 付箋機能
使い方 - 内部ブラウザ機能
使い方 - フォント設定
使い方・応用編 - configフォルダ及び各種設定ファイルについて
インストール・バージョンアップ - JREのインストール方法
インストール・バージョンアップ - インストール方法
インストール・バージョンアップ - バージョンアップ方法
Java 特集 - Java ログフィルタでHTTPを解析
インストール・バージョンアップ - バージョンアップとリリースポリシー
インストール・バージョンアップ - 初回起動時におけるWindowsファイアウォール注意点
ダウンロード - 過去のバージョンのダウンロード
Java 特集 - Java リフレクション が簡単に
その他 - 確認されている問題
IP Messenger 互換について - IP Messenger 互換について
更新履歴 - 更新履歴 2007
Java 日付・時刻 - Java 日付の妥当性・存在チェック
Java 日付・時刻 - Java 月末日付を取得する
Java 日付・時刻 - Java 現在(今日)の曜日を求める
Java 日付・時刻 - Java 日付文字列をDate型へ変換
Java 日付・時刻 - あらゆる日付・時刻文字列をDate、Calendar型へ変換
その他 - 掲示板・アンケート
インストール・バージョンアップ - アンインストール方法
インストール・バージョンアップ - ソフトに個別のJREを適用させる方法
Java ネットワーク - Java 実行しているマシンのホスト名を取得
その他 - iP ! (アイピー) 2008年 04月号に掲載
Java ネットワーク - Java IPアドレスからホスト名を取得
Java Swing - Java システムアイコンを抽出
Java Swing - Java クリップボードへコピー
Java ファイル・I/O - Java ディレクトリ内のファイル一覧を表示
Java ファイル・I/O - Java XMLEncoderでオブジェクトを保存
その他 - Vistaでのスクリーンショット
Java システム系 - Java 外部コマンドを実行し3つの結果を取得
Java システム系 - Java システムプロパティを見やすく出力
Java システム系 - Java メモリー使用量を取得
Java 文字列 - Java LPAD、RPADで整形
その他 - CM を見る
更新履歴 - 更新履歴 2006
Java 文字列 - Java 文字列内のURLをリンクに変換
Java 文字列 - Java ファイル名から拡張子を取り除く
Java 文字列 - Java ファイル名から拡張子を取得
その他 - 掲示板について
その他 - このサイトについて
その他 - プロフィール
Thanks Links・リンク集 - 相互リンク募集
Thanks Links・リンク集 - リンク集・ソフトウェア
コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
メッセンジャー java messenger ダウンロード ip メッセンジャー ip messenger 互換 ip ポート