ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 보조 스트림
    JAVA 2023. 3. 17. 16:21

    • 어플리케이션에서 데이터 입출력을 좀 더 편리하게 하기 위해서 사용
      - 어플리케이션에서 처리하는 데이터의 형식과 실제로 입출력하는 데이터의 형식이 다른 경우
    • 데이터의 입출력 성능을 향상시키기 위해 사용
    • 보조 스트림은 단독으로 사용할 수 없다.
      - 주 스트림에 결합하여 사용
    • 보조 스트림에도 다른 보조 스트림을 연결할 수 있다.(스트림 체인)

     

    보조스트림 변수 = new 보조스트림(일출력스트림);

     

    //파일로부터 직접 InputStream 얻기
    InputStream is = new FileInputStream("...");
     
    //문자 변환 보조 스트림을 InputStrem에 결합
    InputStreamReader reader = new InputStreamReader(is);
     
    //BufferedReader 보조 스트림을 문자 변환 보조스트림에 연결(성능 향상 목적)
    BufferedReader br = new BufferedReader(reader);

     

    자주 사용하는 보조 스트림

    보조 스트림 기능
    InputStreamReader 바이트 스트림을 문자 스트림으로 변환
    BufferedInputStream 입출력 성능 향상
    BufferedOutputStream
    BufferedReader
    BufferedWriter
    DataInputStream 기본 타입 데이터 입출력
    DataOutputStream
    PrintStream 줄바꿈 처리 및 형식화된 문자열 출력
    PrintWriter
    ObjectInputStream 객체 입출력
    ObjectOutputStream

     


    문자 변환 스트림

    • 바이트 데이터를 문자로 변환하는 보조 스트림

     

    InputStream을 Reader로 변환

    InputStream is = new FileInputSTream("C:/Temp/test.txt");
    Reader reader = new InputStreamReader(is);

     

    //저장된 문자를 읽는 메소드
    public static String read() throws IOException {
        InputStream is = new FileInputStream("C:/Temp/test.txt");
        Reader reader = new InputStreamReader(is, "UTF-8");
        
        char[] data = new char[20];
        int num = reader.read(data);
        
        reader.close();
        String str = new String(data, 0, num);
        return str;
    }

     

    //저장된 문자를 읽는 메소드
    public static String read() throws IOException {
        InputStream is = new FileInputStream("C:/Temp/test.txt");
        Reader reader = new InputStreamReader(is, "UTF-8");    //문자 변환 보조 스트림 연결
        BufferedReader br = new BufferedReader(reader);        //문자 읽기 편의성을 위한 보조 스트림 추가 연결
        String str = br.readLine();
        return str;
    }

     

    • FileReader
      - FileReader는 InputStreamReader를 상속받기 때문에 FileInputStream에 InputStreamReader를 연결하지 않고 FileReader를 직접 생성 가능하다.
      - 내부적으로는 FileInputStream에 InputStreamReader를 연결한 것과 동일하게 되어 있다.
      - FileWriter도 비슷한 구조로 되어 있다.

     

     

    OutputStream을 Writer로 변환

    OutputStream os = new FileOutputStream("C:/Temp/test.txt");
    Writer writer = new OutputStreamWriter(os);

     

    //UTF-8 문자셋으로 파일에 문자를 저장하는 메소드
    public static void write(String str) throws IOException {
        OutputStream os = new FileOutputStream("C:/Temp/test.txt");
        Writer writer =  new OutputStreamWriter(os, "UTF-8");    //문자 변환 보조 스트림 연결
        
        writer.write(str);
        writer.flush();
        writer.close();
    }

     


    성능 향상 스트림

    • 보통 하드 디스크의 입출력 성능에 따라 전체 프로그램의 입출력 성능이 결정된다.
      - 하드웨어 구성 요소 중 하드 디스크의 입출력 성능이 가장 떨어지기 때문
    • 네트워크 전송 시에는 네트워크 환경의 데이터 입출력 성능에 따라 어플리케이션의 성능이 결정된다.
    • 소프웨어적(로직 측면)으로 해결하는 방법에는 분명 한계가 존재하지만 그럼에도 어느 정도 효과는 기대할 수 있다.
      - 안하는 것보다는 훨씬 낫다.
    • 프로그램이 입출력 소스와 직접 작업하지 않고 중간에 메모리 버퍼와 작업함으로써 실행 성능을 향상시킬 수 있다.

     

    • 버퍼를 활용한 입출력 성능 향상
      • 데이터 출력
        - 데이터가 가득 찰 때만 모아둔 데이터를 하드 디스크로 전송하여 출력 횟수를 줄일 수 있다.
      • 데이터 입력
        - 하드디스크로부터 데이터를 메모리 버퍼에 미리 채워두었다가 필요할 때 데이터를 읽으면 일기 성능을 향상시킬 수 있다.

     

    • 바이트 입출력 성능 향상 보조 스트림
    BufferedInputStream bis = new BufferedInputStream(바이트 입력 스트림);
    BufferedOutputStream bos = new BufferedOutputStream(바이트 출력 스트림);

     

    • 문자 입출력 성능 향상 보조 스트림
    BufferedReader br = new BufferedReader(문자 입력 스트림);
    BufferedWriter bw = new BufferedWriter(문자 출력 스트림);

     

    • 문자 입력 스트림 Reader에 BufferReader를 연결하면 행 단위 문자열을 읽는 readLine() 메소드를 사용할 수 있다.

     

    //문자 파일을 행 단위로 읽는 코드
    BufferedReader br = new BufferedReader(new FileReader("..."));
    while(true) {
        String strd = br.readLine();    //파일에서 한 행씩 읽음
        if(str == nullbreak;            //더 이상 읽을 행이 없을 경우(파일 끝) while 문 
    }

     


    기본 타입 스트림

    • DataInputStream : 바이트 단위를 기본 타입으로 복원시켜주는 기능 제공

     

    DataInputStream dis = new DataInputStream(바이트 입력 스트림);

     

    DataInputStream의 주요 메소드

    리턴 타입 메소드 설명
    boolean readBoolean() 바이트 단위를 boolean 타입으로 읽음
    byte readByte() 바이트 단위를 byte 타입으로 읽음
    char readChar() 바이트 단위를 char 타입으로 읽음
    double readDouble() 바이트 단위를 double 타입으로 읽음
    float readFloat() 바이트 단위를 float 타입으로 읽음
    int readInt() 바이트 단위를 int 타입으로 읽음
    long readLong() 바이트 단위를 long 타입으로 읽음
    short readShort() 바이트 단위를 short 타입으로 읽음
    String readUTF() 바이트 단위를 String 타입으로 읽음

     

    • DataOutputStrema :기본 타입 데이터를 바이트 단위로 변환해주는 기능 제공

     

    DataOutputStream dos = new DataOutputStream(바이트 출력 스트림);

     

    DataOutputStream의 주요 메소드

    리턴 타입 메소드 설명
    void writeBoolean(boolean v) boolean 타입을 바이트 단위로 출력
    void writeByte(int v) byte 타입을 바이트 단위로 출력
    void writeChar(int v) char 타입을 바이트 단위로 출력
    void writeDouble(double v) double 타입을 바이트 단위로 출력
    void writeFloat(float v) float 타입을 바이트 단위로 출력
    void writeInt(int v) int 타입을 바이트 단위로 출력
    void writeLong(long v) long 타입을 바이트 단위로 출력
    void writeShort(int v) short 타입을 바이트 단위로 출력
    void writeUTF(String str) String 타입을 바이트 단위로 출력

     

    • DataOutputStream으로 출력한 데이터를 다시 DataInputStream으로 읽어 올 떄는 출력한 순서와 동일한 순서로 읽어야 한다.
      • 출력할 때의 순서 : int → Boolean → double
      • 입력할 때의 순서 : int → Boolean → double

     


    프린트 스트림

    • 프린터처럼 출력해주는 보조 스트림
    • 콘솔에 데이터를 출력할 때 사용한 System.out.println()에서 out이 PrintStream 타입이다.

     

    • PrintWriter 바이트 스트림(OutputStream)과 문자 스트림(Writer) 구분하지 않고 모두 연결 가능하다.
      - 관례적으로 문자 출력 스트림과 연결해서 사용하는 경우가 많다.

     

    PrintStream ps = new PrintStream(바이트 출력 스트림);
    PrintWriter pw = new PrintWriter(문자 출력 스트림);

     

    PrintStream과 PrintWriter의 주요 메소드

    리턴 타입 메소드 설명
    void print() 콘솔에 데이터 출력(기본 타입, String, Object)
    void println() 콘솔에 데이터 출력 후 줄바꿈(기본 타입, String, Object)
    void printf() 형식화된  문자열(format string) 출력

     


    객체 스트림

    • 객체를 입출력 해주는 스트림
    • 자바는 메모리에 생성된 객체를 파일 또는 네트워크로 출력할 수 있다.
      • 직렬화(serialization) : 객체의 필드 값을 나열한 바이트로 변환하는 것
        ObjectOutputStream
      • 역직렬화(deserialization) : 직력화된 바이트를 객체의 필드 값으로 복원하는 것
        ObjectInputStream

     

    //바이트 입력 스트림에 역직렬화 보조 스트림 연결
    ObjectInputStream ois = new ObjectInputStream(바이트 입력 스트림);
    객체타입 변수 = (객체타입) ois.readObject();    //읽은 바이트 데이터를 역직렬화하여 객체로 생성
     
    //바이트 출력 스트림에 직렬화 보조 스트림 
    ObjectOutputStream oos = new ObjectOutputStream(바이트 출력 스트림);
    oos.writeObject(객체);    //객체를 직렬화하는 메소드

     


    Serializable 인터페이스

    • Serializable 인터페이스를 구현한 클래스의 객체만 ObjectOutputStream의 writeObject() 메소드로 직렬화가 가능하다.
      - String과 Date 등의 클래스는 Serializable 인터페이스를 구현한 클래스이므로 직렬화가 가능하다.
    • Serializable 인터페이스는 멤버가 없는 빈 인터페이스이며, 직렬화 가능한 객체라는 것을 표시하는 역할만 한다.
    • 정적 필드와 transient로 선언된 필드 값은 직렬화 대상이 아니다.

     


    serialVersionUID 필드

    • 원칙적으로 직렬화된 클래스와 역직렬화할 클래스의 내용이 동일해야 하지만 직렬화된 필드를 양쪽 클래스 모두 포함하고 있고, serialVersionUID 상수가 같으면 역직렬화가 가능하다.
    • serialVersionUID 상수의 값은 클래스마다 고유한 값을 가지는 게 좋다.
      - 이클립스에서는 Serializable을 구현한 클래스에 대해 serialVersionUID 상수 값을 고유 식별 값으로 자동 생성해주는 기능이 있다.

     


    File과 Files 클래스

    • File 클래스(java.io)와 Files 클래스 (java.nio.file) 공통적으로 파일과 디렉토리에 대한 정보 생성 및 삭제 기능을 제공한다.

     


    File 클래스

     

    //File 객체 생성
    File file = new File("경로");
     
    File file = new File("C:/Temp/file.txt");
    File file = new File("C:\\Temp\\file.txt");

     

    리턴 타입 메소드 설명 exists()의 값
    boolean exists() 파일 또는 폴더가 존재하면 true를 리턴
    존재하지 않으면 false를 리턴
     
    boolean createNewFile() 새로운 파일을 생성 false
    boolean mkdir() 새로운 디렉토리를 생성 false
    boolean mkdirs() 경로상에 없는 모든 디렉토리를 생성 false
    boolean delete() 파일 또는 디렉토리 삭제 true
    boolean canExecute() 실행할 수 있는 파일인지 여부 true
    boolean canRead() 읽을 수 있는 파일인지 여부 true
    boolean canWrite() 수정 및 저장할 수 있는 파일인지 여부 true
    String getName() 파일의 이름을 리턴 true
    String getParent() 부모 디렉토리를 리턴 true
    File getParentFile() 부모 디렉토리를 File 객체로 생성 후 리턴 true
    String getPath() 전체 경로를 리턴 true
    boolean isDirectory() 디렉토리인지 여부 true
    boolean isFile() 파일인지 여부 true
    boolean isHidden() 숨김 파일인지 여부 true
    long lastModified() 마지막 수정 날짜 및 시간을 리턴 true
    long length() 파일의 크기 리턴 true
    String[] list() 디렉토리에 포함된파일 및 서브 디렉토리 목록 전부를 String 배열로 리턴 true
    String[] list(FilenameFilter filter) 디렉토리에 포함된 파일 및 서브 디렉토리 목록 중에 FilenameFilter에 맞는 것만 String 배열로 리턴 true
    File[] listFiles() 디렉토리에 포함된 파일 및 서브 디렉토리 목록 전부를 FIle 배열로 리턴 true
    File[] listFiles(FilenameFilter filter) 디렉토리에 포함된 파일 및 서브 디렉토리 목록 중에 FilenameFilter에 맞는 것만 FIle 배열로 리턴 true

     


    Flies 클래스

    • 운영체제의 파일 시스템에게 파일 작업을 수행하도록 지시하는 정적 메소드로 구성되어 있다.
      - 정적 메소드로 구성되어 있으므로 객체를 생헝할 필요가 없다.

     

    메소드 기능
    copy 복사
    createDirectories 생성
    createDirectory
    createFile
    createLink
    createSymbolicLink
    createTempDirectory
    createTempFile
    move 이동
    exists 존재
    notExists
    find 검색
    mismatch 비교
    getLastModifiedTime 속성
    getOwner
    getPosixFilePermissions
    isDirectory
    isExecutable
    isHidden
    isReadable
    isSymbolicLink
    isWritable
    size
    setAttribute
    setLastModifiedTime
    setOwner
    setPosixFilePermissions
    probeContentType
    list 디렉토리 탐색
    newDirectory
    walk
    newInputStream 데이터 입출력
    newOutputStream
    newBufferedReader
    newBufferedWriter
    readAllBytes
    lines
    readAllLines
    readString
    readSymbolicLink
    write
    writeString

    'JAVA' 카테고리의 다른 글

    TCP 네트워킹  (0) 2023.03.20
    네트워크 입출력  (0) 2023.03.20
    데이터 입출력  (0) 2023.03.17
    스트림 요소 처리  (0) 2023.03.16
    스트림(Stream)  (0) 2023.03.16
Designed by Tistory.