国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目次
1 NIO的一些基礎(chǔ)預(yù)備知識
2 NIO為何較傳統(tǒng)的io速度較快
3 NIO實戰(zhàn)上傳下載
3.1 url下載文件
3.2 通過NIO上傳文件
ホームページ Java &#&チュートリアル Java は NIO をどのように使用して IO を最適化し、ファイルのアップロードおよびダウンロード機能を?qū)g裝しますか?

Java は NIO をどのように使用して IO を最適化し、ファイルのアップロードおよびダウンロード機能を?qū)g裝しますか?

May 12, 2023 pm 09:31 PM
java io nio

1 NIO的一些基礎(chǔ)預(yù)備知識

Java中IO流類的體系中BIO與NIO:https://blog.csdn.net/ZGL_cyy/article/details/104326458
Java IO體系與NIO和BIO體系面試題 :https://blog.csdn.net/ZGL_cyy/article/details/122836368
為什么使用NIO:因為傳統(tǒng)IO文件傳輸速率低,所以選擇了NIO進行文件的下載操作。NIO還有一個好處就是其中零拷貝可以實現(xiàn)減少內(nèi)存中數(shù)據(jù)的重復(fù),減少CPU操作的效果。所以相對于傳統(tǒng)IO,NIO有著效率高點的優(yōu)勢。

2 NIO為何較傳統(tǒng)的io速度較快

就拿單個io過程來看,首先時間主要花在了用戶態(tài)和內(nèi)核態(tài)的轉(zhuǎn)換上,其次,考慮將多個io的“合并”為一個io,這不就節(jié)省時間了嗎

相應(yīng)的NIO主要做了兩方面的提升

1.避免了用戶態(tài)和內(nèi)核態(tài)的交換,直接操作內(nèi)存,用戶態(tài)和內(nèi)核態(tài)的轉(zhuǎn)換是很費時的,傳統(tǒng)的io寫入磁盤時,用戶態(tài)的接口不能直接操作內(nèi)存,而是通過操作系統(tǒng)調(diào)用內(nèi)核態(tài)接口來進行io。

2.利用buffer減少io的次數(shù),buffer化零為整”的寫入方式因為大大減小了尋址/寫入次數(shù),所以就降低了硬盤的負荷。

3.IO 是基于流來讀取的,而NIO則是基于塊讀取,面向流 的 I/O 系統(tǒng)一次一個字節(jié)地處理數(shù)據(jù)。一個輸入流產(chǎn)生一個字節(jié)的數(shù)據(jù),一個輸出流消費一個字節(jié)的數(shù)據(jù)。為流式數(shù)據(jù)創(chuàng)建過濾器非常容易。鏈接幾個過濾器,以便每個過濾器只負責(zé)單個復(fù)雜處理機制的一部分,這樣也是相對簡單的。不利的一面是,面向流的 I/O 通常相當(dāng)慢。
一個 面向塊 的 I/O 系統(tǒng)以塊的形式處理數(shù)據(jù)。每一個操作都在一步中產(chǎn)生或者消費一個數(shù)據(jù)塊。按塊處理數(shù)據(jù)比按(流式的)字節(jié)處理數(shù)據(jù)要快得多。但是面向塊的 I/O 缺少一些面向流的 I/O 所具有的優(yōu)雅性和簡單性。

4.非阻塞IO 和 異步IO的支持, 減少線程占有的??臻g,以及上下文切換

5.IO 多路復(fù)用的支持

6.Buffer 支持,所有讀寫操作都是基于 緩沖 來實現(xiàn)

7.NIO 支持 Direct Memory, 可以減少一次數(shù)據(jù)拷貝

8.Netty 零拷貝的支持

3 NIO實戰(zhàn)上傳下載

3.1 url下載文件

java NIO包提供了無緩沖情況下在兩個通道之間直接傳輸字節(jié)的可能。

為了讀來自URL的文件,需從URL流創(chuàng)建ReadableByteChannel :

ReadableByteChannel readableByteChannel = Channels.newChannel(url.openStream());

從ReadableByteChannel 讀取字節(jié)將被傳輸至FileChannel:

FileOutputStream fileOutputStream = new FileOutputStream(FILE_NAME);
FileChannel fileChannel = fileOutputStream.getChannel();

然后使用transferFrom方法,從ReadableByteChannel 類下載來自URL的字節(jié)傳輸?shù)紽ileChannel:

fileOutputStream.getChannel().transferFrom(readableByteChannel, 0, Long.MAX_VALUE);

transferTo() 和 transferFrom() 方法比簡單使用緩存從流中讀更有效。依據(jù)不同的底層操作系統(tǒng),數(shù)據(jù)可以直接從文件系統(tǒng)緩存?zhèn)鬏數(shù)轿覀兊奈募?,而不必將任何字?jié)復(fù)制到應(yīng)用程序內(nèi)存中。

在Linux和UNIX系統(tǒng)上,這些方法使用零拷貝技術(shù),減少了內(nèi)核模式和用戶模式之間的上下文切換次數(shù)。

工具類:

/**NIO文件下載工具類
 * @author olalu
 */
public class NioDownloadUtils {

    /**
     * @description:
     * @param file: 要下在文件
     * @return: void
     */
    public static void downloadDoc(File file,HttpServletResponse response) throws IOException {
        OutputStream outputStream = response.getOutputStream();
        String contentType = Files.probeContentType(Paths.get(file.getAbsolutePath()));
        //設(shè)置響應(yīng)頭
        response.setHeader("Content-Type", contentType);
        response.setHeader("Content-Disposition", "attachment;filename="+ new String(file.getName().getBytes("utf-8"),"ISO8859-1"));
        response.setContentLength((int) file.length());
        //獲取文件輸入流
        FileInputStream fileInputStream = new FileInputStream(file);
        //獲取輸出流通道
        WritableByteChannel writableByteChannel = Channels.newChannel(outputStream);
        FileChannel fileChannel = fileInputStream.getChannel();
        //采用零拷貝的方式實現(xiàn)文件的下載
        fileChannel.transferTo(0,fileChannel.size(),writableByteChannel);
        //關(guān)閉對應(yīng)的資源
        fileChannel.close();
        outputStream.flush();
        writableByteChannel.close();
    }

    public static void downloadDoc(String path,HttpServletResponse response) throws IOException {
        File file = new File(path);
        if (!file.exists()){
            throw new RuntimeException("文件不存在");
        }
        downloadDoc(file,response);
    }

}

3.2 通過NIO上傳文件

/**
     * 文件上傳方法
     */
    public static Result uploading(MultipartFile file) {
        //獲取文件名
        String realName = file.getOriginalFilename();
        String newName = null;
        if(realName != null && realName != ""){
            //獲取文件后綴
            String suffixName = realName.substring(realName.lastIndexOf("."));
            //生成新名字
            newName = UUID.randomUUID().toString().replaceAll("-", "")+suffixName;
        }else {
            return Result.fail("文件名不可為空");
        }
        //創(chuàng)建流
        FileInputStream fis = null;
        FileOutputStream fos = null;
        //創(chuàng)建通道
        FileChannel inChannel = null;
        FileChannel outChannel = null;
        try {
            fis = (FileInputStream)file.getInputStream();
            //開始上傳
            fos = new FileOutputStream(UPLOAD_URL+"\\"+newName);
            //通道間傳輸
            inChannel = fis.getChannel();
            outChannel = fos.getChannel();
            //上傳
            inChannel.transferTo(0,inChannel.size(),outChannel);

        }catch (IOException e){
            return Result.fail("文件上傳路徑錯誤");
        }finally {
            //關(guān)閉資源
            try {
                if (fis != null) {
                    fis.close();
                }
                if (fos != null) {
                    fos.close();
                }
                if (inChannel != null) {
                    inChannel.close();
                }
                if (outChannel != null) {
                    outChannel.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return Result.ok(newName);

    }

以上がJava は NIO をどのように使用して IO を最適化し、ファイルのアップロードおよびダウンロード機能を?qū)g裝しますか?の詳細內(nèi)容です。詳細については、PHP 中國語 Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負いません。盜作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中國語版

SublimeText3 中國語版

中國語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

JavaのSingletonデザインパターンとは何ですか? JavaのSingletonデザインパターンとは何ですか? Jul 09, 2025 am 01:32 AM

JavaのSingleton Design Patternは、クラスに1つのインスタンスしかないことを保証し、プライベートコンストラクターと靜的方法を介したグローバルアクセスポイントを提供することを保証します。これは、共有リソースへのアクセスを制御するのに適しています。実裝方法には以下が含まれます。1。レイジーロード、つまり、インスタンスは最初のリクエストが要求されたときにのみ作成されます。これは、リソースの消費が高く、必ずしも必要ではない狀況に適しています。 2。スレッドセーフ処理。同期方法または再確認ロックを介して、マルチスレッド環(huán)境で1つのインスタンスのみが作成され、パフォーマンスへの影響が低下するようにします。 3.クラスの読み込み中にインスタンスを直接初期化するHungry Loadingは、事前に初期化できる軽量オブジェクトまたはシナリオに適しています。 4.列挙の実裝は、Java列挙を使用してシリアル化、スレッドの安全性をサポートし、反射攻撃を防止することは、推奨される簡潔で信頼できる方法です。特定のニーズに応じて、さまざまな実裝方法を選択できます

Javaヒープダンプを分析する方法は? Javaヒープダンプを分析する方法は? Jul 09, 2025 am 01:25 AM

Java Heap Dumpsの分析は、特にメモリリークとパフォーマンスのボトルネックを特定するためのメモリの問題をトラブルシューティングする重要な手段です。 1. eclipsematまたはvisualvmを使用して、.hprofファイルを開きます。 MATは、異なる角度からオブジェクト分布を表示するヒストグラムとドミネーターツリービューを提供します。 2。バイト[]、char []、またはビジネスクラスなどの異常に大きいまたは大きいサイズのクラスを見つけるために、占有されているインスタンスの數(shù)またはスペースでヒストグラムを並べ替えます。 3.「ListObjects> Incoming/Outverneferences」を介して參照チェーンを表示して、誤って保持されているかどうかを判斷します。 4。「Pathto」を使用します

JavaのThreadlocalとは何ですか? JavaのThreadlocalとは何ですか? Jul 09, 2025 am 02:25 AM

ThreadlocalはJavaで使用されてスレッドプライベート変數(shù)を作成します。各スレッドには、同時実行の問題を回避するための獨立したコピーがあります。スレッド內(nèi)のthreadlocalMapを介して値を保存します。メモリの漏れを防ぐために使用するときは、タイムリーなクリーニングに注意してください。一般的な用途には、ユーザーセッション管理、データベース接続、トランザクションコンテキスト、ログトラッキングが含まれます。ベストプラクティスには以下が含まれます。1。remove()を呼び出して、使用後にクリーンアップします。 2。過剰使用を避けます。 3.継承は、子スレッドの継承に必要です。 4.大きなオブジェクトを保存しないでください。初期値はinitialValue()またはintheritial()を介して設(shè)定でき、初期化は最初のget()呼び出しまで遅延します。

Javaオプションの例 Javaオプションの例 Jul 12, 2025 am 02:55 AM

オプションは、意図を明確に表現(xiàn)し、ヌルの判斷のコードノイズを減らすことができます。 1. optional.ofnullableは、nullオブジェクトに対処する一般的な方法です。たとえば、マップから値を取得する場合、Orelseを使用してデフォルト値を提供できるため、ロジックはより明確かつ簡潔になります。 2.チェーンコールマップを使用してネストされた値を達成してNPEを安全に回避し、リンクが無効である場合はデフォルト値を返す場合は自動的に終了します。 3.フィルターは條件付きフィルタリングに使用でき、その後の操作は條件が満たされた場合にのみ実行され続けます。そうしないと、軽量のビジネス判斷に適したOrelseに直接ジャンプします。 4.基本的なタイプや単純なロジックなど、複雑さを高めるなど、オプションを過剰使用することはお勧めしません。一部のシナリオはNUに直接戻ります。

java.io.notserializableExceptionを修正する方法は? java.io.notserializableExceptionを修正する方法は? Jul 12, 2025 am 03:07 AM

java.io.notserializableExceptionに遭遇するためのコアワークアウンドは、シリアル化する必要があるすべてのクラスがシリアル化可能なインターフェイスを?qū)g裝し、ネストされたオブジェクトのシリアル化サポートを確認することです。 1.メインクラスに機器を追加する可能性のあるものを追加します。 2.クラス內(nèi)の対応するカスタムフィールドのクラスも、シリアル化可能なものを?qū)g裝していることを確認します。 3.一時的に使用して、シリアル化する必要のないフィールドをマークする。 4.コレクションまたはネストされたオブジェクトの非シリアル化されたタイプを確認します。 5.どのクラスがインターフェイスを?qū)g裝していないかを確認します。 6.キーデータの保存やシリアル化可能な中間構(gòu)造の使用など、変更できないクラスの交換設(shè)計を検討します。 7.変更を検討してください

Javaのマップを反復(fù)する方法は? Javaのマップを反復(fù)する方法は? Jul 13, 2025 am 02:54 AM

Javaにはマップを通過する3つの一般的な方法があります。1。エントリセットを使用してキーと値を同時に取得します。これは、ほとんどのシナリオに適しています。 2。キーセットまたは値をそれぞれキーまたは値を通過する。 3. Java8のForeachを使用して、コード構(gòu)造を簡素化します。 EntrySetは、すべてのキー値ペアを含むセットを返し、各ループはキーと値に頻繁にアクセスするのに適したMap.entryオブジェクトを取得します。キーまたは値のみが必要な場合は、それぞれkeyset()またはvalues()を呼び出すことができます。または、キーを橫斷するときにmap.get(key)を介して値を取得できます。 Java 8はForeachを使用できます((key、value) - &gt

Python Webスクレイピングダイナミックコンテンツ Python Webスクレイピングダイナミックコンテンツ Jul 10, 2025 pm 12:18 PM

ダイナミックウェブクロールは、分析インターフェイスまたはシミュレートされたブラウザを通じて実現(xiàn)できます。 1.ブラウザ開発者ツールを使用して、ネットワーク內(nèi)のXHR/Fetchリクエストを表示し、JSONデータを返すインターフェイスを見つけ、リクエストを使用してそれを取得します。 2.ページがフロントエンドフレームワークによってレンダリングされ、獨立したインターフェイスがない場合、Seleniumでブラウザを起動して、要素をロードして抽出するのを待つことができます。 3。アンチクロールメカニズムに直面して、ヘッダーを追加し、周波數(shù)制御、プロキシIPを使用する必要があり、検証コードまたはJSレンダリング検出は、狀況に応じて実行する必要があります。これらの方法をマスターすると、ほとんどの動的なWebクロールシナリオに効果的に対処できます。

Javaの比較対Comparator Javaの比較対Comparator Jul 13, 2025 am 02:31 AM

Javaでは、Defaultのデフォルトソートルールを內(nèi)部的に定義するためにAcparableが使用され、コンパレータを使用して複數(shù)のソートロジックを外部から定義します。 1.Comparableは、クラス自體によって実裝されるインターフェイスです。比較()メソッドを書き換えることにより、自然な順序を定義します。弦や整數(shù)など、固定および最も一般的に使用されるソートメソッドを備えたクラスに適しています。 2。Comparatorは、同じクラスに複數(shù)の並べ替え方法が必要な狀況に適した、Compare()メソッドを介して実裝された外部定義の機能インターフェイスであり、クラスソースコードを変更できない、またはソートロジックが変更されることが多い場合があります。 2つの違いは、比較可能がソートロジックを定義するだけで、クラス自體を変更する必要があることですが、比較して

See all articles