자바 의 바이트,문자 출력 흐름 과 바이트,문자 입력 흐름 에 대한 간단 한 이해

제 가 먼저 IO 흐름 이 뭔 지 설명해 드릴 게 요.
  • I:InputStream 을 가리 키 는데 이것 은 추상 적 인 클래스 이 고 가장 자주 사용 하 는 하위 클래스 는 FileInputStream
  • 이다.
  • O:OutputStream 일 만 한 가치 가 있 습 니 다.이것 도 추상 적 인 유형 입 니 다.가장 자주 사용 하 는 자 류 는 OutputStream
  • 입 니 다.
  • 흐름:파일 작업 을 할 때 대부분 byte 데 이 터 를 사용 하기 때문에 이 데 이 터 는 한꺼번에 기록(읽 기)하 는 것 이 아니 라 수도꼭지 처럼 천천히 흐 르 는 것 입 니 다(물 을 받 는 장면 을 상상 해 보 세 요)
  • 쓸데없는 말 이 많 지 않 습 니 다.먼저 간단 한 코드 를 주세요.
    
    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:읽 으 면서 쓰 는 방식 으로 조금씩 파일 을 복사 합 니 다.
    총결산
    이 글 은 여기까지 입 니 다.당신 에 게 도움 을 줄 수 있 기 를 바 랍 니 다.또한 당신 이 우리 의 더 많은 내용 에 관심 을 가 져 주 실 수 있 기 를 바 랍 니 다!

    좋은 웹페이지 즐겨찾기