1. 스트림 Stream

- 순서가 있는 데이터의 연속적인 흐름

- 입풀력 단위에 따라 분류

 

바이트 스트림 문자 스트림
바이트 단위로 입출력하는 클래스 문자 단위로 입출력하는 클래스
추상 클래스인 InputStream, OutputStream에서 파생됨 기본 추상 클래스인 Reader, Writer 클래스에서 파생됨
바이트 스트림 클래스 이름에는 InputStream(입력), OutputStream(출력)이 붙음 문자 스트림 클래스 이름에는 Reader(입력), Writer(출력)이 붙음

 

2. 문자 스트림

- 입출력 단위가 문자 (바이트 X)

- 자바는 유니코드 이용하여 문자 저장

 

- 주요 메소드

 

- 파일에서 문자 읽고 쓸 때는 FileReader, FileWriter 사용

- 파일에서 문자 읽는 경우 일반적으로 반복문 사용 

int ch;
while ((ch = fr.read()) != -1)
    System.out.print((char) ch + " ");
import java.io.*;

public class FileReaderTets(String met){ 
    public static void main(String[] args) {
        FileReader fr;
        try {
            fr = new FileReader("test.txt");
            int ch;
            while((ch fr.read() != -1)
                System.out.print((char) ch + " ");
            fr.close();
        } catch (IOException e) {
            e.printSTackTrace();
        }
    }
}

 

3. try-with-resources 사용

- close() 따로 호출하지 않아도 자동으로 호출

import java.io.*;

public class FileReaderTest2 {
    public static void main(String[] args) throws Exception {
        try(FileReader fr = new FileReader("test.txt")) {
            int ch;
            while((ch = fr.read()) != -1 )
                System.out.print((char) ch);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

4. 중간 처리 스트림

 

- 자료형이 다른 몇 개의 데이터 파일에 출력했다가 다시 읽기

import java.io.*;

public class DataStreamTest {
    public static void main(String[] args) throws IOException {
        DataInputStream in = null;
        DataOutputStream out = null;
        try {
            out = new DataOutputStream(new FileOutputStream("data.bin"));
            out.writeInt(123);
            out.writeFloat(123.456F);
            out.close();
            
            in = new DataInputStream(new FileInputStream("data.bin"));
            int aint = in.readInt();
            float afloat = in.readFloat();
            
            System.out.println(aint);
            System.out.println(afloat);
        }
        finally {                 // 예외에 상관없이 실행
            if (in != null)       // in이 생성 되어있다면
                in.close();
            
            if (out != null)
                out.close();
        }
    }
}

// 123
// 123.456

 

5. 버퍼 스트림

- 버퍼 입력 스트림: 입력 장치에서 한번에 많이 읽어서 버퍼에 저장, 입력을 요구하면 버퍼에서 꺼내서 반환함

- 버퍼가 비었을 때만 입력 장치에서 읽음

 

inputStream = new BufferedReader(new FileReader("input.txt"));
outputStream = new BufferedWriter(new FileWriter("output.txt"));

 

- 줄 단위로 복사하기 (BufferedReader, PrintWriter 클래스 사용)

import java.io.*;

public class CopyLines {
    public static void main(String[] args) {
        try (BufferedReader in = new BufferedReader(new FileReader("test.txt"))) {
            PrintWriter out = new PrintWriter(new FileWriter("output.txt"))) {
                String line;
                while ((line = in.readLine()) != null) {
                    out.println(line);
                }
        } catch(IOException e) {
            e.printStackTrace();
        }
    }
}

 

6. InputStreamReader, OutputStreamWriter 클래스

- 바이트 스트림과 문자 스트림을 연결하는 두 개의 범용 브릿지 스트림

 

6-1) 한글 코드

- ASCII 

- EUC-KR : 한글 완성형, 16비트, 국내 규격

- CP949 (MS949) : 한글 지원을 위해 MS 윈도우 계열에서 등장한 확장 완성형 인코딩 방식, ANSI

- 유니코드 : 전 세계에서 사용하는 수많은 문자들 각각에 부여한 코드들의 집합

- UTF-8 : 1~4byte로 인코딩하는 가변 길이 인코딩 방식, 기본적으로 첫 128개의 문자들은 1byte에 그대로 인코딩

- UTF-16 : 16bit 기반의 인코딩 방식, 한글 2byte, ANSI와 호환이 되지 않는 문제 있음

 

6-2) InputStreamReader

- 바이트 스트림 -> 문자 스트림으로 변환

BufferedReader in = new BufferedReader(new InputStreamReader(
    new FileInputStream(FileDir), "UTF8"));

 

- UTF-8 코딩 파일 읽기

public class CharEncodingTest {
    public static void main(String[] args) throws IOException {
        File FileDir = new File("input.txt");
        BufferedReader in = new BufferedReader(new InputStreamReader(
            new FileInputStream(fileDir), "UTF-8"));
        String str;
        while ((str=in.readLine()) != null) {
            System.out.println(str);
        }
        in.close();
    }
}

 

7. 객체 저장하기 :  객체 직렬화

 

- 객체 직렬화 : 객체가 가진 데이터들을 순차적인 데이터로 변환

- 순차적인 데이터가 되면 파일에 쉽게 저장할 수 있음

- 직렬화 지원 : Serializable 인터페이스 구현

- 역직렬화 : 직렬화된 데이터를 읽어서 자신의 상태를 복구하는 것 

 

- Date 객체 저장하기

public class ObjectStreamTest {
    public static void main(String[] args) throws Exception {
        ObjectInputStream in = null;
        ObjectOutputStream out = null;
        int c;
        
        out = new ObjectOutputStream(new FileOutputStream("object.dat"));
        out.writeObject(new Date());
        out.close();
        
        in = new ObjectInputStream(new FileInputStream("object.dat"));
        Date d = (Date) in.readObject();
        System.out.println(d);
        in.close();
    }
}


// Sat Jan 06 14:46:32 KST 2018

 

8. Path 객체

- 경로를 나타내는 클래스

- "D:\sources\test.txt" 와 같은 경로를 받아서 객체 반환

public class PathTest {
    public static void main(String[] args) {
        Path path = Paths.get("D:\\sources\\test.txt");
        System.out.println("전체 경로: " + path);
        System.out.println("파일 이름: " + path.getFileName());
        System.out.println("부모 이름: " + path.getParent().getFileName());
    }
}

/**
전체 경로: D:\sources\test.txt
파일 이름: test.txt
부모 이름: sources
**/

 

9. File 객체

- 파일을 조작하고 검사하는 코드를 쉽게 작성하게 해주는 클래스

- 파일이 아닌, 파일 이름을 나타내는 객체!

File file = new File("data.txt");

 

10. 스트림 라이브러리로 파일 처리하기

// 현재 디렉터리의 모든 파일을 출력하는 코드
Files.list(Paths.get(".")).forEach(System.out::println);
// 파일 읽어서 각 줄 끝에 있는 불필요한 공백을 제거하고 빈 줄을 필터링한 후에 출력
Files.lines(new File("test.txt").toPath())
     .map(s -> s.trim())
     .filter(s -> !s.isEmpty())
     .forEach(System.out::println);

 

 

'Software > JAVA' 카테고리의 다른 글

[Baekjoon] 1085.직사각형에서 탈출  (0) 2023.04.03
[JAVA] Day14. 멀티 스레딩  (2) 2023.01.18
[JAVA] Day12. 제네릭과 컬렉션  (0) 2023.01.11
[JAVA] Day11. 자바 그래픽  (5) 2023.01.10
[JAVA] Day10. 스윙 컴포넌트  (0) 2023.01.09

+ Recent posts