Java ファイルコピー(バッファサイズを変更)
Java ファイルコピー(バッファサイズを変更)
Java で java.io.InputStream、java.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.InputStream、java.io.OutputStream
でのコピー処理は入出力ストリームを理解する上で、重要ではありますが、
J2SE1.4 で導入された New I/O の java.nio.channels.FileChannel#transferTo
メソッドを利用することで、さらに効率良くファイルコピーを行うことができます。
次は、FileChannel を利用して簡単・高速にファイルコピーを行う方法を紹介します。
⇒ 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・リンク集 - リンク集・ソフトウェア
Template by ブログ アフィリエイト SEO テンプレート
無料ホームページ アフィリエイト レンタルサーバー FC2ブログ 一戸建て

