NIO流

7482 ワード

バッファ
JDK 1.4の後にNIO,すなわちnew IO,NIO,IOを導入したが,実現方式が異なり,NIOは主にブロックを用いているため,NIOの効率はIOよりはるかに高い.JavaのNIOの主なコアは、バッファbuffer、チャネルChannels、セレクタSelectorsです.次に、バッファとチャネルを主に書きます.
バッファ
NIOのバッファはコンテナであり,下位層は配列で格納されているが,長さを定義するとBufferの下に基本データ型を変えることができず,対応するサブクラス(boolean)ByteBufferを提供するためによく用いられるShortBuffer IntBuffer LongBuffer CharBuffer DoubleBuffer FloatBuffer
ByteBuffer
Bufferバッファ内のいくつかの重要な属性capacity;バッファの最大容量position読み出しデータは、具体的な位置limitである.限界マークブックマーク、タグ、positionを記録する方法は、私がさっきマークした位置に着く方法です.ByteBufferでは、データの読み取りと書き込みに2つの方法があります.
 String str = "abcde";
        ByteBuffer byteBuffer = ByteBuffer.allocate(10);        
        byteBuffer.put(str.getBytes());              
        byteBuffer.flip();           
        byte[] bytes = new byte[byteBuffer.limit()];
        byteBuffer.get(bytes, 0, 2);     
        System.out.println("position:" + byteBuffer.position());
        byteBuffer.mark(); //   positon   
        byteBuffer.get(bytes, 2, 2);     
        byteBuffer.reset();//       positonde  
         byteBuffer.clear();        ,            ,          , position 0
        if (byteBuffer.hasRemaining()) {//          
            System.out.println(byteBuffer.remaining()); //      
        }

バッファ分類:(Channel)非直接バッファ:JVMのメモリにバッファをByteBuffer.allocate(1024);直接バッファ:バッファをオペレーティングシステムの物理メモリに構築し、データの読み書き効率を向上させることができるByteBuffer.allocateDirect(1024);
つうしんろ
チャネル:ソースノードとターゲットノードの接続を確立し、チャネル自体にデータを格納しない.彼はバッファとインタラクティブJavaを行い、チャネルインタフェースに提供する最も主要な実現クラスは以下のローカルファイル転送チャネルFileChannel:ファイルの読み取り、書き込み、マッピング、操作のためのチャネルネットワークデータ転送のチャネルDatagramChannel:UDP読み書きネットワーク内のデータチャネル(UDPは接続されていないプロトコルで、サーバとクライアントが存在せず、受信者と送信者のみが存在するのが特徴)SocketChannel:TCPを介してネットワーク内のデータを読み書きする.()ServerSocketChannel:新しく入ってきたTCP接続を傍受でき、新しく入ってきた接続ごとにSocketChannelが作成される
チャネルを取得するいくつかの方法
方式1 FileInputStream FileOutputStream RandomAccessFileのgetChannel()メソッドでチャネルを取得する方式2 FileChannelの静的メソッドopen()でチャネルを開く方式3 Files.newByteChannel()方式4 Channels.newChannel()
方式一
チャネルを取得するには、FileInputStream FileOutputStream RandomAccessFileのgetChannel()メソッドを使用します.
 FileInputStream in = new FileInputStream("  .mp3");
        FileOutputStream out = new FileOutputStream("  2.mp3");
        //    
        FileChannel inChannel = in.getChannel();
        FileChannel outChannel = out.getChannel();
        //     
        ByteBuffer byteBuffer = ByteBuffer.allocate(1024); //         
        while (inChannel.read(byteBuffer) != -1) {
            //      
            byteBuffer.flip();
            outChannel.write(byteBuffer);
            byteBuffer.clear();//     
        }
        in.close();
        out.close();
        inChannel.close();
        outChannel.close();

チャネルを取得する第2の方法
 public static void main(String[] args) throws IOException {
        FileChannel open = FileChannel.open(Paths.get("C:\\Users\\666\\Desktop\\786.exe"), StandardOpenOption.READ);
        FileChannel open1 = FileChannel.open(Paths.get("C:\\Users\\666\\Desktop\\78.exe"), StandardOpenOption.READ, StandardOpenOption.WRITE, StandardOpenOption.CREATE);//           
      /*  StandardOpenOption.CREATE      ,   ,    ,   
         StandardOpenOption.CREATE_NEW         ,    ,   */
        ByteBuffer buffer = ByteBuffer.allocate(1024);         
        while (open.read(buffer)!=-1){
           buffer.flip();
           open1.write(buffer);
           buffer.clear();
        }
        open.close();;
        open1.close();

    }




   FileChannel inChannel = FileChannel.open(Paths.get("D:\\IntelliJIDEA2018.2.6.7z"), StandardOpenOption.READ);
        //StandardOpenOption.CREATE      ,   ,    ,   
        // StandardOpenOption.CREATE_NEW         ,    ,   
        FileChannel outChannel = FileChannel.open(Paths.get("E:\\IntelliJIDEA2018.7z"), StandardOpenOption.WRITE, StandardOpenOption.READ, StandardOpenOption.CREATE);
        //          
        MappedByteBuffer inMappedByteBuffer = inChannel.map(FileChannel.MapMode.READ_ONLY, 0, inChannel.size());
        MappedByteBuffer outMappedByteBuffer = outChannel.map(FileChannel.MapMode.READ_WRITE, 0, inChannel.size());
        //       ,       

        byte[] bytes = new byte[inMappedByteBuffer.limit()];
        inMappedByteBuffer.get(bytes);
        outMappedByteBuffer.put(bytes);

        inChannel.close();
        outChannel.close();



FileChannel inChannel = FileChannel.open(Paths.get("test.txt"), StandardOpenOption.READ);
        FileChannel outChannel = FileChannel.open(Paths.get("test2.txt"), StandardOpenOption.WRITE, StandardOpenOption.CREATE);
        //  
        //       
        ByteBuffer buffer1 = ByteBuffer.allocate(101);
        ByteBuffer buffer2 = ByteBuffer.allocate(100);
        ByteBuffer[] byteBuffers = new ByteBuffer[]{buffer1, buffer2};
        inChannel.read(byteBuffers);
        //      
        //byteBuffers[0].flip();
        //byte[] array = byteBuffers[0].array();
        //System.out.println(new String(array, 0, byteBuffers[0].limit()));
        for (ByteBuffer byteBuffer : byteBuffers) {
            byteBuffer.flip();
        }

        outChannel.write(byteBuffers);

チャネルを取得する第3の方法
FileChannel channel=new FileInputStream("a.txt").getChannel();FileChannel.open()JDK 1.7 FilesクラスSeekableByeChannel seekableByeChannel=Files.newByteChannel(Paths.get("a.txt")、StandardOpenOption.READ);Channls.newChannel()static long copy(InputStreamin,Path target,CoCouret,Counnnel,CoputStreamin,Path pyorption...options)すべてのバイトを入力ストリームからファイルにコピーします.static long copy(Path source,OutputStream out)は、ファイルから出力ストリームまでのすべてのバイトを出力ストリームにコピーします.static Path copy(Path source,Path target,CopyOption...options)は、1つのファイルをターゲットファイルにコピーします.Filesクラスでファイルをコピーする方法Files.copy(new FileInputStream(「悟り.mp 3」)、Paths.get("悟り5.mp 3");Files.copy(Paths.get("悟り.mp 3")、new FileOutputStream("悟り6.mp 3");Files.copy(Paths.get("E:狂気動物城.mp 4")、Paths.get("E:狂気動物城aa.mp 4");
こまごました物
public static Path write (Path path, Iterable < ? extends CharSequence > lines, Charset cs, OpenOption…options)テキストをファイルに書き込む行.各行は文字列であり、各線はプラットフォームの行区切り記号によってシーケンスファイルを終了し、システムによって定義された属性を書き込む.optionsパラメータはファイルを作成または開く方法を指定する.選択されていない場合、この方法の動作原理はCREATE、TRUNCATE_EXISTING、WRITEオプションが表示される場合である.つまり、書き込みファイルを開くファイルが存在しない場合は、ファイルを作成するか、既存のregular-fileを最初にサイズ0に切り捨てます.この方法では、すべての行が書き込まれていることを確認します(または、I/Oエラーまたは他の実行時に異常が投げ出された場合にファイルを閉じます)..I/Oエラーが発生した場合、ファイルが作成または切断されたか、またはファイルに書き込まれたバイトがある可能性があります.パラメータpath-ファイルのパスlinesオブジェクトは、文字列csの文字セットを巡回して符号化します.optionsオプションを使用して、ファイルrayList list=new ArrayList<>();st.add("asfdasfdasf");st.add("asfdasfdasf");st.add("asfdasfdasf");list.add("こんにちは");Files.write(Paths.get("test 444.txt")、list,Charset.forName("UTF-8");集合内のものをtest 444.txtに入れる
マルチスレッド
マルチスレッドでは、まず2つの概念、スレッドとプロセス、スレッドがプロセスに依存していることを明らかにし、プロセスとは実行中のプログラムを指し、その中の各機能は1つのスレッドと見なすことができる.プロセスは資源を持つ基本単位であり、スレッドはCPUスケジューリングの基本単位である.プロセスは人間の体の各部品のようであり、スレッドはその中の神と見なすことができる経線、CPU制御神経線.
スレッド
スレッドの作成方法1.クラスを作成し、Threadを継承する2.Threadクラスのrunメソッド3を書き換え、私たちが書いたこのサブクラスオブジェクトを作成する4.スレッドを開き、runメソッドのコードMyThread myThread 2=new MyThread();myThread 2.start()を実行させる;次にスレッドの実行であり、マルチスレッドの実行はランダムであり、スレッドの命名はsetNameメソッドを呼び出すことができる.スレッド優先度の設定:myThread.setPriority(Thread.MIN_PRIORITY);最小は1 myThread 2.setPriority(Thread.MAX_PRIORITY);最大時10優先度の高低はスレッドが実行される可能性のみを表し、必然ではない.