Java IO(입출력)

2024. 4. 22. 17:03Java

자바 IO는 파일에서 데이터를 읽고 쓰기, 네트워크를 통한 데이터 전송, 사용자 입력 처 리 등 다양한 방법으로 사용

InputStream, OutputStream, Reader, Writer

 

1. byte단위 입출력 Stream

byte단위 입출력 스트림은 데이터를 바이트 단위로 읽고 쓰는 기능을 제공한다.

byte단위 입출력 스트림은 주로 이진 데이터를 다룰 때 사용된다. 이진 데이터란 텍스 트가 아닌 파일이나 네트워크 데이터 같은 것을 말합니다. 예를 들어, 이미지, 오디오 파 일, 비디오 파일 등이 이진 데이터에 해당한다.

 

1-1 InputStream

(1). FileInputStream: 파일로부터 바이트 단위로 데이터를 읽는 데 사용됩니다. 이 클래 스는 파일 시스템에 저장된 데이터를 읽는 기본적인 방법을 제공합니다.

(2). ByteArrayInputStream: 바이트 배열로부터 데이터를 읽습니다. 이 클래스는 메모리 에 저장된 바이트 배열로부터 데이터를 읽을 때 사용됩니다.

(3). BufferedInputStream: 버퍼링을 사용하여 입력 효율을 높입니다. 데이터를 일정량 모아두었다가 한 번에 처리함으로써, 여러 번의 작은 읽기 연산보다 더 효율적으로 데이터를 읽을 수 있습니다.

(4). DataInputStream: 기본 데이터 타입을 바이트 스트림으로부터 직접 읽을 수 있게 합 니다. 예를 들어, int , long , float 등의 타입을 읽을 때 유용합니다.

 

1-2 OutputStream

(1). FileOutputStream: 파일로 바이트 단위로 데이터를 쓰는 데 사용됩니다. 파일 시스 템에 데이터를 저장할 때 주로 사용되는 클래스입니다.

(2). ByteArrayOutputStream: 바이트 배열에 데이터를 씁니다. 이 클래스는 메모리 내에 서 데이터를 바이트 배열로 만들어내는 데 사용됩니다.

(3). BufferedOutputStream: 버퍼링을 사용하여 출력 효율을 높입니다. 데이터를 일정량 모아두었다가 한 번에 쓰기 연산을 수행함으로써, 여러 번의 작은 쓰기 연산보다 더 효율적으로 데이터를 출력할 수 있습니다.

(4). DataOutputStream: 기본 데이터 타입을 바이트 스트림으로 쓸 수 있게 합니다. int , long , float 등의 데이터 타입을 바이트 스트림에 쉽게 쓸 수 있게 해줍니다.

 

package com.example.day12;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class ByteStreamExam {
    public static void main(String[] args) {
        //파일로 부터 읽어서 -- 입력 통로가 필요
        //파일에 쓴다. -- 출력 통로가 필요
        //FileInputStream 과 FileOutputStream 은 각각 파일로부터 바이트 단위로 데이터를 읽고 쓰는 데 사용됩니다.
        FileInputStream fis = null;
        FileOutputStream fos = null;

		//try-catch 블록은 입출력 작업 중 발생할 수 있는 예외를 처리합니다.
        try{
            fis = new FileInputStream("src/com/example/day12/ReadFile.java");
            fos = new FileOutputStream("src/com/example/day12/outputTile.txt");

            int c ;
            //fis.read() 메소드는 파일로부터 한 바이트를 읽어옵니다. 파일의 끝에 도달하면 -1 을 반환합니다.
            while((c = fis.read()) != -1){
            	//fos.write(c) 메소드는 읽어온 바이트를 다른 파일에 씁니다.
                fos.write(c);
            }
        } catch(Exception e){
            e.printStackTrace();
        } finally {
            if(fis != null){ //finally 블록은 파일 스트림을 안전하게 닫기 위해 사용됩니다
                try {
                    fis.close();
                }catch (IOException e){
                    e.printStackTrace();
                }
            }
            if(fos != null){
                try {
                    fos.close();
                }catch (IOException e){
                    e.printStackTrace();
                }
            }

        }
    }
}

 

2. char단위 입출력 Stream

char단위 입출력 스트림은 자바에서 텍스트 데이터를 처리할 때 사용되는 입출력 방식이다.

이 스트림은 문자(character) 데이터를 읽고 쓰는 데에 최적화되어 있으며, 주로 텍 스트 파일이나 문자열 데이터를 다룰 때 사용된다.

 

2-1 Reader

(1). FileReader: 텍스트 파일로부터 데이터를 읽기 위해 사용됩니다. 파일의 텍스트 내용 을 한 문자씩 읽거나, 문자 배열을 통해 한 번에 여러 문자를 읽을 수 있습니다.

(2). StringReader: 문자열로부터 데이터를 읽습니다. 문자열 내의 데이터를 순차적으로 읽어 처리하는 데 사용됩니다.

(3). BufferedReader: 입력 데이터를 버퍼에 저장하여 효율적으로 읽을 수 있게 합니다. readLine 메소드를 통해 한 줄씩 읽는 기능이 자주 사용되며, 텍스트 파일을 효율적 으로 처리하는 데 적합합니다.

(4). InputStreamReader: byte 스트림을 문자 스트림으로 변환하는 데 사용됩니다. 이 클 래스는 바이트 기반 스트림을 문자 기반 스트림으로 연결하는 다리 역할을 합니다.

 

2-2 Writer

(1). FileWriter: 텍스트 파일에 데이터를 쓰기 위해 사용됩니다. 문자 데이터를 파일에 쓸 수 있으며, 여러 쓰기 메소드를 제공합니다.

(2). StringWriter: 문자열로 데이터를 쓸 때 사용됩니다. 내부적으로 문자열 버퍼를 관리 하며, 데이터를 문자열 형태로 쉽게 작성할 수 있습니다.

(3). BufferedWriter: 데이터를 내부 버퍼에 저장한 후 한 번에 쓰기를 수행합니다. 이 방 식은 여러 번의 작은 쓰기 연산보다 효율적이며, 특히 파일 쓰기 작업에 유용합니다.

(4). OutputStreamWriter: 문자 스트림을 바이트 스트림으로 변환하는 데 사용됩니다. 이 클래스는 문자 기반 데이터를 바이트 기반 스트림으로 쓸 때 필요합니다.

package com.example.day12;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class CharStreamExam {
    public static void main(String[] args) {
    //FileReader 는 텍스트 파일로부터 문자 데이터를 읽는 데 사용됩니다. 파일에서 한 문자씩 데이터를 읽어들입니다.
	//FileWriter 는 텍스트 파일에 문자 데이터를 쓰는 데 사용됩니다. 파일에 한 문자씩 데이터를 씁니다.
    
    //try-catch 블록은 파일 입출력 과정에서 발생할 수 있는 예외를 처리합니다.
        try(FileReader reader = new FileReader("a.txt");
            FileWriter writer = new FileWriter("c.txt")){
            int c;
            //reader.read() 메소드는 파일에서 한 문자를 읽고, 파일의 끝에 도달하면 -1 을 반환합니다.
            while((c=reader.read()) != -1) {
                writer.write(c); //writer.write(c) 메소드는 읽은 문자를 새로운 파일에 씁니다.
            }
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

 

 

*BufferedReader 와 InputStreamReader 를 사용하여 System.in 으로부터 사용자의 입력을 받는 방법

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class SystemIOExample {
	public static void main(String[] args) {
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
		try {
			System.out.println("문자열을 입력하세요: ");
			String userInput = reader.readLine();
			System.out.println("입력받은 문자열: " + userInput);
		} catch (IOException e) {
			System.err.println("입력 오류가 발생했습니다: " + e.getMessage());
		} finally {
			try {
				reader.close();
			} catch (IOException e) {
				System.err.println("리더를 닫는 중 오류가 발생했습니다: " + e.getMessage());
			}
		}	
	}	
}

 

'Java' 카테고리의 다른 글

멀티 스레드(Thread)  (1) 2024.04.22
내부 클래스  (0) 2024.04.16
예외처리(Exception)  (1) 2024.04.16
인터페이스(Interface)  (0) 2024.04.16
추상 클래스  (0) 2024.04.16