본문 바로가기
Java/Java

[Java] I/O 스트림

by 기록하는_사람 2022. 10. 22.

I/O 스트림 모델(= I/O 모델)

📌 I/O 스트림 모델(= I/O 모델)

: 입출력 대상에 상관없이 동일한 방법으로 입출력 진행 가능하게 하는  것. 

 

입력 스트림과 출력 스트림

📌 입력 스트림(Input Stream)

: 대상으로부터 자료를 읽어 들이는 스트림.

 

📌 출력 스트림(Output Stream)

: 대상으로 자료를 출력하는 스트림. 

 

📌 System.in.read( )

: 바이트 단위로 읽음. 

 

📄 SystemInTest.java

package iostream;

import java.io.IOException;

public class SystemInTest {

	public static void main(String[] args) {
		System.out.println("문자열 입력: ");
		
		int i = 0;
		try {
			while((i = System.in.read()) != '\n') {
				System.out.print((char)i);
			}
		}
		catch (IOException e) {
			e.printStackTrace();
		}
	}

}

 

📌 Scanner 클래스

: 입력 클래스. 

 

📄 ScannerTest.java

package iostream;

import java.util.Scanner;

public class ScannerTest {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		String s = sc.nextLine();
		int num = sc.nextInt();
		
		System.out.println(s);
		System.out.println(num);
	}

}

 

바이트 스트림과 문자 스트림

📌 바이트 스트림

: 바이트 단위로 데이터를 입출력하는 스트림.

 

📌 flush( )

: 출력 버퍼 비울 때 사용. 

 

📌 close( )

: 내부에서 flush( )가 호출됨. 

 

📄 FileInOutStreamTest.java

package iostream;

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

public class FileInOutStreamTest {

	public static void main(String[] args) {
		try(OutputStream out = new FileOutputStream("data.dat")) {  // 출력 스트림 생성.
			out.write(10);
			out.write(20);
			out.write(30);
		}
		catch(IOException e) {
			e.printStackTrace();
		}
		
		try(InputStream in = new FileInputStream("data.dat")) {  // 입력 스트림 생성.
			int d = 0;
			while((d = in.read()) != -1) {
				System.out.print(d + " ");  // 10 20 30 
			}
		}
		catch(IOException e) {
			e.printStackTrace();
		}
	}

}

 

📄 FileInOutputStreamTest.java

package iostream;

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

public class FileInOutputStreamTest {

	public static void main(String[] args) {
		byte[] bs = new byte[26];
		byte data = 65;
		for(int i = 0; i < bs.length; i++) {
			bs[i] = data++;
		}
		
		try(FileOutputStream out = new FileOutputStream("input.txt")) {
			out.write(bs);
		}
		catch(IOException e) {
			System.out.println(e);
		}

		
		try(FileInputStream in = new FileInputStream("input.txt")) {
			byte[] bs2 = new byte[10];
			
			int  i;
			while((i = in.read(bs2)) != -1) {
				for(int j = 0; j < i; j++) {
					System.out.print((char)bs2[j]);
				}
				System.out.println();
			}
		}
		catch(IOException e) {
			System.out.println(e);
		}
	}

}

// ABCDEFGHIJ
// KLMNOPQRST
// UVWXYZ

 

📌 문자 스트림

: 문자 단위로 읽는 스트림.

 

📄 FileWriterReaderTest.java

package iostream;

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

public class FileWriterReaderTest {

	public static void main(String[] args) {
		try(FileWriter out = new FileWriter("writer.txt")) {  // 출력 스트림 생성.
			out.write("a");
			
			char[] chbuf = { 'b', 'c', 'd' };
			out.write(chbuf);
			
			out.write("efghick");
			out.write("12345");
		}
		catch(IOException e) {
			e.printStackTrace();
		}
		
		try(FileReader in = new FileReader("writer.txt")) {  // 입력 스트림 생성.
			int d = 0;
			while((d = in.read()) != -1) {
				System.out.print((char)d + " ");  // a b c d e f g h i c k 1 2 3 4 5 
			}
		}
		catch(IOException e) {
			e.printStackTrace();
		}
	}

}

 

기반 스트림과 보조 스트림

📌 기반 스트림

: 대상에 직접 자료를 읽고 쓰는 기능의 스트림.

 

📌 보조 스트림

: 직접 일고 쓰는 기능 없이 추가적인 기능을 더해주는 스트림.

 

📌 InputStreamReader와 OutputStreamWriter

: 바이트 단위로 읽거나 쓰는 자료를 문자로 변환해주는 보조 스트림. 

 

 

'Java > Java' 카테고리의 다른 글

[Java] 쓰레드(Thread) 동기화  (0) 2022.10.24
[Java] 쓰레드(Thread)  (0) 2022.10.24
[Java] 예외 처리  (0) 2022.10.22
[Java] 최종 연산  (0) 2022.10.21
[Java] 중간 연산 - 정렬과 루핑(Looping)  (0) 2022.10.21

댓글