java 새 IO
24746 단어 자바
자바 의 InputStream,OutputStream,Reader,Writer 와 같은 흐름 을 위 한 입 출력 시스템 은 전통 적 인 IO 로 여 겨 진다.전통 적 인 IO 는 차단 식 입 출력 이 고 바이트 의 이동 을 통 해 처리 된다.즉,전통 적 인 IO 는 한 번 에 한 바이트 만 처리 할 수 있 고 효율 이 높 지 않다.
뉴 IO
새 IO 는 전통 적 인 IO 와 같은 목적 을 가지 고 있 으 며 모두 입 출력 기능 을 하 는 데 사용 된다.그러나 새 IO 는 메모리 맵 파일 방식 으로 입 출력 을 처리 합 니 다.새 IO 는 파일 이나 파일 의 한 부분 을 메모리 에 표시 합 니 다.그러면 메모리 에 접근 하 는 것 처럼 파일 에 접근 할 수 있 습 니 다.이런 방식 은 전통 적 인 IO 보다 훨씬 빠 릅 니 다.
자바 의 새로운 IO 관련 패 키 지 는 다음 과 같 습 니 다.
4.567917.capacity:표지 Buffer 의 최대 용량 은 최대 몇 개의 데 이 터 를 저장 할 수 있 습 니까?capacity 는 마이너스 일 수 없습니다.생 성 후에 도 변경 할 수 없습니다.(이 점 은 배열 과 유사 하 다)
4.567917.그 밖 에 선택 할 수 있 는 태그 가 있 습 니 다.mark 는 position 를 mark 에 직접 찾 을 수 있 습 니 다.mark,position,limit,capacity 는 다음 과 같은 관 계 를 만족 시 킵 니 다:mark<=position<=limit<=capacity.Buffer 의 주요 역할 은 데 이 터 를 불 러 오고 데 이 터 를 출력 하 는 것 입 니 다.기록 한 후에 데 이 터 를 읽 을 때 position 와 limit 이 변화 합 니 다
4.567917.그러면 Buffer 에서 데 이 터 를 읽 을 수 있 고 데 이 터 를 읽 을 때마다 position 는 뒤로 이동 합 니 다
4.567917.절대:색인 에 따라 Buffer 에 데 이 터 를 직접 읽 고 쓰기 때문에 position 의 위 치 를 바 꾸 지 않 습 니 다.다음은 Buffer 의 테스트 클래스 입 니 다.Buffer 대상 이 데 이 터 를 만 들 고 읽 는 과정 에서 position,limit,capacity 의 변 화 를 검증 하 는 데 사 용 됩 니 다.
package com.zhyea.newio;
import java.nio.CharBuffer;
/**
* java IOBuffer
* @author robin
*
*/
public class BufferTest {
public static void main(String[] args) {
CharBuffer buff = CharBuffer.allocate(16);
System.out.println(" :"
+ " capacity:" + buff.capacity()
+ " position:"+buff.position()
+ " limit:"+buff.limit());
buff.put('a').put('b').put('c').put(new char[]{'d', 'e', 'f'});
System.out.println(" 6 :"
+ " capacity:" + buff.capacity()
+ " position:"+buff.position()
+ " limit:"+buff.limit());
buff.flip();
System.out.println(" flip :"
+ " capacity:" + buff.capacity()
+ " position:"+buff.position()
+ " limit:"+buff.limit());
buff.get();
System.out.println(" :"
+ " capacity:" + buff.capacity()
+ " position:"+buff.position()
+ " limit:"+buff.limit());
buff.clear();
System.out.println(" clear :"
+ " capacity:" + buff.capacity()
+ " position:"+buff.position()
+ " limit:"+buff.limit());
buff.get(3);
System.out.println(" :"
+ " capacity:" + buff.capacity()
+ " position:"+buff.position()
+ " limit:"+buff.limit());
}
}
allocate 방법 으로 만 든 Buffer 는 일반 Buffer 이지 만 ByteBuffer 는 allocate Direct 방법(ByteBuffer 만 제공)을 제공 하여 직접 Buffer 를 만 들 었 습 니 다.직접 Buffer 를 만 드 는 비용 이 비교적 높 지만 운영 할 때 환경 이 이 Buffer 에서 비교적 빠 른 본 기계 IO 작업 을 할 수 있 습 니 다.창설 원가 가 비교적 높 기 때문에 직접 버 퍼 는 긴 생존 기간 의 버 퍼 에 더욱 적합 하 며,짧 은 생존 기간 에 사용 하기 만 하면 버 리 는 버 퍼 에 적용 되 지 않 는 다.직접 버 퍼 는 일반 버 퍼 와 다 르 지 않다.채널 의 사용 채널 은 전통 적 인 흐름 대상 과 유사 하지만 이에 비해 채널 은 두 가지 주요 한 차이 가 있다
package com.zhyea.newio;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.CharBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileChannel.MapMode;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
/**
* Channel 。 Channel A B
*
* @author robin
*
*/
public class FileChannelTest {
public static void main(String[] args) {
FileChannel in = null;
FileChannel out = null;
try {
String fileAPath = "D:\\a.txt";
String fileBPath = "D:\\b.txt";
File file = new File(fileAPath);
in = new FileInputStream(file).getChannel();
MappedByteBuffer buffer = in.map(MapMode.READ_ONLY, 0, file.length());
out = new FileOutputStream(fileBPath).getChannel();
out.write(buffer);
buffer.clear();
Charset charset = Charset.forName("GBK");
CharsetDecoder decoder = charset.newDecoder();
CharBuffer charBuffer = decoder.decode(buffer);
System.out.println(charBuffer);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != in)
in.close();
if (null != out)
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
RandomAccessFile 은 채널 인 스 턴 스 에 대응 하여 클래스 텍스트 파일 의 추가 구현:
package com.zhyea.newio;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileChannel.MapMode;
public class RandomFileChannelTest {
public static void main(String[] args) {
FileChannel randomChannel = null;
try {
String fileBPath = "D:\\b.txt";
File file = new File(fileBPath);
randomChannel = new RandomAccessFile(file, "rw").getChannel();
ByteBuffer buffer = randomChannel.map(MapMode.READ_ONLY, 0, file.length());
randomChannel.position(file.length());
randomChannel.write(buffer);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != randomChannel)
randomChannel.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
채널 테스트,버퍼 읽 기 데이터 구현:
package com.zhyea.newio;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
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;
public class ChannelTest {
public static void main(String[] args) {
FileChannel in = null;
FileChannel out = null;
try {
String fileAPath = "D:\\a.txt";
String fileBPath = "D:\\b.txt";
File file = new File(fileAPath);
in = new FileInputStream(file).getChannel();
out = new FileOutputStream(fileBPath).getChannel();
ByteBuffer buffer = ByteBuffer.allocate(16);
while(in.read(buffer) != -1){
buffer.flip();
Charset charset = Charset.forName("GBK");
CharsetDecoder decoder = charset.newDecoder();
CharBuffer charBuffer = decoder.decode(buffer);
System.out.println(charBuffer);
buffer.position(0);
out.write(buffer);
buffer.clear();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != in)
in.close();
if (null != out)
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Charset 에서 컴퓨터 기록 파일 을 사용 하 는 것 은 모두 기 록 된 바이트 시퀀스 입 니 다.기 록 된 바이트 시퀀스 를 정확하게 보 여주 고 사용 하려 면 적당 한 문자 집합 을 사용 하여 디 코딩 해 야 합 니 다.자바 의 인 코딩 은 유 니 코드 문자 집합 을 사용 합 니 다.읽 은 파일 인 코딩 형식 이 유 니 코드 가 아니면 오류 가 발생 합 니 다.자바 는 바이트 시퀀스 와 문자열 간 의 변환 관 계 를 처리 하기 위해 Charset 를 제공 합 니 다.Charset 는 인 코딩 과 디 코딩 방법 을 제공 하고 Charset 가 지원 하 는 문자 집합 을 가 져 오 는 방법 도 제공 합 니 다.Charset 클래스 는 가 변 적 이지 않 습 니 다.Charset 는 현재 JDK 가 지원 하 는 모든 문자 집합 을 가 져 오 는 availableCharset()정적 방법 을 제공 합 니 다.데모 코드 는 다음 과 같 습 니 다.
package com.zhyea.newio;
import java.nio.charset.Charset;
import java.util.Map;
public class CharsetTest {
public static void main(String[] args){
listCharset();
}
public static void listCharset(){
Map<String, Charset> map = Charset.availableCharsets();
for(String tmp : map.keySet()){
System.out.println(tmp + " ----------> " + map.get(tmp));
}
}
}
출력 결과 가 매우 많아 서 내 기계 에서 시험 해 보 았 는데 모두 169 줄 이 었 다.흥미 가 있 으 면 한번 해 볼 만하 지만,여 기 는 열거 하지 않 겠 다.문자 집합 이름 을 알 게 되면 Charset 의 forName()방법 으로 Charset 대상 을 만 들 수 있 습 니 다.코드 는 다음 과 같 습 니 다.
Charset charset = Charset.forName("UTF-8");
Charset 대상 을 얻 으 면 Charset 대상 의 new Decoder()와 new Encoder()방법 으로 각각 CharsetEncoder 와 CharsetDecoder 대상 을 만 들 수 있 습 니 다.이 두 가 지 는 각각 Charset 의 인 코더 와 디코더 이다.그들 을 사용 하면 바이트 시퀀스 와 문자열 의 상호 변환 을 실현 할 수 있다.디 코딩 작업 만 완료 하기 위해 서 라면 Charset 대상 의 encode()와 decode()방법 을 직접 사용 할 수 있 습 니 다.평소에 검사 문자열 인 코딩 과 같은 요 구 를 만 날 수 있 습 니 다.이것 은 Charset 를 사용 하여 테스트 클래스 를 실현 하 는 것 을 고려 할 수 있 습 니 다.
package com.zhyea.newio;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
public class CharsetTest {
public static void main(String[] args) {
String str = " ";
System.out.println(checkEncoding(str));
}
public static String checkEncoding(String str) {
String tmp;
for (Encode e : Encode.values()) {
ByteBuffer buffer = ByteBuffer.wrap(str.getBytes());
tmp = Charset.forName(e.getValue()).decode(buffer).toString();
if (str.equals(tmp)) {
return e.getValue();
}
}
return null;
}
enum Encode {
GBK("GBK"), UTF8("UTF-8"), BIG5("BIG5"), ISO88591("ISO-8859-1");
private String value;
Encode(String val) {
this.value = val;
}
public String getValue() {
return this.value;
}
}
}
테스트 클래스 에 문자 집합 인 코딩 을 기록 하기 위해 매 거 진 클래스 를 만 들 었 습 니 다.테스트 에 사용 할 문자열 은 직접 쓴 문자열 로 이 컴퓨터 의 작업 공간 인 코딩 형식 과 같 습 니 다.
선택 기 사용
Selector 는 주로 비 차단 Socket 통신 에 사 용 됩 니 다.이에 맞 춰 선택 가능 채널 을 사용 합 니 다.
Selectable Channel 은 IO 작업 을 막 지 않 는 Channel 대상 을 지원 할 수 있 으 며,register()방법 으로 지정 한 Selector 에 등록 할 수 있 습 니 다.이러한 등록 관 계 는 SelectionKey 인 스 턴 스 로 표 시 됩 니 다.selector 대상 은 select()방법 을 제공 합 니 다.이 방법 은 프로그램 이 여러 개의 IO 채널 을 동시에 감시 할 수 있 도록 합 니 다.
Selectable Channel 대상 은 차단 과 비 차단 두 가지 모드 를 지원 합 니 다(모든 채널 은 기본적으로 차단 모드 입 니 다).SeletableChannel 은 채널 의 모드 상 태 를 설정 하고 되 돌려 주 는 두 가지 방법 을 제공 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.