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

Jadual Kandungan
1 NIO的一些基礎(chǔ)預(yù)備知識(shí)
2 NIO為何較傳統(tǒng)的io速度較快
3 NIO實(shí)戰(zhàn)上傳下載
3.1 url下載文件
3.2 通過NIO上傳文件
Rumah Java javaTutorial Bagaimanakah Java menggunakan NIO untuk mengoptimumkan IO untuk melaksanakan fungsi muat naik dan muat turun fail?

Bagaimanakah Java menggunakan NIO untuk mengoptimumkan IO untuk melaksanakan fungsi muat naik dan muat turun fail?

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

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

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:因?yàn)閭鹘y(tǒng)IO文件傳輸速率低,所以選擇了NIO進(jìn)行文件的下載操作。NIO還有一個(gè)好處就是其中零拷貝可以實(shí)現(xiàn)減少內(nèi)存中數(shù)據(jù)的重復(fù),減少CPU操作的效果。所以相對(duì)于傳統(tǒng)IO,NIO有著效率高點(diǎn)的優(yōu)勢(shì)。

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

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

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

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

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

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

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

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

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

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

8.Netty 零拷貝的支持

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

3.1 url下載文件

java NIO包提供了無緩沖情況下在兩個(gè)通道之間直接傳輸字節(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() 方法比簡(jiǎn)單使用緩存從流中讀更有效。依據(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();
        //采用零拷貝的方式實(shí)現(xiàn)文件的下載
        fileChannel.transferTo(0,fileChannel.size(),writableByteChannel);
        //關(guān)閉對(duì)應(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("文件上傳路徑錯(cuò)誤");
        }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);

    }

Atas ialah kandungan terperinci Bagaimanakah Java menggunakan NIO untuk mengoptimumkan IO untuk melaksanakan fungsi muat naik dan muat turun fail?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Apakah corak reka bentuk singleton di java? Apakah corak reka bentuk singleton di java? Jul 09, 2025 am 01:32 AM

Corak reka bentuk singleton di Java memastikan bahawa kelas hanya mempunyai satu contoh dan menyediakan titik akses global melalui pembina swasta dan kaedah statik, yang sesuai untuk mengawal akses kepada sumber yang dikongsi. Kaedah pelaksanaan termasuk: 1. 2. Pemprosesan Safe Thread, memastikan bahawa hanya satu contoh yang dibuat dalam persekitaran berbilang threaded melalui kaedah penyegerakan atau penguncian cek berganda, dan mengurangkan kesan prestasi; 3. 4. Pelaksanaan penghitungan, menggunakan penghitungan Java untuk secara semulajadi menyokong serialisasi, keselamatan thread dan mencegah serangan reflektif, adalah kaedah ringkas dan boleh dipercayai. Kaedah pelaksanaan yang berbeza boleh dipilih mengikut keperluan khusus

Bagaimana untuk menganalisis pembuangan tumpukan Java? Bagaimana untuk menganalisis pembuangan tumpukan Java? Jul 09, 2025 am 01:25 AM

Menganalisa pembuangan tumpukan Java adalah cara utama untuk menyelesaikan masalah memori, terutamanya untuk mengenal pasti kebocoran memori dan kesesakan prestasi. 1. Gunakan eclipsemat atau visualvm untuk membuka fail .hprof. MAT menyediakan histogram dan dominatortree pandangan untuk memaparkan taburan objek dari sudut yang berbeza; 2. Susun dalam histogram dengan bilangan contoh atau ruang yang diduduki untuk mencari kelas dengan saiz yang besar atau besar, seperti byte [], char [] atau kelas perniagaan; 3. Lihat rantaian rujukan melalui "ListObjects> Withincoming/OutgoingReferences" untuk menentukan sama ada ia secara tidak sengaja dipegang; 4. Gunakan "pathto

Apa itu threadlocal di java? Apa itu threadlocal di java? Jul 09, 2025 am 02:25 AM

ThreadLocal digunakan dalam Java untuk membuat pembolehubah thread-swasta, setiap benang mempunyai salinan bebas untuk mengelakkan masalah konvensional. Ia menyimpan nilai melalui threadlocalmap di dalam benang. Perhatikan pembersihan tepat pada masanya apabila menggunakannya untuk mengelakkan kebocoran memori. Kegunaan umum termasuk pengurusan sesi pengguna, sambungan pangkalan data, konteks transaksi, dan penjejakan log. Amalan terbaik termasuk: 1. Panggilan Buang () untuk membersihkan selepas digunakan; 2. Elakkan terlalu banyak; 3. Warisan yang diperlukan untuk warisan benang kanak -kanak; 4. Jangan menyimpan objek besar. Nilai awal boleh ditetapkan melalui initialValue () atau initial (), dan permulaannya ditangguhkan sehingga panggilan pertama ().

Contoh pilihan Java Contoh pilihan Java Jul 12, 2025 am 02:55 AM

Pilihan dapat jelas menyatakan niat dan mengurangkan bunyi kod untuk penghakiman null. 1. Pilihan.Ofnullable adalah cara biasa untuk menangani objek null. Sebagai contoh, apabila mengambil nilai dari peta, Orelse boleh digunakan untuk memberikan nilai lalai, supaya logik lebih jelas dan ringkas; 2. Gunakan panggilan rantaian peta untuk mencapai nilai bersarang untuk menghindari NPE dengan selamat, dan secara automatik menamatkan jika ada pautan adalah null dan mengembalikan nilai lalai; 3. Penapis boleh digunakan untuk penapisan bersyarat, dan operasi seterusnya akan terus dilakukan hanya jika syarat -syarat dipenuhi, jika tidak, ia akan melompat terus ke Orelse, yang sesuai untuk penghakiman perniagaan ringan; 4. Ia tidak disyorkan untuk menggunakan terlalu banyak pilihan, seperti jenis asas atau logik mudah, yang akan meningkatkan kerumitan, dan beberapa senario akan terus kembali ke NU.

Bagaimana untuk memperbaiki java.io.notserializableException? Bagaimana untuk memperbaiki java.io.notserializableException? Jul 12, 2025 am 03:07 AM

Penyelesaian teras untuk menghadapi java.io.notserializableException adalah untuk memastikan bahawa semua kelas yang perlu bersiri melaksanakan antara muka berseri dan periksa sokongan serialisasi objek bersarang. 1. Tambah implementsSerializable ke kelas utama; 2. Pastikan kelas medan tersuai yang sepadan di dalam kelas juga melaksanakan bersiri; 3. Gunakan sementara untuk menandakan medan yang tidak perlu bersiri; 4. Periksa jenis yang tidak berseri dalam koleksi atau objek bersarang; 5. Semak kelas mana yang tidak melaksanakan antara muka; 6. Pertimbangkan reka bentuk pengganti untuk kelas yang tidak dapat diubah suai, seperti menyimpan data utama atau menggunakan struktur pertengahan berseri; 7. Pertimbangkan untuk mengubah suai

Bagaimana untuk melangkah ke peta di Java? Bagaimana untuk melangkah ke peta di Java? Jul 13, 2025 am 02:54 AM

Terdapat tiga kaedah umum untuk melintasi Peta di Java: 1. Gunakan entriSet untuk mendapatkan kunci dan nilai pada masa yang sama, yang sesuai untuk kebanyakan senario; 2. Gunakan kekunci atau nilai untuk melintasi kekunci atau nilai masing -masing; 3. Gunakan Foreach Java8 untuk memudahkan struktur kod. EntrySet mengembalikan set set yang mengandungi semua pasangan nilai utama, dan setiap gelung mendapat objek peta.Entry, sesuai untuk akses kerap ke kunci dan nilai; Jika hanya kekunci atau nilai yang diperlukan, anda boleh memanggil kekunci () atau nilai () masing -masing, atau anda boleh mendapatkan nilai melalui map.get (kunci) apabila melintasi kunci; Java 8 boleh menggunakan foreach ((kunci, nilai)-& gt

Kandungan Dinamik Mengikis Web Python Kandungan Dinamik Mengikis Web Python Jul 10, 2025 pm 12:18 PM

Merangkak web dinamik boleh dicapai melalui antara muka analisis atau penyemak imbas simulasi. 1. Gunakan alat pemaju pelayar untuk melihat permintaan XHR/mengambil dalam rangkaian, cari antara muka yang mengembalikan data JSON, dan gunakan permintaan untuk mendapatkannya; 2. Jika halaman itu diberikan oleh rangka kerja front-end dan tidak mempunyai antara muka bebas, anda boleh memulakan penyemak imbas dengan selenium dan tunggu unsur-unsur dimuatkan dan diekstrak; 3. Menguasai kaedah ini secara berkesan dapat menangani senario merangkak web yang paling dinamik.

Pembanding vs setanding di java Pembanding vs setanding di java Jul 13, 2025 am 02:31 AM

Di Java, setanding digunakan untuk menentukan peraturan penyortiran lalai secara dalaman, dan komparator digunakan untuk menentukan pelbagai logik penyortiran secara luaran. 1.Sampar adalah antara muka yang dilaksanakan oleh kelas itu sendiri. Ia mentakrifkan susunan semula jadi dengan menulis semula kaedah CompareTo (). Ia sesuai untuk kelas dengan kaedah penyortiran tetap dan paling biasa digunakan, seperti rentetan atau integer. 2. Sempadan adalah antara muka fungsional yang ditakrifkan secara luaran, dilaksanakan melalui kaedah membandingkan (), sesuai untuk situasi di mana kaedah penyortiran berganda diperlukan untuk kelas yang sama, kod sumber kelas tidak dapat diubah suai, atau logik penyortiran sering diubah. Perbezaan antara keduanya adalah setanding yang hanya dapat menentukan logik penyortiran dan perlu mengubah suai kelas itu sendiri, sementara perbandingan

See all articles