Javaでのioとnioのファイルコピーパフォーマンスの比較
1. 従来の JAVA IO システムでは、ディスク ファイル データを読み取るプロセスは次のとおりです。
このクラスには read(byte b[]) メソッドがあります。保存および読み取りたいデータを取得します。 read(byte b[]) メソッドのソース コードを参照すると、内部的に readBytes(b, 0, b.length) メソッドを呼び出し、さらに readBytes(b, 0, b.length) メソッドを呼び出すことがわかります。はネイティブ メソッド (ローカル メソッド) であり、最後にこのローカル メソッドを通じてシステム コールが開始されます。つまり、システム カーネルの read() メソッドが呼び出され、カーネルはディスクからカーネル バッファにデータを読み取ります。このプロセスでは、ディスク コントローラーが DMA 操作を通じてディスクからデータを読み取り、カーネル バッファーを取得します。このプロセスは CPU に依存しません。次にユーザー プロセスは、カーネル バッファーからユーザー空間バッファーにデータをコピーします。次に、ユーザー プロセスはユーザー空間バッファーからデータを読み取ります。ユーザープロセスはハードウェアに直接アクセスできないためです。したがって、カーネルはファイルを読み取るための仲介者として機能する必要があります。
プロセス全体を以下の図に示します:
2. JAVA 1.4 以降、JAVA は NIO にファイル チャネルの概念を導入しました。従来の IO がバイト (バイト) に基づいていることです。ストリーム (ストリーム) ですが、NIO はバッファーとチャネルに基づいています。この API は、従来の IO ストリームに関連付けられた FileChannel クラスとセレクターを提供します。ファイル チャネルは FileInputStream または FileOutputStream によって取得でき、チャネルを通じてファイルの読み取りと書き込みを行うことができます。
3. JAVA NIO では、ファイル メモリ マッピングの概念も導入されています。ほとんどの最新のオペレーティング システムは、仮想メモリ マッピングをサポートしています。これにより、カーネル空間アドレスとユーザー空間の仮想アドレスを同じ物理アドレスにマップできます。ハードウェア (物理メモリ アドレスのみにアクセスできる) は、カーネル プロセスとユーザー空間プロセスの両方から見えるバッファを埋めることができます。以下の図に示すように:
IO、BufferedIO、NIO をそれぞれ使用したファイル コピーの時間のかかる比較を見てみましょう: 11 MB オーディオ ファイル
従来の IO 方法を使用したファイル コピーには時間がかかります: 21ms
NIO ファイル チャネルを使用する場合、この方法ではファイルのコピーに 16 ミリ秒かかります。NIO ファイル メモリ マッピングとファイル チャネルを使用してファイルをコピーするのにかかる時間は 7 ミリ秒です。パッケージ com.maystar.utils を使用する場合は 53 ミリ秒です。 ;
import java.io.File;
import java.io.FileInputStream;
import java.nio.channels.FileChannel;
import org.apache. commons.io.FileUtils;
public class FileCopyTest {
public static void main(String[] args) throws Exception {
String sourcePath = "F:\glzmv.mp3"
String destPath1 = "F: \glzmvCopy1.mp3";
文字列 destPath2 = "F:\glzmvCopy2.mp3";
文字列 destPath3 = = " ;
long t1 = System.currentTimeMillis();
traditionalCopy(sourcePath,destPath1);
long t2 = System.currentTimeMillis(); 1) + "ミリ秒") ; nioCopy ( ); + " ms");
long t4 = System.currentTimeMillis();
System.out.println("NIO ファイル メモリ マッピングとファイル チャネルを使用したファイル コピーの実装には時間がかかります:" + (t 4 -t3) + "ms"); nioCopy3 ( ) nioCopy3(sourcePath, destPath4); + "ms"); }
private static void nioCopy3(String sourcePath, String destPath) throws Exception { File dest = new File(destPath);// ソース コードを表示します。 io-2.4 も nio 操作を使用して nioCopy と同様の操作を実装しますが、その理由は、FileUtils.copyFile で doCopyFile を実行した後、IOUtils ツール クラスがさまざまな型に応じて対応するコンストラクターを呼び出すためです。ストリームの。
}} r r Private Static Void Niocopy2 (String SourcePath, String Destpath) が例外をスローします {
File Source = New File (SourcePath);
File Dest = New file (destpath); )) {
(宛先); FileChannelsourceCh = getChannel(); FileChannel destCh = fos.getChannel(); .map(FileChannel.MapMode.READ_ONLY, 0, sourceCh.size());
destCh.write(mbb);
destCh() .閉じる ファイルソース = 新しいファイル(ソースパス);
ファイル dest = new File(destPath);
if(!dest.exists()) {
dest.createNewFile();
}
FileInputStream fis = new FileInputStream(source);
FileOutputStream fos = new FileOutputStream(dest);
byte [] buf = 新しいバイト [fis.available()];
int len = 0;
while((len = fis.read(buf)) != -1) {
fos.write(buf, 0, len);
}
fis.close();
fos.close();
}
private static void nioCopy(String sourcePath, String destPath) throws Exception{
File source = new File(sourcePath);
ファイル dest = new File(destPath);
if(!dest.exists()) {
dest.createNewFile();
}
FileInputStream fis = new FileInputStream(source);
FileOutputStream fos = new FileOutputStream(dest);
FileChannelsourceCh = fis.getChannel();
FileChannel destCh = fos.getChannel();
destCh.transferFrom(sourceCh, 0, sourceCh.size());
sourceCh.close();
destCh.close();
}
}

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4

Java は、初心者と経験豊富な開発者の両方が学習できる人気のあるプログラミング言語です。このチュートリアルは基本的な概念から始まり、高度なトピックに進みます。 Java Development Kit をインストールしたら、簡単な「Hello, World!」プログラムを作成してプログラミングを練習できます。コードを理解したら、コマンド プロンプトを使用してプログラムをコンパイルして実行すると、コンソールに「Hello, World!」と出力されます。 Java の学習はプログラミングの旅の始まりであり、習熟が深まるにつれて、より複雑なアプリケーションを作成できるようになります。
