새소식

Java

[JAVA] File I/O

  • -

 

I/O ?

데이터의 입력(Input) 및 출력(Output)을 의미한다.

내가 키보드로 무언가를 입력하면 입력 스트림으로 프로그램에 입력이 되고, 프로그램에서 출력스트림을 통해 콘솔로 출력한다.

이때 키보드와 콘솔은 노드, 이러한 과정을 노드스트림이라고 지칭한다.

스트림은 단방향으로만 통신이 가능하다.(하나의 스트림으로 입/출력을 같이 할 수 없음)

 

 

 

Node Stream의 종류

 

 

Input Stream(Byte)의 메서드

- read(): byte 하나를 읽어서 int로 반환한다. 더 읽을 값이 없으면 -1을 리턴한다.

- read(byte b[]): b만큼 읽어서 읽은 바이트 개수를 리턴, 더 읽을 값이 없으면 0을 리턴한다.

- read(byte b[], int offset, int len): len만큼 데이터를 읽어 b의 offset부터 바이트 개수를 리턴(len+offset <= b의 크기)

- close(): 스트림을 종료해서 자원을 반납한다.

 

 

 

Output Stream(Byte)의 메서드

- write(int b): b를 byte로 출력한다.

- write(byte b[]): b를 문자열로 변환해서 출력한다.

- write(byte b[], int offset, int len): b의 offset부터 offset+len-1만큼을 문자열로 변환해서 출력한다.

- flush(): 버퍼의 내용을 출력하고 버퍼를 비운다.

- close(): 스트림을 종료해서 자원을 반납한다.

 

 

Reader(Char)의 메서드

- read(): char 하나를 읽어서 int로 반환한다. 더 읽을 값이 없으면 -1을 리턴한다.

- read(char c[]): c만큼 읽어서 읽은 바이트 개수를 리턴, 더 읽을 값이 없으면 0을 리턴한다.

- read(char c[], int offset, int len): len만큼 데이터를 읽어 c의 offset부터 바이트 개수를 리턴(len+offset <= c의 크기)

- read(java.nio.CharBuffer target): 데이터를 읽어서 target에 저장한다.

- close(): 스트림을 종료해서 자원을 반납한다.

 

 

 

Writer(Char)의 메서드

- write(int c): c를 char로 출력한다.

- write(char c[]): c를 문자열로 변환해서 출력한다.

- write(char c[], int offset, int len): c의 offset부터 offset+len-1만큼을 문자열로 변환해서 출력한다.

- append(CharSequence csq): csq를 출력하고 Writer를 리턴한다.

- append(CharSequence csq, int start, int end): csq의 start ~ end까지 출력하고 Writer를 리턴한다.

- flush(): 버퍼의 내용을 출력하고 버퍼를 비운다.

- close(): 스트림을 종료해서 자원을 반납한다.

 

 

 

 

 

File

- File(String pathname): pathname에 해당하는 파일을 생성한다. 이걸 안 넣으면 App를 시작한 경로로 설정한다.

- File(File P, String C): P경로 아래 C를 생성한다.

- File(URI uri): file로 시작하는 URI 객체를 이용해 파일을 생성

- CreateNewFile(): 물리적인 파일을 생성한다.

- getAbsolutePath(): 파일의 절대 경로를 출력한다.

- getCanonicalPath(): 파일의 정식 경로(절대 경로이며 .이나 ..같은 상대 경로 기호가 없는 경로)를 출력한다.

- ListFile(): 파일이 디렉터리일 경우 자식 파일들을 File [] 형태로 리턴한다.

- FileInputStream(String name): name 경로의 파일을 읽는 FIleInputStream을 생성한다.

- FileOutputStream(String name): name 경로의 파일에 출력하는 FIleOutputStream을 생성한다.

- FileOutputStream(String name, boolean append): 위와 동일, 기존 파일이 있으면 이어서 작성

 

 

 

 

보조 스트림

다른 스트림에 부가적인 기능을 제공하는 스트림이다.

필요에 따라 여러 보조 스트림을 연결해서 사용할 수 있다.(스트림 체이닝)

 

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		n = Integer.parseInt(st.nextToken());
		m = Integer.parseInt(st.nextToken());

보조스트림의 BufferedReader를 이용하여 Input을 받는 예시 코드이다.

Scanner에 비해 속도가 빨라 알고리즘 문제 해결에 사용되기도 한다.

 

 

객체 직렬화

객체를 파일 등에 저장하거나 네트워크로 전송하기 위해 연속적인 데이터로 변환하는 것이다.

클래스에서 Serializable 인터페이스를 구현해야 하며, 직렬화를 원하지 않는 멤버는 transient를 선언하면 된다.

serialVersionUID: 클래스의 변경 여부를 파악하기 위한 유일 키로 직렬화 - 역직렬화 간 검증용으로 사용한다.

 

 

ObjectOutputStream(OutputStream out): out을 이용해 ObjectOutputStream 객체를 생성한다.

writeObject(Object obj): obj를 직렬화하여 출력한다.

 

ObjectInputStream(InputStream in): in을 이용해 ObjectInputStream 객체를 생성한다.

readObject(): 직렬화된 데이터를 역직렬화해서 Object로 반환한다.

 

private static File target = new File("c:/Temp/objPerson.dat ");
    private static void write() {
        Person person = new Person("흥길동2", "pass1234", "123-456", "seoul");
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(target))) {
            oos.writeObject(person);
            System.out.println("저장 완료!");
        } catch (IOException e){
            e.printStackTrace();
        }
    }
    private static void read() {
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(target))){
            Object readed = ois.readObject();

            if (readed != null && readed instanceof Person casted){
                System.out.println("로딩 완료: " + casted);
            }
        } catch (IOException | ClassNotFoundException e){
            e.printStackTrace();
        }
    }

'Java' 카테고리의 다른 글

[JAVA] GC - Mark & Sweep 동작 원리  (0) 2025.05.17
[JAVA] ConcurrentHashMap  (0) 2025.05.17
[JAVA] Exception  (0) 2024.07.28
[JAVA] Stream API  (0) 2024.07.25
[JAVA] Lambda  (0) 2024.07.24
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.