日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

一文搞定Java NIO,以及各種奇葩流

來源: 責(zé)編: 時(shí)間:2023-08-05 11:46:14 4765觀看
導(dǎo)讀大家好,我是哪吒。很多朋友問我,如何才能學(xué)好IO流,對(duì)各種流的概念,云里霧里的,不求甚解。用到的時(shí)候,現(xiàn)百度,功能雖然實(shí)現(xiàn)了,但是為什么用這個(gè)?不知道。更別說效率問題了~下次再遇到,再百度,“良性循環(huán)”。今天,我就用一天的時(shí)間,

2YJ28資訊網(wǎng)——每日最新資訊28at.com

大家好,我是哪吒。2YJ28資訊網(wǎng)——每日最新資訊28at.com

很多朋友問我,如何才能學(xué)好IO流,對(duì)各種流的概念,云里霧里的,不求甚解。用到的時(shí)候,現(xiàn)百度,功能雖然實(shí)現(xiàn)了,但是為什么用這個(gè)?不知道。更別說效率問題了~2YJ28資訊網(wǎng)——每日最新資訊28at.com

下次再遇到,再百度,“良性循環(huán)”。2YJ28資訊網(wǎng)——每日最新資訊28at.com

今天,我就用一天的時(shí)間,整理一下關(guān)于Java I/O流的知識(shí)點(diǎn),分享給大家。2YJ28資訊網(wǎng)——每日最新資訊28at.com

每一種IO流,都配有示例代碼,大家可以跟著敲一遍,找找感覺~2YJ28資訊網(wǎng)——每日最新資訊28at.com

本篇文章介紹Java NIO以及其它的各種奇葩流。2YJ28資訊網(wǎng)——每日最新資訊28at.com

Java NIO (New I/O) 是 Java 1.4 引入的,在 Java 7 中又進(jìn)行了一些增強(qiáng)。NIO 可以提高 I/O 操作的效率,它的核心是通道 (Channel) 和緩沖區(qū) (Buffer)。2YJ28資訊網(wǎng)——每日最新資訊28at.com

一、Channel

Channel 是一種新的 I/O 抽象,它與傳統(tǒng)的 InputStream 和 OutputStream 不同,Channel 可以同時(shí)進(jìn)行讀和寫操作,而且可以對(duì)其進(jìn)行更細(xì)粒度的控制。Java NIO 中最基本的 Channel 包括:2YJ28資訊網(wǎng)——每日最新資訊28at.com

1、FileChannel代碼示例

使用FileChannel從源文件中讀取內(nèi)容并將其寫入到目標(biāo)文件。2YJ28資訊網(wǎng)——每日最新資訊28at.com

import java.io.FileInputStream;          // 引入 FileInputStream 類import java.io.FileOutputStream;         // 引入 FileOutputStream 類import java.nio.ByteBuffer;              // 引入 ByteBuffer 類import java.nio.channels.FileChannel;    // 引入 FileChannel 類public class FileChannelExample {    public static void main(String[] args) {        String sourceFile = "source.txt";        String targetFile = "target.txt";        try {            // 使用 FileInputStream 和 FileOutputStream 打開源文件和目標(biāo)文件            FileInputStream fileInputStream = new FileInputStream(sourceFile);            FileOutputStream fileOutputStream = new FileOutputStream(targetFile);            // 獲取 FileChannel 對(duì)象            FileChannel sourceChannel = fileInputStream.getChannel();            FileChannel targetChannel = fileOutputStream.getChannel();            // 創(chuàng)建 ByteBuffer 對(duì)象            ByteBuffer buffer = ByteBuffer.allocate(1024);            // 從源文件中讀取內(nèi)容并將其寫入目標(biāo)文件            while (sourceChannel.read(buffer) != -1) {                buffer.flip();  // 準(zhǔn)備寫入(flip buffer)                targetChannel.write(buffer);  // 向目標(biāo)文件寫入數(shù)據(jù)                buffer.clear(); // 緩沖區(qū)清空(clear buffer)            }            // 關(guān)閉所有的 FileChannel、FileInputStream 和 FileOutputStream 對(duì)象            sourceChannel.close();            targetChannel.close();            fileInputStream.close();            fileOutputStream.close();            // 打印成功信息            System.out.println("文件復(fù)制成功!");        } catch (Exception e) {            e.printStackTrace();        }    }}

2、DatagramChannel代碼示例

用于 UDP 協(xié)議的數(shù)據(jù)讀寫操作。2YJ28資訊網(wǎng)——每日最新資訊28at.com

使用DatagramChannel從一個(gè)端口讀取數(shù)據(jù)并將數(shù)據(jù)發(fā)送到另一個(gè)端口。2YJ28資訊網(wǎng)——每日最新資訊28at.com

import java.io.IOException;                    // 引入 IOException 類import java.InetSocketAddress;             // 引入 InetSocketAddress 類import java.nio.ByteBuffer;                     // 引入 ByteBuffer 類import java.nio.channels.DatagramChannel;       // 引入 DatagramChannel 類public class DatagramChannelExample {    public static void main(String[] args) {        int receivePort = 8888;        int sendPort = 9999;        try {            // 創(chuàng)建 DatagramChannel 對(duì)象            DatagramChannel receiveChannel = DatagramChannel.open();            // 綁定接收端口            receiveChannel.socket().bind(new InetSocketAddress(receivePort));            System.out.println("接收端口 " + receivePort + " 正在等待數(shù)據(jù)...");            // 創(chuàng)建數(shù)據(jù)緩沖區(qū)對(duì)象            ByteBuffer receiveBuffer = ByteBuffer.allocate(1024);            // 從 receiveChannel 接收數(shù)據(jù)            receiveChannel.receive(receiveBuffer);            // 顯示收到的數(shù)據(jù)            System.out.println("收到的數(shù)據(jù)是:" + new String(receiveBuffer.array()));            // 關(guān)閉 receiveChannel 對(duì)象            receiveChannel.close();            // 創(chuàng)建 DatagramChannel 對(duì)象            DatagramChannel sendChannel = DatagramChannel.open();            // 創(chuàng)建數(shù)據(jù)緩沖區(qū)對(duì)象            ByteBuffer sendBuffer = ByteBuffer.allocate(1024);            // 向數(shù)據(jù)緩沖區(qū)寫入數(shù)據(jù)            sendBuffer.clear();            sendBuffer.put("Hello World".getBytes());            sendBuffer.flip();            // 發(fā)送數(shù)據(jù)到指定端口            sendChannel.send(sendBuffer, new InetSocketAddress("localhost", sendPort));            System.out.println("數(shù)據(jù)已發(fā)送到端口 " + sendPort);            // 關(guān)閉 sendChannel 對(duì)象            sendChannel.close();        } catch (IOException e) {            e.printStackTrace();        }    }}

3、SocketChannel 和 ServerSocketChannel代碼示例

用于 TCP 協(xié)議的數(shù)據(jù)讀寫操作。2YJ28資訊網(wǎng)——每日最新資訊28at.com

下面是一個(gè)簡(jiǎn)單的示例,演示如何使用 SocketChannel 和 ServerSocketChannel 進(jìn)行基本的 TCP 數(shù)據(jù)讀寫操作。2YJ28資訊網(wǎng)——每日最新資訊28at.com

import java.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.ServerSocketChannel;import java.nio.channels.SocketChannel;public class TCPExample {    public static void main(String[] args) throws Exception {        // 創(chuàng)建 ServerSocketChannel 并綁定端口        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();        serverSocketChannel.socket().bind(new InetSocketAddress(8888));        serverSocketChannel.configureBlocking(false);        // 創(chuàng)建一個(gè) ByteBuffer 用于接收數(shù)據(jù)        ByteBuffer buf = ByteBuffer.allocate(1024);        // 等待客戶端連接        while (true) {            SocketChannel socketChannel = serverSocketChannel.accept();            if (socketChannel != null) {                // 客戶端已連接,從 SocketChannel 中讀取數(shù)據(jù)                int bytesRead = socketChannel.read(buf);                while (bytesRead != -1) {                    // 處理讀取到的數(shù)據(jù)                    System.out.println(new String(buf.array(), 0, bytesRead));                                        // 清空 ByteBuffer,進(jìn)行下一次讀取                    buf.clear();                    bytesRead = socketChannel.read(buf);                }            }        }    }}

示例代碼說明:2YJ28資訊網(wǎng)——每日最新資訊28at.com

  • 創(chuàng)建一個(gè) ServerSocketChannel 并綁定到本地端口 8888,然后將其設(shè)置為非阻塞模式。
  • 創(chuàng)建一個(gè) ByteBuffer 用于接收數(shù)據(jù)。
  • 進(jìn)入一個(gè)死循環(huán),不斷等待客戶端連接。
  • 當(dāng)客戶端連接時(shí),從 SocketChannel 中讀取數(shù)據(jù),并將讀取到的數(shù)據(jù)打印到控制臺(tái)。
  • 清空 ByteBuffer,進(jìn)行下一次讀取。

需要注意的點(diǎn):2YJ28資訊網(wǎng)——每日最新資訊28at.com

  • 在代碼中每次讀取結(jié)束都需要清空 ByteBuffer,否則其 position 屬性不會(huì)自動(dòng)歸零,可能導(dǎo)致數(shù)據(jù)讀取不正確。
  • 由于使用非阻塞模式,如果調(diào)用了 accept() 方法但沒有立即接收到客戶端連接,該方法會(huì)返回 null,需要繼續(xù)循環(huán)等待。
  • 本代碼只演示了從客戶端讀取數(shù)據(jù)的部分,如果需要向客戶端發(fā)送數(shù)據(jù)需要調(diào)用SocketChannel.write()方法

如果想要向客戶端發(fā)送數(shù)據(jù),可以使用以下代碼:2YJ28資訊網(wǎng)——每日最新資訊28at.com

// 創(chuàng)建一個(gè) ByteBuffer 用于發(fā)送數(shù)據(jù)ByteBuffer buf = ByteBuffer.wrap("Hello, world!".getBytes());// 向客戶端發(fā)送數(shù)據(jù)socketChannel.write(buf);

二、Buffer

Buffer 是一個(gè)對(duì)象,它包含一些要寫入或要讀出的數(shù)據(jù)。在 NIO 中,Buffer 可以被看作為一個(gè)字節(jié)數(shù)組,但是它的讀取和寫入操作比直接的字節(jié)數(shù)組更加高效。NIO 中最常用的 Buffer 類型包括:2YJ28資訊網(wǎng)——每日最新資訊28at.com

1、ByteBuffer示例代碼

字節(jié)緩沖區(qū),最常用的緩沖區(qū)類型,用于對(duì)字節(jié)數(shù)據(jù)的讀寫操作。2YJ28資訊網(wǎng)——每日最新資訊28at.com

import java.nio.ByteBuffer;public class ByteBufferExample {  public static void main(String[] args) {    // 創(chuàng)建一個(gè)新的字節(jié)緩沖區(qū),初始容量為10個(gè)字節(jié)    ByteBuffer buffer = ByteBuffer.allocate(10);        // 向緩沖區(qū)中寫入4個(gè)字節(jié)    buffer.put((byte) 1);    buffer.put((byte) 2);    buffer.put((byte) 3);    buffer.put((byte) 4);        // 輸出緩沖區(qū)中的內(nèi)容    buffer.flip(); // 將緩沖區(qū)切換成讀模式    System.out.println(buffer.get()); // 輸出1    System.out.println(buffer.get()); // 輸出2    System.out.println(buffer.get()); // 輸出3    System.out.println(buffer.get()); // 輸出4        // 將緩沖區(qū)清空并重新寫入數(shù)據(jù)    buffer.clear();    buffer.put((byte) 5);    buffer.put((byte) 6);    buffer.put((byte) 7);    buffer.put((byte) 8);        // 輸出緩沖區(qū)中的內(nèi)容,方法同上    buffer.flip();    System.out.println(buffer.get()); // 輸出5    System.out.println(buffer.get()); // 輸出6    System.out.println(buffer.get()); // 輸出7    System.out.println(buffer.get()); // 輸出8  }}

示例代碼說明:2YJ28資訊網(wǎng)——每日最新資訊28at.com

  • 在上面的示例中,我們使用ByteBuffer類的allocate()方法創(chuàng)建了一個(gè)新的字節(jié)緩沖區(qū),然后向緩沖區(qū)中寫入4個(gè)字節(jié)的數(shù)據(jù)。
  • 接著,我們通過調(diào)用flip()方法將緩沖區(qū)切換成讀模式,并使用get()方法讀取緩沖區(qū)中的數(shù)據(jù),并按順序輸出每個(gè)字節(jié)。
  • 最后,我們清空緩沖區(qū)并重新寫入數(shù)據(jù),再次將緩沖區(qū)切換成讀模式,并使用get()方法讀取緩沖區(qū)中的數(shù)據(jù)。

2、CharBuffer示例代碼

字符緩沖區(qū),用于對(duì)字符數(shù)據(jù)的讀寫操作。2YJ28資訊網(wǎng)——每日最新資訊28at.com

import java.nio.CharBuffer;public class CharBufferExample {    public static void main(String[] args) {        // 創(chuàng)建一個(gè)新的字符緩沖區(qū),初始容量為10個(gè)字符        CharBuffer buffer = CharBuffer.allocate(10);                // 向緩沖區(qū)中寫入4個(gè)字符        buffer.put('a');        buffer.put('b');        buffer.put('c');        buffer.put('d');                // 輸出緩沖區(qū)中的內(nèi)容        buffer.flip(); // 將緩沖區(qū)切換成讀模式        System.out.println(buffer.get()); // 輸出a        System.out.println(buffer.get()); // 輸出b        System.out.println(buffer.get()); // 輸出c        System.out.println(buffer.get()); // 輸出d                // 將緩沖區(qū)清空并重新寫入數(shù)據(jù)        buffer.clear();        buffer.put('e');        buffer.put('f');        buffer.put('g');        buffer.put('h');                // 輸出緩沖區(qū)中的內(nèi)容,方法同上        buffer.flip();        System.out.println(buffer.get()); // 輸出e        System.out.println(buffer.get()); // 輸出f        System.out.println(buffer.get()); // 輸出g        System.out.println(buffer.get()); // 輸出h    }}

示例代碼說明:2YJ28資訊網(wǎng)——每日最新資訊28at.com

  • 在上面的示例中,我們使用CharBuffer類的allocate()方法創(chuàng)建了一個(gè)新的字符緩沖區(qū),然后向緩沖區(qū)中寫入4個(gè)字符的數(shù)據(jù)。
  • 接著,我們通過調(diào)用flip()方法將緩沖區(qū)切換成讀模式,并使用get()方法讀取緩沖區(qū)中的數(shù)據(jù),并按順序輸出每個(gè)字符。
  • 最后,我們清空緩沖區(qū)并重新寫入數(shù)據(jù),再次將緩沖區(qū)切換成讀模式,并使用get()方法讀取緩沖區(qū)中的數(shù)據(jù)。

3、ShortBuffer、IntBuffer、LongBuffer、FloatBuffer、DoubleBuffer 等示例代碼

import java.nio.*;public class BasicBufferExample {    public static void main(String[] args) {        // 創(chuàng)建各種基本數(shù)據(jù)類型的緩沖區(qū),初始容量為10        ShortBuffer shortBuf = ShortBuffer.allocate(10);        IntBuffer intBuf = IntBuffer.allocate(10);        LongBuffer longBuf = LongBuffer.allocate(10);        FloatBuffer floatBuf = FloatBuffer.allocate(10);        DoubleBuffer doubleBuf = DoubleBuffer.allocate(10);                // 向緩沖區(qū)中寫入數(shù)據(jù)        shortBuf.put((short) 1);        intBuf.put(2);        longBuf.put(3L);        floatBuf.put(4.0f);        doubleBuf.put(5.0);                // 反轉(zhuǎn)緩沖區(qū),切換到讀模式        shortBuf.flip();        intBuf.flip();        longBuf.flip();        floatBuf.flip();        doubleBuf.flip();                // 讀取緩沖區(qū)中的數(shù)據(jù)        System.out.println(shortBuf.get()); // 輸出1        System.out.println(intBuf.get()); // 輸出2        System.out.println(longBuf.get()); // 輸出3        System.out.println(floatBuf.get()); // 輸出4.0        System.out.println(doubleBuf.get()); // 輸出5.0    }}

示例代碼說明:2YJ28資訊網(wǎng)——每日最新資訊28at.com

  • 在上面的示例中,我們分別創(chuàng)建了ShortBuffer、IntBuffer、LongBuffer、FloatBuffer、DoubleBuffer等基本數(shù)據(jù)類型的緩沖區(qū)。
  • 接著,我們向這些緩沖區(qū)中寫入了對(duì)應(yīng)數(shù)據(jù)類型的數(shù)據(jù)。
  • 然后我們通過調(diào)用flip()方法,將緩沖區(qū)切換成讀模式,并通過get()方法讀取緩沖區(qū)中的數(shù)據(jù),并按順序輸出每一個(gè)數(shù)據(jù)類型的內(nèi)容。

三、Selector

Selector 是 Java NIO 類庫中的一個(gè)重要組件,它用于監(jiān)聽多個(gè) Channel 的事件。在一個(gè)線程中,通過 Selector 可以監(jiān)聽多個(gè) Channel 的 IO 事件,并實(shí)現(xiàn)了基于事件響應(yīng)的架構(gòu)。Selector 可以讓單個(gè)線程處理多個(gè) Channel,因此它可以提高多路復(fù)用的效率。2YJ28資訊網(wǎng)——每日最新資訊28at.com

1、Selector讓單線程處理多個(gè)Channel的代碼示例

import java.io.IOException;import java.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.*;import java.util.Iterator;import java.util.Set;public class SelectorExample {    public static void main(String[] args) throws IOException {        // 創(chuàng)建一個(gè)ServerSocketChannel,監(jiān)聽本地端口        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();        serverSocketChannel.socket().bind(new InetSocketAddress("localhost", 8080));        serverSocketChannel.configureBlocking(false);                // 創(chuàng)建一個(gè)Selector,并將serverSocketChannel注冊(cè)到Selector上        Selector selector = Selector.open();        serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);        System.out.println("Server started on port 8080");        while (true) {            // 如果沒有任何事件發(fā)生,則阻塞等待            selector.select();            // 處理事件            Set<SelectionKey> selectedKeys = selector.selectedKeys();            Iterator<SelectionKey> keyIterator = selectedKeys.iterator();            while (keyIterator.hasNext()) {                SelectionKey key = keyIterator.next();                if (key.isAcceptable()) {                    // 處理新的連接請(qǐng)求                    ServerSocketChannel serverChannel = (ServerSocketChannel) key.channel();                    SocketChannel clientChannel = serverChannel.accept();                    clientChannel.configureBlocking(false);                    System.out.println("Accepted connection from " + clientChannel.getRemoteAddress());                    clientChannel.register(selector, SelectionKey.OP_READ);                } else if (key.isReadable()) {                    // 處理讀事件                    SocketChannel clientChannel = (SocketChannel) key.channel();                    ByteBuffer buffer = ByteBuffer.allocate(1024);                    int bytesRead = clientChannel.read(buffer);                    String message = new String(buffer.array(), 0, bytesRead);                    System.out.println("Received message from " + clientChannel.getRemoteAddress() + ": " + message);                    // 回寫數(shù)據(jù)                    ByteBuffer outputBuffer = ByteBuffer.wrap(("Echo: " + message).getBytes());                    clientChannel.write(outputBuffer);                }                // 從待處理事件集合中移除當(dāng)前事件                keyIterator.remove();            }        }    }}

2、示例代碼說明

  • 使用ServerSocketChannel監(jiān)聽本地8080端口,并將ServerSocketChannel注冊(cè)到Selector上。
  • 在while循環(huán)中,我們通過調(diào)用select()方法等待事件發(fā)生,如果有事件發(fā)生,則從Selector中獲取待處理事件集合,然后遍歷事件集合,處理每個(gè)事件。
  • 如果當(dāng)前事件是新的連接請(qǐng)求,則接受該連接,并將對(duì)應(yīng)的SocketChannel注冊(cè)到Selector上,使用OP_READ模式表示可以讀取數(shù)據(jù)。
  • 如果當(dāng)前事件是可讀的,則讀取SocketChannel中的數(shù)據(jù)并進(jìn)行回寫,回寫時(shí)使用ByteBuffer包裝需要回寫的數(shù)據(jù),并將其寫入到SocketChannel中。
  • 最后,我們從待處理事件集合中移除當(dāng)前事件。

四、ZipInputStream 和 ZipOutputStream

ZipInputStream 和 ZipOutputStream 可以用于處理 ZIP 文件格式,ZipInputStream 可以從 ZIP 文件中讀取數(shù)據(jù),ZipOutputStream 可以向 ZIP 文件中寫入數(shù)據(jù)。2YJ28資訊網(wǎng)——每日最新資訊28at.com

1、ZipInputStream示例代碼

import java.io.*;import java.util.zip.ZipEntry;import java.util.zip.ZipOutputStream;public class ZipExample {    public static void main(String[] args) throws IOException {        // 輸入文件路徑和輸出壓縮文件路徑        String inputFile = "/path/to/input/file";        String outputFile = "/path/to/output/file.zip";        // 創(chuàng)建ZipOutputStream,并設(shè)置壓縮級(jí)別        ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(outputFile));        zipOutputStream.setLevel(9);        // 讀取需要壓縮的文件到文件輸入流        FileInputStream fileInputStream = new FileInputStream(inputFile);        BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);        // 設(shè)置壓縮文件內(nèi)部的名稱        ZipEntry zipEntry = new ZipEntry(inputFile);        zipOutputStream.putNextEntry(zipEntry);        // 寫入壓縮文件        byte[] buf = new byte[1024];        int len;        while ((len = bufferedInputStream.read(buf)) > 0) {            zipOutputStream.write(buf, 0, len);        }        bufferedInputStream.close();        zipOutputStream.closeEntry();        zipOutputStream.close();        System.out.println("File compressed successfully");    }}

示例代碼說明:2YJ28資訊網(wǎng)——每日最新資訊28at.com

  • 首先,我們創(chuàng)建ZipOutputStream并設(shè)置壓縮級(jí)別。
  • 接著,我們創(chuàng)建輸入文件的FileInputStream,并使用BufferedInputStream包裝它。
  • 我們接著設(shè)置壓縮文件內(nèi)部的名稱,并使用zipOutputStream.putNextEntry()方法將其寫入ZipOutputStream中。
  • 最后,我們從緩沖區(qū)讀取文件數(shù)據(jù)并將其寫入ZipOutputStream中。最后關(guān)閉輸入流和ZipOutputStream。

2、ZipOutputStream示例代碼

import java.io.*;import java.util.zip.ZipEntry;import java.util.zip.ZipInputStream;public class UnzipExample {    public static void main(String[] args) throws IOException {        // 輸入壓縮文件路徑和輸出文件路徑        String inputFile = "/path/to/input/file.zip";        String outputFile = "/path/to/output/file";        // 創(chuàng)建ZipInputStream        ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(inputFile));        // 循環(huán)讀取壓縮文件中的條目        ZipEntry zipEntry = zipInputStream.getNextEntry();        while (zipEntry != null) {            // 如果是目錄,則創(chuàng)建空目錄            if (zipEntry.isDirectory()) {                new File(outputFile + File.separator + zipEntry.getName()).mkdirs();            } else { // 如果是文件,則輸出文件                FileOutputStream fileOutputStream = new FileOutputStream(outputFile + File.separator                        + zipEntry.getName());                byte[] buf = new byte[1024];                int len;                while ((len = zipInputStream.read(buf)) > 0) {                    fileOutputStream.write(buf, 0, len);                }                fileOutputStream.close();            }            zipInputStream.closeEntry();            zipEntry = zipInputStream.getNextEntry();        }        zipInputStream.close();        System.out.println("File uncompressed successfully");    }}

示例代碼說明:2YJ28資訊網(wǎng)——每日最新資訊28at.com

  • 使用ZipInputStream從指定輸入文件中解壓文件到指定的輸出文件夾中。
  • 我們創(chuàng)建ZipInputStream,然后循環(huán)讀取壓縮文件中的條目。如果當(dāng)前條目是目錄,則創(chuàng)建空目錄,并使用mkdirs()方法創(chuàng)建目錄。如果當(dāng)前條目是文件,則使用FileOutputStream將文件寫入到指定的輸出文件中。
  • 最后關(guān)閉當(dāng)前ZipEntry,并通過getNextEntry()方法獲取ZipInputStream中的下一個(gè)條目。

五、GZIPInputStream 和 GZIPOutputStream

GZIPInputStream 和 GZIPOutputStream 可以用于進(jìn)行 GZIP 壓縮,GZIPInputStream 可以從壓縮文件中讀取數(shù)據(jù),GZIPOutputStream 可以將數(shù)據(jù)寫入壓縮文件中。2YJ28資訊網(wǎng)——每日最新資訊28at.com

1、GZIPInputStream代碼示例

import java.io.*;import java.util.zip.GZIPOutputStream;public class GzipExample {    public static void main(String[] args) throws IOException {        // 輸入文件路徑和輸出壓縮文件路徑        String inputFile = "/path/to/input/file";        String outputFile = "/path/to/output/file.gz";        // 創(chuàng)建GZIPOutputStream,并設(shè)置壓縮級(jí)別        GZIPOutputStream gzipOutputStream = new GZIPOutputStream(new FileOutputStream(outputFile));        gzipOutputStream.setLevel(9);        // 讀取需要壓縮的文件到文件輸入流        FileInputStream fileInputStream = new FileInputStream(inputFile);        BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);        // 寫入壓縮文件        byte[] buf = new byte[1024];        int len;        while ((len = bufferedInputStream.read(buf)) > 0) {            gzipOutputStream.write(buf, 0, len);        }        bufferedInputStream.close();        gzipOutputStream.close();        System.out.println("File compressed successfully");    }}

示例代碼說明:2YJ28資訊網(wǎng)——每日最新資訊28at.com

  • 使用GZIPOutputStream將指定的輸入文件壓縮成輸出文件。
  • 首先,創(chuàng)建GZIPOutputStream并設(shè)置壓縮級(jí)別。
  • 接著,創(chuàng)建輸入文件的FileInputStream,并使用BufferedInputStream包裝它。
  • 接著從緩沖區(qū)讀取文件數(shù)據(jù)并將其寫入GZIPOutputStream中。最后關(guān)閉輸入流和GZIPOutputStream。

2、GZIPOutputStream代碼示例

import java.io.*;import java.util.zip.GZIPInputStream;public class GunzipExample {    public static void main(String[] args) throws IOException {        // 輸入壓縮文件路徑和輸出文件路徑        String inputFile = "/path/to/input/file.gz";        String outputFile = "/path/to/output/file";        // 創(chuàng)建GZIPInputStream        GZIPInputStream gzipInputStream = new GZIPInputStream(new FileInputStream(inputFile));        // 輸出文件        FileOutputStream fileOutputStream = new FileOutputStream(outputFile);        byte[] buf = new byte[1024];        int len;        while ((len = gzipInputStream.read(buf)) > 0) {            fileOutputStream.write(buf, 0, len);        }        gzipInputStream.close();        fileOutputStream.close();        System.out.println("File uncompressed successfully");    }}

示例代碼說明:2YJ28資訊網(wǎng)——每日最新資訊28at.com

  • 使用GZIPInputStream從指定輸入文件中解壓文件到指定的輸出文件中。
  • 首先,我們創(chuàng)建GZIPInputStream,然后從緩沖區(qū)讀取文件數(shù)據(jù)并將其寫入到指定的輸出文件中。
  • 最后,我們關(guān)閉輸入流和輸出流。

六、ByteArrayInputStream 和 ByteArrayOutputStream

ByteArrayInputStream 和 ByteArrayOutputStream 分別是 ByteArrayInputStream 和 ByteArrayOutputStream 類的子類,它們可以用于對(duì)字節(jié)數(shù)組進(jìn)行讀寫操作。2YJ28資訊網(wǎng)——每日最新資訊28at.com

1、ByteArrayInputStream 代碼示例

import java.io.ByteArrayInputStream;import java.io.ByteArrayInputStream;import java.io.IOException;public class ByteArrayInputStreamExample {    public static void main(String[] args) throws IOException {        // 用字符串初始化一個(gè)字節(jié)數(shù)組,作為輸入數(shù)據(jù)源        String input = "Hello, world!";        byte[] inputBytes = input.getBytes();        // 創(chuàng)建一個(gè)ByteArrayInputStream,使用輸入數(shù)據(jù)源        ByteArrayInputStream inputStream = new ByteArrayInputStream(inputBytes);        // 讀取并輸出輸入流中的數(shù)據(jù)        byte[] buf = new byte[1024];        int len;        while ((len = inputStream.read(buf)) != -1) {            System.out.println(new String(buf, 0, len));        }        // 關(guān)閉輸入流        inputStream.close();    }}

示例代碼說明:2YJ28資訊網(wǎng)——每日最新資訊28at.com

  • 使用“Hello, world!”字符串創(chuàng)建了一個(gè)字節(jié)數(shù)組作為輸入數(shù)據(jù)源,并使用ByteArrayInputStream將其包裝成輸入流。
  • 使用一個(gè)循環(huán)從輸入流中讀取數(shù)據(jù),并使用new String()方法將其轉(zhuǎn)換成字符串并輸出到控制臺(tái)。
  • 最后,關(guān)閉輸入流。

2、ByteArrayOutputStream代碼示例

import java.io.ByteArrayOutputStream;import java.io.IOException;public class ByteArrayOutputStreamExample {    public static void main(String[] args) {        String input = "Hello World!";        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();        byte[] output;        try {            outputStream.write(input.getBytes());            output = outputStream.toByteArray();            System.out.println(new String(output));        } catch (IOException e) {            System.out.println("Error: " + e.getMessage());        } finally {            try {                outputStream.close();            } catch (IOException e) {                System.out.println("Error: " + e.getMessage());            }        }    }}

示例代碼說明:2YJ28資訊網(wǎng)——每日最新資訊28at.com

  • 在這個(gè)例子中,創(chuàng)建了一個(gè)ByteArrayOutputStream對(duì)象 outputStream,并向其寫入一個(gè)字符串"Hello World!"。然后,我們使用toByteArray()方法將結(jié)果轉(zhuǎn)換為一個(gè)字節(jié)數(shù)組,并打印出來。
  • 注意:在使用ByteArrayOutputStream時(shí),要確保在不再需要它時(shí)關(guān)閉它以確保所有的字節(jié)都被刷新到輸出流中。

七、總結(jié)

本文為您講解了 Java I/O、NIO 以及其他一些流的基本概念、用法和區(qū)別。Java I/O 和 NIO 可以完成很多復(fù)雜的輸入輸出操作,包括文件操作、網(wǎng)絡(luò)編程、序列化等。其他流技術(shù)可以實(shí)現(xiàn)壓縮、讀寫字節(jié)數(shù)組等功能。在進(jìn)行開發(fā)時(shí),根據(jù)具體需求選擇不同的流技術(shù)可以提高程序效率和開發(fā)效率。2YJ28資訊網(wǎng)——每日最新資訊28at.com

本文轉(zhuǎn)載自微信公眾號(hào)「哪吒編程」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系哪吒編程公眾號(hào)。2YJ28資訊網(wǎng)——每日最新資訊28at.com

2YJ28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-150-0.html一文搞定Java NIO,以及各種奇葩流

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 微軟邀請(qǐng) Microsoft 365 商業(yè)用戶,測(cè)試視頻編輯器 Clipchamp

下一篇: JVM優(yōu)化:實(shí)戰(zhàn)OutOfMemoryError異常

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 一加Ace2 Pro官宣:普及16G內(nèi)存 引領(lǐng)24G

    一加官方今天繼續(xù)為本月發(fā)布的新機(jī)一加Ace2 Pro帶來預(yù)熱,公布了內(nèi)存方面的信息。“淘汰 8GB ,12GB 起步,16GB 普及,24GB 引領(lǐng),還有呢?#一加Ace2Pro#,2023 年 8 月,敬請(qǐng)期待。”同時(shí)
  • 一年經(jīng)驗(yàn)在二線城市面試后端的經(jīng)驗(yàn)分享

    忠告這篇文章只適合2年內(nèi)工作經(jīng)驗(yàn)、甚至沒有工作經(jīng)驗(yàn)的朋友閱讀。如果你是2年以上工作經(jīng)驗(yàn),請(qǐng)果斷劃走,對(duì)你沒啥幫助~主人公這篇文章內(nèi)容來自 「升職加薪」星球星友 的投稿,坐
  • 企業(yè)采用CRM系統(tǒng)的11個(gè)好處

    客戶關(guān)系管理(CRM)軟件可以為企業(yè)提供很多的好處,從客戶保留到提高生產(chǎn)力。  CRM軟件用于企業(yè)收集客戶互動(dòng),以改善客戶體驗(yàn)和滿意度。  CRM軟件市場(chǎng)規(guī)模如今超過580
  • 谷歌KDD'23工作:如何提升推薦系統(tǒng)Ranking模型訓(xùn)練穩(wěn)定性

    谷歌在KDD 2023發(fā)表了一篇工作,探索了推薦系統(tǒng)ranking模型的訓(xùn)練穩(wěn)定性問題,分析了造成訓(xùn)練穩(wěn)定性存在問題的潛在原因,以及現(xiàn)有的一些提升模型穩(wěn)定性方法的不足,并提出了一種新
  • 多線程開發(fā)帶來的問題與解決方法

    使用多線程主要會(huì)帶來以下幾個(gè)問題:(一)線程安全問題  線程安全問題指的是在某一線程從開始訪問到結(jié)束訪問某一數(shù)據(jù)期間,該數(shù)據(jù)被其他的線程所修改,那么對(duì)于當(dāng)前線程而言,該線程
  • 微軟邀請(qǐng) Microsoft 365 商業(yè)用戶,測(cè)試視頻編輯器 Clipchamp

    8 月 1 日消息,微軟近日宣布即將面向 Microsoft 365 商業(yè)用戶,開放 Clipchamp 應(yīng)用,邀請(qǐng)用戶通過該應(yīng)用來編輯視頻。微軟于 2021 年收購 Clipchamp,隨后開始逐步整合到 Microsof
  • 雅柏威士忌多款單品價(jià)格大跌,泥煤頂流也不香了?

    來源 | 烈酒商業(yè)觀察編 | 肖海林今年以來,威士忌市場(chǎng)開始出現(xiàn)了降溫跡象,越來越多不斷暴漲的網(wǎng)紅威士忌也開始悄然回歸市場(chǎng)理性。近日,LVMH集團(tuán)旗下蘇格蘭威士忌品牌雅柏(Ardbeg
  • ESG的面子與里子

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之三伏大幕拉起,各地高溫預(yù)警不絕,但處于厄爾尼諾大&ldquo;烤&rdquo;之下的除了眾生,還有各大企業(yè)發(fā)布的ESG報(bào)告。ESG是&ldquo;環(huán)境保
  • 攜眾多高端產(chǎn)品亮相ChinaJoy,小米帶來一場(chǎng)科技與人文的視聽盛宴

    7月28日,全球數(shù)字娛樂領(lǐng)域最具知名度與影響力的年度盛會(huì)中國(guó)國(guó)際數(shù)碼互動(dòng)娛樂展覽會(huì)(簡(jiǎn)稱ChinaJoy)在上海新國(guó)際博覽中心盛大開幕。作為全球領(lǐng)先的科
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美日韩高清不卡| 久久成人羞羞网站| 亚洲成人直播| 最新国产成人在线观看| 亚洲免费精品| 亚洲欧美国产三级| 久久gogo国模裸体人体| 欧美99在线视频观看| 欧美日韩精品欧美日韩精品 | 亚洲字幕一区二区| 久久aⅴ国产欧美74aaa| 欧美大片在线观看一区二区| 欧美色网一区二区| 国内精品国产成人| 日韩亚洲欧美高清| 久久riav二区三区| 欧美日韩高清一区| 国模叶桐国产精品一区| 日韩亚洲一区在线播放| 欧美一区中文字幕| 欧美另类综合| 国产主播一区二区| 一区二区高清在线| 久久亚洲不卡| 国产精品免费观看视频| 在线观看亚洲视频| 亚洲欧美综合精品久久成人| 欧美大秀在线观看| 国产亚洲欧美日韩日本| 一本色道久久综合亚洲精品婷婷 | 欧美日韩免费观看一区三区| 国产欧美一区二区三区在线看蜜臀 | 亚洲一区国产| 欧美成人日本| 国产欧美综合在线| 日韩一二三在线视频播| 久久久999精品| 国产精品福利影院| 亚洲日韩欧美一区二区在线| 久久精品国产69国产精品亚洲| 欧美人在线观看| 国产一区二区三区免费在线观看 | 亚洲人体一区| 久久久欧美一区二区| 国产精品久久久久久久电影| 亚洲国产综合在线| 欧美专区18| 国产精品卡一卡二| 亚洲精品乱码久久久久| 久久久国产精品一区| 国产精品yjizz| 亚洲人www| 久久久噜噜噜久久久| 国产精品一区二区黑丝| 夜夜嗨av一区二区三区| 欧美二区在线| 伊人久久亚洲美女图片| 欧美中文字幕久久| 国产精品欧美在线| 国产欧美日韩在线观看| 国产精品99久久99久久久二8 | 国产一区二区看久久| 亚洲综合色视频| 欧美日韩一区二区三区在线| 亚洲欧洲在线观看| 嫩草成人www欧美| 在线成人av| 久久婷婷av| 伊人色综合久久天天五月婷| 久久久av毛片精品| 国产一区日韩二区欧美三区| 亚洲一区二区免费| 国产精品久久久久91| 亚洲午夜小视频| 国产精品porn| 亚洲一区二区三区精品在线观看| 欧美日韩精品欧美日韩精品一| 91久久亚洲| 欧美精品三级| 亚洲最新在线| 欧美午夜精品久久久久久浪潮| 一区二区成人精品 | 久久精品一区蜜桃臀影院| 国产亚洲精品一区二555| 久久xxxx精品视频| 韩国在线视频一区| 久久亚洲一区二区三区四区| 永久域名在线精品| 嫩草影视亚洲| 亚洲精品免费在线播放| 欧美日韩国产小视频在线观看| 一区二区三区|亚洲午夜| 欧美视频在线播放| 亚洲欧美影音先锋| 国产在线国偷精品产拍免费yy| 久久久精品性| 亚洲高清在线播放| 欧美精品一线| 亚洲永久在线| 国产亚洲一区二区精品| 久久一区二区三区超碰国产精品| 亚洲国产精品va| 欧美日韩1080p| 亚洲午夜一区二区三区| 国产欧美日韩一区| 久久综合给合久久狠狠狠97色69| 亚洲福利视频一区二区| 欧美日韩xxxxx| 亚洲欧美日韩一区二区三区在线| 国产视频一区免费看| 老牛国产精品一区的观看方式| 亚洲日本一区二区| 国产精品jizz在线观看美国| 欧美一区在线视频| 亚洲欧洲综合另类| 国产精品免费网站在线观看| 久久精品国产一区二区三| 亚洲激情在线激情| 国产精品久久久久久久免费软件| 久久精品亚洲一区二区| 91久久综合亚洲鲁鲁五月天| 国产精品hd| 久久国产直播| 亚洲精品自在在线观看| 国产精品乱码久久久久久| 久久久久久一区| 日韩视频一区二区三区在线播放免费观看 | 校园春色国产精品| 在线成人www免费观看视频| 欧美日韩精品一区二区在线播放 | 国产欧美在线看| 欧美大片免费久久精品三p | 欧美日韩国产综合久久| 欧美中文字幕| 99精品热视频| 国语自产精品视频在线看| 欧美日韩1234| 久久久久久电影| 亚洲少妇中出一区| 在线成人黄色| 国产精品免费aⅴ片在线观看| 美女久久一区| 亚洲欧美精品在线| 亚洲国产免费| 国产日韩精品电影| 欧美日韩综合视频| 免费av成人在线| 欧美一级久久久| 99re热精品| 在线欧美日韩精品| 国产欧美精品一区| 欧美日韩国产一区二区| 久久一二三区| 香蕉久久一区二区不卡无毒影院| 亚洲精品在线看| 狠狠色综合播放一区二区| 国产精品v日韩精品| 欧美成人性网| 久久久久久尹人网香蕉| 亚洲嫩草精品久久| 日韩亚洲综合在线| 伊人婷婷欧美激情| 国产美女诱惑一区二区| 欧美天天影院| 欧美国产一区二区| 久久精品视频在线看| 亚洲综合色在线| 99在线精品视频| 亚洲国产精品传媒在线观看| 国产亚洲精品综合一区91| 国产精品白丝jk黑袜喷水| 欧美国产专区| 老牛影视一区二区三区| 久久精品国产一区二区三区免费看 | 一本久道久久久| 亚洲国产一区二区精品专区| 国内不卡一区二区三区| 国产噜噜噜噜噜久久久久久久久 | 精品电影一区| 国产日韩欧美高清免费| 国产精品伦一区| 欧美体内she精视频| 欧美人妖在线观看| 欧美国产日本| 欧美mv日韩mv国产网站app| 久久久久综合一区二区三区| 欧美在线视频全部完| 午夜久久资源| 午夜精品久久| 亚洲欧美日韩综合国产aⅴ| 亚洲一二三四区| 亚洲网站在线看| 一区二区三区视频在线播放| 日韩亚洲欧美一区二区三区| 亚洲精品欧美激情| 亚洲国产影院| 亚洲欧洲另类国产综合| 91久久线看在观草草青青| 亚洲电影毛片| 亚洲黄一区二区| 亚洲人成在线播放| 亚洲免费观看高清在线观看| 亚洲免费高清视频| 一区电影在线观看|