자바 IO 흐름 조작

7263 단어 자바
IO 흐름 이란 무엇 입 니까?
자바 에서 I/O 작업 은 주로 자바.io 패키지 의 내용 을 사용 하여 입 출력 작업 을 하 는 것 을 말한다.입력 도 읽 기 데이터 라 고 하고 출력 도 쓰기 데이터 라 고 합 니 다.
입 출력(IO):입 출력 은 컴퓨터 와 그 어떠한 외부 장치 간 의 데이터 전달 을 말한다.
IO 흐름 에서 입 출력 은 4 단계 로 나 뉜 다.포맷/해석,버퍼,인 코딩 변환 과 전달 이다.포맷/해석:내부 데이터 표시(바이트 단위)와 외부 데이터 표시(문자 단위)사이 에서 양 방향 변환 을 합 니 다.예 를 들 어 2 바이트 의 정수 10002 는 5 글자 로 표시 해 야 한다.
버퍼:형식/해석 및 전달 사이 에 캐 시 문자 시퀀스 를 사용 합 니 다.출력 에 대해 비교적 짧 은 문자 시퀀스 를 포맷 한 후 바로 출력 하지 않 고 버퍼 에 저장 하여 일정 규모 로 누적 한 후에 외부 장치 로 전달 합 니 다.반면 외부 장치 에서 읽 은 대량의 데이터 도 버퍼 에 두 고 입력 을 점차적으로 꺼 냈 다.기본적으로 IO 스 트림 의 입 출력 은 버퍼 를 거 쳐 IO 스 트림 을 버퍼 없 이 작업 할 수 있 습 니 다.
인 코딩 변환:하나의 문자 표현 식 을 다른 문자 표현 식 으로 변환 합 니 다.포맷 된 문자 표현 식 이 외부 문자 표현 식 과 다 르 거나 외부 표현 식 이 IO 흐름 과 해석 할 수 있 는 표현 식 과 다 르 면 인 코딩 변환 을 해 야 합 니 다.다 중 바이트 인 코딩 과 넓 은 문자 인 코딩 간 의 변환 등.대부분의 경우 인 코딩 변환 이 필요 하지 않 습 니 다.
전달:주로 외부 장치 와 통신 합 니 다.출력 할 때 전달 은 포맷,버퍼,인 코딩 변환 을 거 친 문자 시퀀스 를 외부 장치 로 보 냅 니 다.입력 할 때 외부 장 치 를 데 이 터 를 추출 하여 그 후의 인 코딩 변환,버퍼 및 해석 에 문자 순 서 를 제공 합 니 다.
IO 흐름 의 분류:
데이터 의 흐름 에 따라 다음 과 같이 나 뉜 다.
  • 입력 흐름:데 이 터 를 다른 장치 에서 메모리 의 흐름 으로 읽 고 읽 기 동작 만 할 수 있 습 니 다.
  • 출력 흐름:데 이 터 를 메모리 에서 다른 장치 의 흐름 으로 기록 하고 쓰기 만 할 수 있 습 니 다.

  • 데이터 의 유형 에 따라 다음 과 같이 나 뉜 다.
  • 바이트 흐름:바이트 단위 로 데 이 터 를 읽 고 쓰 는 흐름.
  • 문자 흐름:문자 단위 로 데 이 터 를 읽 고 쓰 는 흐름.

  • 바이트 흐름 과 문자 흐름 의 차이 점:
  • 읽 기와 쓰기 단 위 는 다르다.바이트 흐름 은 바이트 단위 이 고 문자 흐름 은 문자 단위
  • 처리 대상 이 다 릅 니 다.바이트 흐름 은 모든 유형의 데이터(예 를 들 어 그림,avi 등)를 처리 할 수 있 고 문자 흐름 은 문자 형식의 데이터 만 처리 할 수 있 습 니 다.
  • 바이트 흐름:한 번 에 읽 거나 읽 는 것 은 8 비트 바 이 너 리 입 니 다.
  • 문자 흐름:한 번 에 읽 거나 읽 는 것 은 16 비트 바 이 너 리 입 니 다.

  • 분류 후 대응 하 는 초 류.
    입력 흐름
    출력 흐름
    바이트 흐름
    바이트 입력 흐름 InputStream
    바이트 출력 스 트림
    문자 흐름
    문자 입력 스 트림 리더
    문자 출력 스 트림 라이터
    주:이 네 가지 유형의 하위 클래스 이름 은 기본적으로 부모 류 명작 을 하위 클래스 이름 으로 하 는 접미사 입 니 다.
    바이트 입력 흐름 InputStream:
  • InputStream는 모든 바이트 입력 흐름 의 부류 로 추상 적 인 부류 이다.
  • ByteArrayInputStream,StringBufferInputStream,FileInputStream는 세 가지 기본 적 인 미디어 흐름 으로 각각Byte ,StringBuffer, 에서 데 이 터 를 읽 습 니 다.
  • PipedInputStream는 다른 스 레 드 와 함께 사용 하 는 파이프 에서 데 이 터 를 읽 습 니 다.
  • ObjectInputStream와 모든FilterInputStream의 자 류 는 장식 흐름(장식 기 모델 의 주인공)이다.
  • FileInputStream fis = new FileInputStream("xxx.txt");//         
    int b;
    while((b = fis.read()) != -1) { //       fis            b    b   -1
        System.out.println(b);  
    }
    fis.close();

    바이트 출력 흐름 출력 스 트림:
  • OutputStream는 모든 바이트 출력 흐름 의 부류 로 추상 류 이다.
  • ByteArrayOutputStream,FileOutputStream는 두 가지 기본 적 인 미디어 흐름 으로 각각Byte , 에 데 이 터 를 기록 합 니 다.
  • PipedOutputStream은 다른 스 레 드 와 함께 사용 하 는 파이프 에 데 이 터 를 기록 합 니 다.
  • ObjectOutputStream와 모든FilterOutputStream의 자 류 는 장식 흐름 이다.
  • FileOutputStream fos = new FileOutputStream("yyy.txt"); 
    fos.write(100);     //      int ,            ,        8 
    fos.write(99);      //    yyy.txt   dc
    fos.close();

    주의:
    1)출력 스 트림 출력 데 이 터 는 출력 스 트림 대상 을 만 들 때 파일 이 존재 하지 않 으 면 만 듭 니 다.존재 하면 이 파일 의 데 이 터 를 비우 고 데 이 터 를 기록 합 니 다.2)파일 에 추가 로 쓰 려 면 new FileOutputStream(String pathName,true)이라는 구조 방법 을 사용 합 니 다.
    문자 입력 흐름:
    public int read():단일 문 자 를 읽 고 int 로 되 돌려 줍 니 다.스 트림 의 끝 에 도착 하면-1public int read(char[]cbuf)로 돌아 갑 니 다.문 자 를 배열 에 읽 고 읽 은 문자 수 를 되 돌려 줍 니 다.스 트림 의 끝 에 도착 하면-1 로 돌아 갑 니 다.
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("xxx.txt");  //         
        int c;
        
        while((c = fr.read()) != -1) {  //                 
            System.out.print((char)c);  // c       char
        }
        fr.close();
    }

    문자 출력 흐름:
    public void write(int c):단일 문 자 를 기록 합 니 다.public void write(char[]cbuf):문자 배열 을 기록 합 니 다.public abstract void write(char[]cbuf,int off,int len):문자 배열 의 일부분 을 기록 합 니 다.cbuf-문자 배열,off-문자 의 오프셋 을 쓰기 시작 합 니 다.len-쓸 문자 수 입 니 다.public void write(String str):문자열 을 기록 합 니 다.public void write(String str,int off,int len):문자열 의 일부분 을 기록 합 니 다.str-문자열,off-초기 쓰기 문자 의 오프셋 에 비해 len-쓸 문자 수 입 니 다.
    노드 흐름:데이터 원본 과 직접 연결 되 어 읽 거나 읽 습 니 다.
    자주 사용 하 는 노드 흐름:
  • 부류:InputStream,OutputStream,Reader,Writer
  • 문서:FileInputStream,FileOutputStrean,FileReader,FileWriter파일 을 처리 하 는 노드 흐름
  • 배열:ByteArrayInputStream,ByteArrayOutputStream,CharArrayReader,CharArrayWriter배열 을 처리 하 는 노드 흐름(대응 하 는 것 은 파일 이 아니 라 메모리 의 한 배열)
  • 문자열:StringReader,StringWriter문자열 을 처리 하 는 노드 흐름
  • 파이프:PipedInputStream,PipedOutputStream,PipedReader,PipedWriter파 이 프 를 처리 하 는 노드 흐름
  • 처리 흐름:처리 흐름 과 노드 흐름 을 함께 사용 하고 노드 흐름 을 바탕 으로 한 층 더 연결 하 며 노드 흐름 에 연결 하 는 것 이 바로 처리 흐름 이다.
    상용 처리 흐름:
  • 버퍼 흐름:BufferedInputStrean,BufferedOutputStream,BufferedReader,BufferedWriter버퍼 기능 을 추가 하여 하 드 디스크 를 자주 읽 지 않도록 합 니 다.
  • 전환 흐름:InputStreamReader,OutputStreamReader바이트 흐름 과 문자 흐름 간 의 전환 을 실현 합 니 다.
  • 데이터 흐름:DataInputStream,DataOutputStream등-기본 데이터 형식 을 파일 에 기록 하거나 읽 을 수 있 습 니 다.

  • 전환 흐름:InputStreamReader,OutputStreamWriterInputStream또는OutputStream을 매개 변수 로 하여 바이트 에서 문자 흐름 으로 전환 해 야 합 니 다.
    시퀀스 흐름:시퀀스 흐름 은 여러 바이트 의 입력 흐름 을 하나 로 합성 할 수 있 습 니 다.시퀀스 흐름 에서 데 이 터 를 읽 을 때 통 합 된 첫 번 째 흐름 부터 읽 고 하 나 를 읽 은 후에 두 번 째 것 을 계속 읽 습 니 다.
    1)두 개의 입력 흐름 SequenceInputStream(InputStream s1,InputStream s2)을 통합 합 니 다.
    public static void demo2() throws FileNotFoundException, IOException {
        FileInputStream fis1 = new FileInputStream("a.mp3");
        FileInputStream fis2 = new FileInputStream("b.mp3");
        SequenceInputStream sis = new SequenceInputStream(fis1, fis2);
        FileOutputStream fos = new FileOutputStream("c.mp3");
        //    ,c.mp3   a.mp3 b.mp3   
    
        int b;
        while((b = sis.read()) != -1) {
            fos.write(b);
        }
    
        sis.close();        //sis      ,                 
        fos.close();
    }

    2)여러 입력 스 트림 통합 SequenceInputStream(Enumeration extends InputStream>e)
    public static void main(String[] args) throws IOException {
    
        FileInputStream fis1 = new FileInputStream("a.txt");
        FileInputStream fis2 = new FileInputStream("b.txt");
        FileInputStream fis3 = new FileInputStream("c.txt");
    
        Vector v = new Vector<>();     //      
        v.add(fis1);                        //        
        v.add(fis2);
        v.add(fis3);
    
        Enumeration en = v.elements();
        SequenceInputStream sis = new SequenceInputStream(en);  //             
        FileOutputStream fos = new FileOutputStream("d.txt");
    
        int b;
        while((b = sis.read()) != -1) {
            fos.write(b);
        }
    
        sis.close();
        fos.close();
    }

    좋은 웹페이지 즐겨찾기