본문 바로가기
JAVA

2022-10-25 입출력 I/O

by HTT 2022. 10. 28.

입출력 I/O



1. 스트림

 

- 데이터를 운반하는데 사용되는 연결통로이다.

 

- 단방향 통신만 가능(하나의 스트림으로 입출력 동시에 처리 불가)

 

- 입력스트림(InputStream)과 출력스트림(OutputStream) 필요함

 

 

 

2. 바이트기반 스트림 (1byte)

 

: InputStream, OutputStream

 

- byte단위 입력을 위한 클래스의 상위클래스인 InputStream


- 키보드를 입력한 문자를 읽어서 리턴


- 1byte단위로 읽기 때문에 한글을 입력하면 깨짐(한글 - 2byte)

 

package io;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;

public class InputStreamTest {
	public static void main(String[] args) {
		InputStream myin = System.in;
		PrintStream myout = System.out;
		myout.println("안녕");
		try {
			while(true) {
				int data = myin.read();
//				if(data==13) {
//					break;
//				}
				myout.print((char)data);
			}
		}catch(IOException e){
			e.printStackTrace();
		}
	}
}

 

 

3. 보조 스트림 (Buffered)

 

- 데이터를 입출력할 수 있는 기능은 없지만, 스트림의 기능을 향상시키거나 새로운 기능을 추가할 수 있다.

 

- 스트림을 먼저 생성한 후 이를 이용해 보조스트림을 생성해야 한다.

 

- 모든 보조스트림 역시 InputStream, OutputStream의 자손들이므로 입출력방법이 같다.

 

 

 

4. 문자기반 스트림 (2byte)

: Reader, Writer

 

1) FileReader, FileWriter 이용해서 파일 복사하기

package io;
// FileReader로 읽기
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class FileCopy {

	public static void main(String[] args) throws Exception {

		FileReader fr = null;
		FileWriter fw = null;
		try {
			fr = new FileReader("src/io/FileReaderTest.java");
			fw = new FileWriter("src/data/output2.txt");
			int data = 0;
			int count = 0;
			long start = System.nanoTime();
			while ((data = fr.read()) != -1) {
			//fw.write(data);
			//System.out.print((char)data); // output2에 어떤 결과가 출력되는지 알기 위해 썼음. 안 써도 됨
				count++;
			}
			long end = System.nanoTime();
			System.out.println("실행횟수 => "+count);
			System.out.println("실행시간 => "+(end-start));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (fr != null) {
					fr.close();
				}
				if (fw != null) {
					fw.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}

		}
	}
}

 

 

2) BufferedReader 이용해서 작업하기

package io;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class FileCopyBuffer {

	public static void main(String[] args) throws Exception {
		BufferedReader fr = null;
		FileWriter fw = null;
		try {
			fr = new BufferedReader(new FileReader("src/io/FileReaderTest.java"));
			fw = new FileWriter("src/data/output2.txt");
			int data = 0;
			int count = 0;
			long start = System.nanoTime();
			while (true) {
				String line = fr.readLine();
				if(line==null) {
					break;
				}
				//fw.write(line);
				//System.out.println(line);
				count++;
			}
			long end = System.nanoTime();
			System.out.println("실행횟수 => "+count);
			System.out.println("실행시간 => "+(end-start));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (fr != null) {
					fr.close();
				}
				if (fw != null) {
					fw.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

 

 

 

4-1. FileReader

- 예외처리 해주기

- 파일열기 -> 파일엑세스 -> 파일닫기

package io;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class FileReaderTest {

	public static void main(String[] args) {
		// 파일경로를 주지 않고 파일명만 입력하면 기본위치에서 찾는다.
		// 기본위치 => 프로젝트 폴더
		FileReader fis = null;
		try {
			//OS와 통신해서 원하는 파일이 있는지 확인
			//1. 파일을 open
			fis = new FileReader("src/data/test.txt");
			//종료조건 : 파일의 끝인 경우에 반복문 종료
			int count = 0;
			//2. 파일엑세스
			while(true) {
				int data = fis.read();
				if(data==-1) { //end of file
					break; //반복문 빠져나오기
				}
				System.out.print((char)data);
				count++;
			}
			System.out.println("실행횟수 : "+count);
			
		}catch(FileNotFoundException e){
			e.printStackTrace();
			System.out.println("파일을 찾을 수 없습니다.");
		}catch(IOException e) {
			e.printStackTrace();
			System.out.println("읽기오류");
		}finally {
			//3. 파일닫기
			try {
				if(fis!=null)
				fis.close();
			}catch(IOException e) {
				e.printStackTrace();
			}
		}
	}

}

 

 

4-2. FileWriter

- 파일열기 -> 파일엑세스 -> 파일닫기

package io;
import java.io.FileWriter;
public class FileWriterTest {

	public static void main(String[] args) throws Exception{
		// 파일출력의 기본은 덮어쓰기이다.
		//1. 파일열기
		FileWriter fw = new FileWriter("src/data/output.txt", true);
		//2. 파일엑세스
		fw.write(97); //a문자를 파일에 쓰기
		fw.write("안녕\n");
		fw.write("hello");
		//3. 파일닫기
		fw.close();
	}
}

 

 

 

5. 문자기반의 보조스트림

 

- InputStreamReader, OutputStreamReader

 

- 바이트기반 스트림을 문자기반 스트림으로 연결시켜주는 역할

 

- 바이트기반 스트림의 데이터를 지정된 인코딩의 문자데이터로 변환하는 작업을 수행한다.

 

package io;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class BufferedReaderTest {

	public static void main(String[] args) {
		BufferedReader br = null;
		InputStream in = null;
		InputStreamReader isr = null;
		try {
			// 키보드입력을 BufferedReader로 읽기
			in = System.in;
			isr = new InputStreamReader(in);
			br = new BufferedReader(isr);
			String line = br.readLine();
			System.out.println(line);
			
			br = new BufferedReader(new InputStreamReader(System.in));
			System.out.println(br.readLine());
			
			// 파일입력을 BufferedReader로 읽기
			br = new BufferedReader(new FileReader("src/data/output.txt"));
			System.out.println(br.readLine());
		}catch(IOException e) {
			e.printStackTrace();
		}
	}

}

* 내부에서 버퍼(보조스트림)를 이용해서 데이터를 저장하고 읽을 수 있도록 관리

* 키보드 입력은 InputStream이고, BufferedReader는 Reader만 받을 수 있기 때문에 InputStreamReader가 BufferedReader로 이어주는 역할을 함

* 예외처리 해주기

 

 

 

6. Scanner => BufferedReader로 변경하기

1) Scanner로 배열 입력받기

Scanner scan = new Scanner(System.in);
		int n = scan.nextInt();
		int[] arr = new int[n];
		for (int i = 0; i < n; i++) {
			arr[i] = scan.nextInt();
		}

 

2) BufferedReader로 배열 입력받기

BufferedReader br = null;
br = new BufferedReader(new InputStreamReader(System.in));
	try {
		int one = Integer.parseInt(br.readLine());
		String n = br.readLine();
		String[] myarr = n.split(" ");
		int[] arr = new int[myarr.length];
		for (int i = 0; i < myarr.length; i++) {
			arr[i] = Integer.parseInt(myarr[i]);
		}catch(IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if(br != null) {
                	br.close();
                }
            }catch(IOException e) {
            	e.printStackTrace();
            }
        }

* 예외처리 하기

* split메소드 이용해서 공백(" "), 콤마(,) 이용해서 자르기

* int타입 변수에 대입할 때는 Integer.parseInt이용하기

** BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    생성할 때 "new" 꼭 작성하기!!!!!!!!!!

댓글