카테고리 없음

입출력 스트림(3) / BufferedReader / FileOutputStream

Heidong 2021. 8. 24. 20:35
반응형
package ioEx2;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Ex10_BufferedReader {

	public static void main(String[] args) {
		
		// BufferendReader : 문자 입력 스트림
		// 버퍼를 활용하여 입력 속도 향상
		// 한줄씩 입력 가능
		
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		//버퍼드리더 써야 한줄에 입력 가능
		try {
			String name, s;
			int age;
			
			System.out.print("이름 ? ");
			name = br.readLine();
			
			System.out.print("나이 ? ");
			age = Integer.parseInt(br.readLine());
			
			s = age >= 19 ? "성인" : "미성년자";
			
			System.out.println(name + "님은 "+s+"입니다.");
			
		} 
		catch (NumberFormatException e) { // 문자를 숫자로 못바꿀때의 에러
			System.out.println("나이는 숫자만 입력 가능");
		}
		
		catch (IOException e) { // 
			e.printStackTrace();
		}

	}

}

BufferedReader

문자 입력 스트림

버퍼를 활용해서 입력 속도가 좋음

한줄에 입력 가능

 

- 버퍼드리더 객체 br 생성(인풋스트림리더 System.in)

- readLine()을 이용해서 한번에 다 읽어 낸다 (기존 방식은 바이트 방식으로 1바이트,2바이트씩 읽어냈음)

- 나이 구할때는 입력 받은게 문자열이니까 Integer.parseInt로 Integer형태로 바꾸어준다.

- 나머지는 삼항 연산자로 조건 구하고

- 출력

 

- NumberFormatException은 문자를 숫자로 못바꿨을때의 에러이다. (나이 입력할때 숫자 입력 안하고 다른거 입력했을 때)

 

 

FileOutputStream (중요)

File 관련 개념들은 중요하다.

(파일 내용 입력 하기)

 

package ioEx2;

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

public class Ex11_FileOutputStream {

	public static void main(String[] args) {
		// 중요
		
		String pathname = "test.txt";
		// 파일에 내용을 저장하는 바이트 스트림
		FileOutputStream fos = null;
		int data;
		
		try {
			fos =  new FileOutputStream(pathname);
				//해당 파일이 없으면 생성하고, 존재하면 삭제하고 만듬
			
			System.out.println("문자열 입력 ctrl + z 종료");
			while((data = System.in.read()) != -1) { // -1을 써야 ctrl + z 를 써서 입력 완료를 한다.
				fos.write(data);
			}
			fos.flush();
			System.out.println("파일 저장 완료");
			
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if(fos != null) {
				try {
					fos.close();
				} catch (Exception e2) {
					// TODO: handle exception
				}
			}
		}

	}

}

미리 같은 경로에 test.txt 파일이 있어야한다.

 

- String 형태 pathname에 실험할 텍스트 파일 이름 넣어준다.

- FileOutputStream 객체 fos 생성하고 null 값을 넣어준다. (꼭 넣어줘야 함.)

- 객체 fos에 pathname을 새로 생성한다 (있으면 삭제하고 다시 만드니 주의)

- System.in의 read()를 이용해서 값을 입력 받는다.

- 파일 만들었던 객체 fos에 write를 이용해서 출력 버퍼에 저장

- ctrl + z 누르거나 더 이상 읽어올 값이 없을때 -1일때까지 값을 입력 받는다.

- 입력 다 받았으면 flush()로 입력한 것들을 fos에 출력 => 곧 파일 안에 내용이 입력 되었음

 

- finally를 이용해서 (finally는  try-catch문과 관계 없이 무조건 실행한다.)

- 만약 fos에 null이 없다면 (즉 값이 들어 갔다면) close해준다.

- null이면 catch문 실행

 

package ioEx2;

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

public class Ex12_FileOutputStream {
//암기해야함
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String pathname = "test.txt";
		int data;
		
		// JDK 7.0부터 가능 자동 close
		try(FileOutputStream fos = new FileOutputStream(pathname)) {
			System.out.println("문자열 입력 [종료 : ctrl+z]");
			
			while((data = System.in.read()) != -1) {
				fos.write(data);
			}
			fos.flush();
			System.out.println("파일 저장 완료");
			
		} catch (IOException e) {
			// ctrl + shift + o
			e.printStackTrace();
		}

	}

}

- 위에 Ex11과 같은 기능을 한다.

- 그러나 예외 조건을 try 바로 옆에 주면 finally문장 안써도 된다.

 

package ioEx2;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class Ex13_FileInputStream {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		String pathname = "test.txt";
		int data;
		FileInputStream fis = null;
		
		try {
			fis = new FileInputStream(pathname);
				// FileInputStream : 파일 입력 바이트 스트림
				// 만약 파일이 존재하지 않으면 FileNotFoundException 발생
			
			System.out.println(pathname + "파일 내용");
			
			while((data = fis.read()) != -1) {
				// 파일에서 읽은 내용 화면에 출력
				System.out.write(data);
			}
			System.out.flush();
			
		} 
		
		catch (FileNotFoundException e) {
			System.out.println("존재하지 않는 파일");
		}
		
		catch (IOException e) {
			e.printStackTrace();
			
		} finally {
			if(fis != null) {
				try {
					fis.close();
				} catch (Exception e2) {
					// TODO: handle exception
				}
			}
		}
	}

}

FileInputStream

파일 입력 바이트 스트림

(파일 내용 출력)

 

- String pathname에 실험할 텍스트 파일 이름을 준다.

- FileInputStream 객체 생성하고 null 준다

- 마찬가지로 while 반복문을 활용한다

- fis.read() = 파일에서 읽은 내용을 데이터에 담는다

- write를 이용해서 버퍼 장치로 보냄

- flush()로 출력을 한다.

- finally문으로 close해준다.

 

package ioEx2;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class Ex14_FileInputStream {

		public static void main(String[] args) {
			// TODO Auto-generated method stub

			String pathname = "test.txt";
			int data;
			
			try(FileInputStream fis = new FileInputStream(pathname)) {
				
				System.out.println(pathname + "파일 내용");
				
				while((data = fis.read()) != -1) {
					// 파일에서 읽은 내용 화면에 출력
					System.out.write(data);
				}
				System.out.flush();
				
			} 
			
			catch (FileNotFoundException e) {
				System.out.println("존재하지 않는 파일");
			}
			
			catch (IOException e) {
				e.printStackTrace();
				
			} 
	}

}

- 위 코드와 동일한 기능을 한다.

- finally를 안쓰기 위해 try 바로 옆에 조건을 준 모습

반응형