자바 의 바이트,문자 출력 흐름 과 바이트,문자 입력 흐름 에 대한 간단 한 이해
11223 단어 Java문자입력 스 트림 바이트문자 출력 흐름
File file=new File("e:"+File.separator+"JavaLearn"+File.separator+"EleventhDemo"+File.separator+"1.txt");
if (!file.getParentFile().exists()){
file.getParentFile().mkdirs();
System.out.println(" ");
}
if (!file.exists()){
file.createNewFile();
}
그 중에서File.separator
은 현재 시스템 의 기본 구분자 입 니 다.이렇게 쓴 이 유 는 자바 파일 이 Windows 시스템 이 실 행 될 때 와 Linux 시스템 이 실 행 될 때 오류 가 발생 하지 않도록 보장 하기 때 문 입 니 다.이 코드 도 매우 간단 하 다.주로 파일 을 만 드 는 것 이다.
물론 이것 은 중요 한 것 이 아니 라 아래 에 중점 을 두 고 있다.
바이트 출력 스 트림
Output Stream 류 에 있어 서 그 자체 가 추상 적 인 클래스 로 정의 되 었 습 니 다.추상 적 인 클래스 의 원칙 에 따라 추상 적 인 클래스 의 하위 클래스 를 정의 해 야 합 니 다.그리고 우리 가 실행 하고 자 하 는 것 은 파일 작업 이 고 FileOutput Stream 하위 클래스 를 사용 하여 완성 할 수 있 습 니 다.우리 가 가장 관심 을 가 지 는 것 은 역시 자 류 중의 구조 방법 이다.
방법.
묘사 하 다.
public FileOutputStream(File file) throws FileNotFoundException
파일 출력 스 트림 을 예화 합 니 다.주로 새 데이터 에 사 용 됩 니 다.
public FileOutputStream(File file,boolean append) throws FileNotFoundException
파일 출력 스 트림 을 예화 합 니 다.주로 데 이 터 를 추가 하 는 데 사 용 됩 니 다.
우 리 는 OutputStream 대상 을 예화 한 후에 반드시 출력 작업 을 해 야 한다.Output Stream 클래스 에서 3 개의 출력 방법 을 정 의 했 습 니 다.예 를 들 면:
방법.
묘사 하 다.
public abstract void write(int b) throws IOException
단일 바이트 데이터 출력
public void write(byte[] b) throws IOException
바이트 데이터 출력
public abstract void write(byte[] b,int off,int len) throws IOException
출력 부분 바이트 데이터
시 계 를 볼 때 이미 발 견 했 는 지 모두 byte 형식의 데이터 입 니 다.
출력 스 트림 을 사용 하여 파일 에 데 이 터 를 출력 합 니 다.
import java.io.*;
public class test {
public static void main(String[] args) throws Exception{
File file=new File("e:"+File.separator+"JavaLearn"+File.separator+"EleventhDemo"+File.separator+"1.txt");
if (!file.getParentFile().exists()){
file.getParentFile().mkdirs();
System.out.println(" ");
}
if (!file.exists()){
file.createNewFile();
}
OutputStream output=new FileOutputStream(file);//
String data="Hello World!";
output.write(data.getBytes());
output.close();
}
}
파일 을 출력 하 는 과정 에서 출력 할 파일 과 디 렉 터 리 가 존재 하지 않 으 면 원래 의 내용 을 덮어 쓰 는 것 을 발견 할 수 있 습 니 다.어떻게 해 야 합 니까?우리 가 데 이 터 를 추가 하기 위 한 구조 방법 이 있다 는 것 을 잊 지 마 세 요.
import java.io.*;
public class test {
public static void main(String[] args) throws Exception{
File file=new File("e:"+File.separator+"JavaLearn"+File.separator+"EleventhDemo"+File.separator+"1.txt");
if (!file.getParentFile().exists()){
file.getParentFile().mkdirs();
System.out.println(" ");
}
if (!file.exists()){
file.createNewFile();
}
OutputStream output=new FileOutputStream(file,true);//
String data="Hello World!";
output.write(data.getBytes());
output.close();
}
}
한 번 실행 하면 기 존 데이터 뒤에 자동 으로 데 이 터 를 추가 합 니 다.우 리 는 또 다른 유사 한 흐름 을 보 러 왔 다.
문자 출력 흐름
제목 을 보면 바이트 와 문자 가 한 글자 차이 가 나 지만 자바 데이터 의 기본 유형 을 잘 아 는 사람 은 모두 알 고 있 습 니 다.이 두 물건 중 하 나 는 byte 이 고 하 나 는 String 이다.그러면 파일 을 출력 할 때 출력 할 내용 을 byte 바이트 가 아 닌 String 형식 으로 정의 할 수 있 습 니 다.
마찬가지 로 Writer 도 추상 적 인 클래스 입 니 다.우리 가 파일 작업 에 사용 할 때 자주 사용 하 는 하위 클래스 는 FileWriter 입 니 다.Writer 류 의 일반적인 방법 을 살 펴 보 자.
방법.
묘사 하 다.
public abstract void close() throws IOException
출력 흐름 닫 기
public void write(String str) throws IOException
문자열 출력
public void write(char[] cbuf) throws IOException
문자 배열 출력
public abstract void flush() throws IOException
강제 메모리 비우 기
아니면 bb 가 많 지 않 습 니 다.코드 를 올 리 면 어떤 모습 인지 알 수 있 습 니 다.
import java.io.*;
public class test {
public static void main(String[] args) throws Exception{
File file=new File("e:"+File.separator+"JavaLearn"+File.separator+"EleventhDemo"+File.separator+"1.txt");
if (!file.getParentFile().exists()){
file.getParentFile().mkdirs();
System.out.println(" ");
}
if (!file.exists()){
file.createNewFile();
}
Writer out=new FileWriter(file);
String data="Hello World!";
out.write(data);
out.close();
}
}
출력 흐름 을 알 고 입력 흐름 을 살 펴 보 자.자바 의 입력 흐름 은 두 가지 가 있 는데 하 나 는 InputStream 이 고 다른 하 나 는 Reader 입 니 다.이 이름 을 보면 알 수 있 듯 이 md 는 또 하나의 간단 하고 어 려 운 것 일 수도 있다.그래,네가 알 아 맞 혔 다.
바이트 입력 흐름 InputStream
마찬가지 로 이 물건 도 추상 적 인 유형 입 니 다.파일 작업 에 사용 되 는 것 도 그의 하위 클래스 인 FileInputStream 입 니 다.물론 파일 작업 에 사용 되 는 몇 가지 방법 도 있 습 니 다.
방법.
묘사 하 다.
public abstract int read() throws IOException
단일 바이트 데 이 터 를 읽 습 니 다.read()방법 을 실행 할 때마다 데이터 원본 의 지정 한 데 이 터 를 읽 습 니 다.끝 에 읽 었 다 면-1 로 되 돌아 갑 니 다.
public int read(byte[] b) throws IOException
여러 바이트 데 이 터 를 읽 습 니 다.바이트 보다 작은 데 이 터 를 읽 으 려 면 이 때 read()방법의 반환 값 int 는 데이터 갯 수 를 되 돌려 줍 니 다.현재 열 린 바이트 배열 이 읽 는 길이 보다 작 으 면 데 이 터 를 읽 었 습 니 다.이때 돌아 온 것 은-1.
public int read(byte[] int off,int len) throws IOException
지정 한 여러 바이트 데이터 읽 기
우 리 는 내용 을 읽 고 구체 적 인 코드 가 어떻게 그것 을 실현 하 는 지 보 자.
import java.io.*;
public class test {
public static void main(String[] args) throws Exception{
File file=new File("e:"+File.separator+"JavaLearn"+File.separator+"EleventhDemo"+File.separator+"1.txt");
if (!file.getParentFile().exists()){
file.getParentFile().mkdirs();
System.out.println(" ");
}
if(file.exists()){
InputStream input=new FileInputStream(file);
byte data[] = new byte[1024];// 1024 byte
int len=input,read(data);
input.close();
System.out.println(" :"+new String(data,0,lem));
}
}
}
상기 코드 는 파일 의 모든 내용 을 읽 는 논 리 를 간단명료 하 게 표현 하 였 으 나,하나의 읽 기 는 어떻게 하 는 지 상상 해 보 세 요.이 럴 때 는 예전 의 지식 이 필요 합 니 다.코드 를 보 세 요.
import java.io.*;
public class test {
public static void main(String[] args) throws Exception{
File file=new File("e:"+File.separator+"JavaLearn"+File.separator+"EleventhDemo"+File.separator+"1.txt");
if (!file.getParentFile().exists()){
file.getParentFile().mkdirs();
System.out.println(" ");
}
if(file.exists()){
InputStream input=new FileInputStream(file);
byte data[] = new data[1024];
int foot=0;//
int temp=0;//
while((temp=input.read())!=-1){
data[foot++]=(byte) temp;
input.close();
System.out.println(" :"+new String(data,0,foot));
}
}
}
}
바이트 입력 흐름 을 알 았 으 니 문자 입력 흐름 도 알 아야 하지 않 겠 습 니까?자,멍하니 있 지도 말고 코드 를 찍 어 라.문자 입력 스 트림 리더
그런 추상 적 이 고 자 류 는 말 하지 않 겠 다.어차피 비슷 하 니까 천천히 생각해 보 자.
어떤 방법 이 있 는 지 보 자.
방법.
묘사 하 다.
public abstract void close() throws IOException
폐쇄 흐름
public int read() throws IOException
단일 문자 읽 기
public int read(char[] cbuf) throws IOException
문자 배열 에 내용 을 읽 고 읽 은 길 이 를 되 돌려 줍 니 다.
한 가 지 는 위의 것 과 다르다.
Writer 클래스 에 서 는 문자열 데 이 터 를 출력 하 는 방법 을 제공 하지만 Reader 클래스 에 서 는 이러한 정의 가 없습니다.이 럴 수 있 는 이 유 는 전적으로 OutputStream 을 사용 하여 데 이 터 를 출력 할 때 프로그램 이 출력 할 수 있 는 크기 는 프로그램 이 감당 할 수 있 는 데이터 크기 이기 때 문 입 니 다.InputStream 을 사용 하여 읽 을 때 읽 을 수 있 는 데이터 가 회색 이 많 고 한꺼번에 모두 읽 으 면 문제 가 될 수 있 기 때문에 한 개 만 읽 을 수 있 습 니 다.
import java.io.*;
public class test {
public static void main(String[] args) throws Exception{
File file=new File("e:"+File.separator+"JavaLearn"+File.separator+"EleventhDemo"+File.separator+"1.txt");
if (!file.getParentFile().exists()){
file.getParentFile().mkdirs();
System.out.println(" ");
}
Reader in=new FileReader(file);
char data[] = new char[1024];
int len=in.read(data);
in.close();
System.out.println(" :"+new String(data,0,len));
}
}
코드 를 이렇게 많이 썼 으 니 우 리 는 마지막 으로 문 제 를 하나 더 보 자.바이트 흐름 과 문자 흐름 의 차이
이상 의 코드 를 통 해 알 수 있 듯 이 바이트 흐름 과 문자 흐름 은 모두 비슷 한 기능 을 가지 고 있 습 니 다.그러면 개발 과정 에서 어떤 것 을 구체 적 으로 사용 하 시 겠 습 니까?
그들의 차 이 는:
바이트 흐름 은 IO 작업 을 할 때 직접 대상 으로 하 는 데이터 터미널(예 를 들 어 파일)입 니 다.문자 흐름 작업 은 터미널 이 아니 라 캐 시 영역(메모리 로 이해)에 대한 작업 입 니 다.그 다음 에 캐 시 영역 에서 터미널(예 를 들 어 파일)을 조작 합 니 다.이것 은 간접 적 인 작업 에 속 합 니 다.이런 방식 으로바이트 흐름 을 사용 할 때 마지막 출력 동작 을 닫 지 않 으 면 모든 내용 을 출력 할 수 있 습 니 다.문자 흐름 을 사용 할 때 닫 지 않 으 면 버퍼 의 내용 이 출력 되 지 않 습 니 다.물론 이 때 는 사용자 가 직접 flush()방법 을 사용 하여 강제 적 으로 수 동 으로 비 울 수 있 습 니 다.예 를 들 어:
import java.io.*;
public class test {
public static void main(String[] args) throws Exception{
File file=new File("e:"+File.separator+"JavaLearn"+File.separator+"EleventhDemo"+File.separator+"1.txt");
if (!file.getParentFile().exists()){
file.getParentFile().mkdirs();
System.out.println(" ");
}
if (!file.exists()){
file.createNewFile();
}
Writer out=new FileWriter(file);
String data="Hello World!";
out.write(data);
out.flush();
}
}
요약 하면 바이트 흐름 과 문자 흐름 의 주요 차이 점:DOS 시스템 의 파일 복사 명령 에 따라 원본 파일 과 파일 을 복사 하 는 경 로 를 초기 화하 고 실행 하 라 는 요구 가 있 습 니 다.
알림:이 프로그램 은 주 방법 에서 직접 완성 되 며 불필요 한 방법 과 유형의 디자인 을 고려 하지 않 습 니 다.큰 파일 의 경우 고려(500 MB 이상)
나 는 생각 도 모두 에 게 붙 였 다.
프로젝트 1:복사 할 파일 을 모두 메모리 에 읽 은 다음 모든 내용 을 대상 파일 에 한꺼번에 출력 합 니 다.
방안 2:읽 으 면서 쓰 는 방식 으로 조금씩 파일 을 복사 합 니 다.
총결산
이 글 은 여기까지 입 니 다.당신 에 게 도움 을 줄 수 있 기 를 바 랍 니 다.또한 당신 이 우리 의 더 많은 내용 에 관심 을 가 져 주 실 수 있 기 를 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.