자 바 는 BIO 와 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);
}
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.