자 바 는 BIO 와 NIO 를 사용 하여 파일 조작 대비 코드 예 시 를 한다

자바 NIO 가 뭐 예요?
동기 화 비 차단 io 모드 에서 끓 는 물 을 가지 고 NIO 의 방법 은 하나의 스 레 드 가 끊임없이 모든 주전자 의 상 태 를 문의 하고 주전자 의 상태 가 바 뀌 었 는 지 확인 하여 다음 작업 을 하 는 것 이다.
자바 NIO 는 세 가지 구성 부분 이 있 습 니 다.Buffer,Channel,Selector 는 이벤트 구동 모드 를 통 해 언제 데 이 터 를 읽 을 수 있 는 지 에 대한 문 제 를 실 현 했 습 니 다.
자바 비 오 가 뭐야?
동기 화 차단 IO 모드 입 니 다.데이터 읽 기 기록 은 한 스 레 드 에서 완료 되 기 를 기 다 려 야 합 니 다.여기 서 그 전형 적 인 끓 는 물 예 를 사용 합 니 다.여기 서 끓 는 물 을 끓 이 는 장면 을 가정 하면 한 줄 의 주전자 가 끓 는 물 을 끓 이 고 있 습 니 다.BIO 의 작업 모델 은 하나의 스 레 드 를 주전자 에 머 무 르 게 하고 이 주전자 가 끓 을 때 까지 다음 주전 자 를 처리 하 는 것 입 니 다.하지만 실제로 스 레 드 는 주전자 가 끓 기 를 기다 리 는 시간 동안 아무것도 하지 않 았 다.io 작업 중 에 언제 데 이 터 를 읽 을 수 있 는 지 모 르 기 때문에 항상 차단 모드 입 니 다.
1.파일 읽 기

package com.zhi.test;

import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.file.Files;
import java.nio.file.Paths;

/**
 *     ,     (BF_SIZE) NIO        , BIO   <br>
 * 10M   ,BIO  87  ,NIO  68  ,Files.read  62  
 * 
 * @author    
 * @since 2020 5 9 19:20:49
 *
 */
public class FileRead {
  /**
   *      
   */
  private static final int BF_SIZE = 1024;

  /**
   *   BIO    
   * 
   * @param fileName      
   * @return
   * @throws IOException
   */
  public static String bioRead(String fileName) throws IOException {
    long startTime = System.currentTimeMillis();
    try {
      FileReader reader = new FileReader(fileName);

      StringBuffer buf = new StringBuffer();
      char[] cbuf = new char[BF_SIZE];
      while (reader.read(cbuf) != -1) {
        buf.append(cbuf);
      }
      reader.close();
      return buf.toString();
    } finally {
      System.out.println("  BIO      :" + (System.currentTimeMillis() - startTime) + "  ");
    }
  }

  /**
   *   NIO    
   * 
   * @param fileName      
   * @return
   * @throws IOException
   */
  public static String nioRead1(String fileName) throws IOException {
    long startTime = System.currentTimeMillis();
    try {
      FileInputStream input = new FileInputStream(fileName);
      FileChannel channel = input.getChannel();

      CharsetDecoder decoder = Charset.defaultCharset().newDecoder();
      StringBuffer buf = new StringBuffer();
      CharBuffer cBuf = CharBuffer.allocate(BF_SIZE);
      ByteBuffer bBuf = ByteBuffer.allocate(BF_SIZE);
      while (channel.read(bBuf) != -1) {
        bBuf.flip();
        decoder.decode(bBuf, cBuf, false); //   ,byte char,          
        bBuf.clear();
        buf.append(cBuf.array(), 0, cBuf.position());
        cBuf.compact(); //   
      }
      input.close();
      return buf.toString();
    } finally {
      System.out.println("  NIO      :" + (System.currentTimeMillis() - startTime) + "  ");
    }
  }

  /**
   *   Files.read    
   * 
   * @param fileName      
   * @return
   * @throws IOException
   */
  public static String nioRead2(String fileName) throws IOException {
    long startTime = System.currentTimeMillis();
    try {
      byte[] byt = Files.readAllBytes(Paths.get(fileName));
      return new String(byt);
    } finally {
      System.out.println("  Files.read      :" + (System.currentTimeMillis() - startTime) + "  ");
    }
  }

  public static void main(String[] args) throws IOException {
    String fileName = "E:/source.txt";
    FileRead.bioRead(fileName);
    FileRead.nioRead1(fileName);
    FileRead.nioRead2(fileName);
  }
}
2.서류 작성

package com.zhi.test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Files;
import java.nio.file.StandardOpenOption;

/**
 *    <br>
 * 10M   ,BIO  45  ,NIO  42  ,Files.write  24  
 * 
 * @author    
 * @since 2020 5 9 21:04:40
 *
 */
public class FileWrite {
  /**
   *   BIO     
   * 
   * @param fileName     
   * @param content     
   * @throws IOException
   */
  public static void bioWrite(String fileName, String content) throws IOException {
    long startTime = System.currentTimeMillis();
    try {
      FileWriter writer = new FileWriter(fileName);
      writer.write(content);
      writer.close();
    } finally {
      System.out.println("  BIO     :" + (System.currentTimeMillis() - startTime) + "  ");
    }
  }

  /**
   *   NIO     
   * 
   * @param fileName     
   * @param content     
   * @throws IOException
   */
  public static void nioWrite1(String fileName, String content) throws IOException {
    long startTime = System.currentTimeMillis();
    try {
      FileOutputStream out = new FileOutputStream(fileName);
      FileChannel channel = out.getChannel();
      ByteBuffer buf = ByteBuffer.wrap(content.getBytes());
      channel.write(buf);
      out.close();
    } finally {
      System.out.println("  NIO     :" + (System.currentTimeMillis() - startTime) + "  ");
    }
  }

  /**
   *   Files.write     
   * 
   * @param fileName     
   * @param content     
   * @throws IOException
   */
  public static void nioWrite2(String fileName, String content) throws IOException {
    long startTime = System.currentTimeMillis();
    try {
      File file = new File(fileName);
      if (!file.exists()) {
        file.createNewFile();
      }
      Files.write(file.toPath(), content.getBytes(), StandardOpenOption.WRITE);
    } finally {
      System.out.println("  Files.write     :" + (System.currentTimeMillis() - startTime) + "  ");
    }
  }

  public static void main(String[] args) throws IOException {
    String content = FileRead.nioRead2("E:/source.txt");
    String target1 = "E:/target1.txt", target2 = "E:/target2.txt", target3 = "E:/target3.txt";
    FileWrite.bioWrite(target1, content);
    FileWrite.nioWrite1(target2, content);
    FileWrite.nioWrite2(target3, content);
  }
}
3.파일 복사

package com.zhi.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.nio.file.Files;
import java.nio.file.Paths;

/**
 *     <br>
 * 10M   ,bio  56  ,nio  12  ,Files.copy  10  
 * 
 * @author    
 * @since 2020 5 9 17:18:01
 *
 */
public class FileCopy {
  /**
   *   BIO      
   * 
   * @param target    
   * @param source     
   * 
   * @throws IOException
   */
  public static void bioCopy(String source, String target) throws IOException {
    long startTime = System.currentTimeMillis();
    try {
      FileInputStream fin = new FileInputStream(source);
      FileOutputStream fout = new FileOutputStream(target);

      byte[] byt = new byte[1024];
      while (fin.read(byt) > -1) {
        fout.write(byt);
      }

      fin.close();
      fout.close();
    } finally {
      System.out.println("  BIO      :" + (System.currentTimeMillis() - startTime) + "  ");
    }
  }

  /**
   *   NIO      
   * 
   * @param target    
   * @param source     
   * 
   * @throws IOException
   */
  public static void nioCopy1(String source, String target) throws IOException {
    long startTime = System.currentTimeMillis();
    try {
      FileInputStream fin = new FileInputStream(source);
      FileChannel inChannel = fin.getChannel();
      FileOutputStream fout = new FileOutputStream(target);
      FileChannel outChannel = fout.getChannel();

      inChannel.transferTo(0, inChannel.size(), outChannel);

      fin.close();
      fout.close();
    } finally {
      System.out.println("  NIO      :" + (System.currentTimeMillis() - startTime) + "  ");
    }
  }

  /**
   *   Files.copy      
   * 
   * @param target    
   * @param source     
   * 
   * @throws IOException
   */
  public static void nioCopy2(String source, String target) throws IOException {
    long startTime = System.currentTimeMillis();
    try {
      File file = new File(target);
      if (file.exists()) {
        file.delete();
      }
      Files.copy(Paths.get(source), file.toPath());
    } finally {
      System.out.println("  Files.copy      :" + (System.currentTimeMillis() - startTime) + "  ");
    }
  }

  public static void main(String[] args) throws IOException {
    String source = "E:/source.txt";
    String target1 = "E:/target1.txt", target2 = "E:/target2.txt", target3 = "E:/target3.txt";
    FileCopy.bioCopy(source, target1);
    FileCopy.nioCopy1(source, target2);
    FileCopy.nioCopy2(source, target3);
  }
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기