TIL (IO)

이우진·2023년 8월 2일
0
post-thumbnail

Input 입력 (파일 읽기)
-> 외부(키보드)에서 내부(프로그램)로 값(파일)이 들어오는것

Output 출력(파일쓰기/파일 내보내기)
-> 내부(프로그램)에서 외부(모니터/콘솔)로 값이 나가는 것

외부----------------내부
스트림 (Stream):단방향(한 방향)으로 흐른다

Stream: 냇물,시냇물 흐르다

1byte -> 4byte int
바이트 기반 스트림(문자,그림,영상)

2byte -> 4byte int
문자 기반 스트림(only문자)

입출력(IO)
Input과 Output의 약자, 컴퓨터 내부 또는 외부 장치와 프로그램 간의 데이터를 주고 받는 것
장치와 입출력을 위해서는 하드웨어 장치에 직접 접근이 필요한데 다영한 매체에 존재하는 데이터들을
사용하기 위해 입출력 데이터를 처리할 공통적인 방법으로 스트림 이용!
업로드중..

File 클래스
파일 시스템의 파일을 표현하는 클래스
파일 크기,파일 속성 ,파일 이름 등의 정보와 파일 생성 및 삭제 기능 제공

스트림(Stream)클래스

입출력 장치에서 데이터를 읽고 쓰기 위해서 자바에서 제공하는 클래스
모든 스트림은 단방향이며 각각의 장치마다 연결할 수 있는 스트림 존재
하나의 스트림으로 입출력을 동시에 수행할 수 없으므로 동시에 수행하려면 2개의 스트림 필요

분류

스트림 클래스 종류

InputStream
바이트 기반 입력 스트림의 최상위 클래스로 추상클래스임

FileInputStream
파일을 바이트 단위로 읽을 때 사용
그림,오디오,비디오,텍스트 파일 등 모든 종류의 파일 읽기 가능
InputStream의 하위 클래스로 InputStream과 사용 방법 동일

객체 생성
FileInputStream객체가 생성될 때 파일과 직접 연결 됨
만약 파일이 존재하지 않으면 FileNotFouundException이 발생하므로 예외처리 필수

FileInputStream fis = new FileInputStream("C:/dev/test.txt");

OutputStream
바이트 기반 출력 스트림의 최상위 클래스로 추상 클래스임

FileOutputStream
파일능 바이트 단위로 저장할 때 사용
그림,오디오,비디오,텍스트 파일 등 모든 종류의 데이터를 파일로 저장
OutputStream의 하위 클래스로 OutputStream과 사용 방법 동일

객체 생성
FileOutputStream객체가 생성될 때 파일과 직접 연결 됨
만약 파일이 존재하지 않으면 자동으로 생성하지만
이미 파일이 존재하는 경우 파일을 덮어쓰는 단점이 있음

ileOutputStream fos = new FileOutputStream("C:/data/test.txt");

만일 기존 파일에 이어서 계속 작성하고 싶다면 아래 예제처럼 객체 생성 시 가능
FileOutputStream fos = new FileOutputStream("C:/data/test.txt", true);

Reader
문자 기반 입력 스트림의 최상위 클래스로 추상클래스임

FileReader
문자 단위로 텍스트 기반 파일을 읽을 때 사용
텍스트가 아닌 그림,오디오,비디오 등의 파일은 읽기 불가능
Reader의 하위 클래스로 Reader와 사용 방법 동일

객체 생성

FileReader객체가 생성될 때 파일과 직접 연결 됨
만약 파일이 존재하지 않으면 FileNotFoundException이 발생하므로 예외처리 필수

FileReader fr = new FileReader("C:/dev/test.txt");
FileReader fr = new FileReader(new File("C:/dev/test.txt"));

코드

package edu.kh.IO.model.service;

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

public class IOService {

// IO

// Input(입력): 외부->내부로 데이터를 들여오는 것
//Output(출력): 내부-> 외부로 데이터를 내보내는 것

// Stream : 입/출력 통로 역할(데이터가 흘러가는 통로)
//         기본적으로 Stream은 단방향

// 1) 파일 출력 (내부 == 프로그램, 외부 == 파일)
public void output1() {
	
	//바이트 기반 스트림 이용
	FileOutputStream fos = null;
	
	// FileOutputStream 객체 생성 시
	// FileNotFoundException /IOException 예외가 발생할 가능성이 있음 -> 예외처리 필요
	try {
		
		fos = new FileOutputStream("test1.txt");
		// 현재 프로그램에서 test.txt 파일로 출력하는 통로 객체 생성
		
		// 파일에 "Hello" 내보내기
		String str = "Hello";
		
		for(int i =0; i< str.length(); i++) {
			
			//"Hello"를 한문자씩 끊어서 파일로 출력하기
			fos.write(str.charAt(i));
			
			//write()는 IOException을 발생시킬 가능성이 있다.
		}
		
		
	}catch(IOException e){
		System.out.println("예외 발생");
		e.printStackTrace();// 예외 추적 
		
	}finally{
		
		//예외가 발생 하든 말든 무조건 수행
		
		// 사용한 스트림 자원 반환(통로 없앰) --> 필수 작성 !!!
		// 프로그램 메모리 관리 차원에서 항상 다쓰면 끊어줌
		// -> 작성 안하면 문제점으로 꼽을 수 있다!
		try {
		fos.close();
		}catch(IOException e){
			e.printStackTrace();
		}
	}
}


//2) 파일 출력
// 문자 기반 스트림
public void output2() {
	
	FileWriter fw = null;
	// 프로그램 -> 파일로 쓰는 문자 기반 스트림
	
	try {
		
		fw = new FileWriter("test1.txt"); //외부 파일과 연결하는 스트림 객체 생성
		
		String str = "안녕하세요.Hello.12345 !@#";
		
		fw.write(str);
		//실행 했는데 출력이 안되고 있다.
		// --> 한 줄을 통째로 보내기 위해서 "버퍼"를 이용하는데
		// -> 아직 버퍼에 담겨있음 ! 이걸 강제로 밀어넣어서 버퍼를 비워야함.
		
		// close() 구문을 수행하면 통로에 남아있는 내용을 모두 내보내고
		// 통로를 없앤다!
		
	}catch(IOException e) {
		e.printStackTrace();
		
	}finally {
		
		try {
			fw.close();
		}catch(IOException e) {
			e.printStackTrace();
		}
	}
}


//3) 파일 입력 : 외부(파일) -> 내부(프로그램)으로 읽어오기
public void input1() {
	
	FileInputStream fis = null;
	// 파일 -> 프로그램으로 읽어오는 바이트 기반 스트림
	
	try {
		
		fis = new FileInputStream("test1.txt");
		
		// FileInputStream 은 1byte 씩만 읽어올 수 있다.
		
		while(true) {
			
		
		
		int data = fis.read(); // 다음 1byte를 읽어오는데 정수형임.
		                       // 다음 내용이 없으면 -1반환
		
		if(data == -1) { // 다음 내용 없음 -> 종료
			break;
		}
		
		//반복종료가 안됐으면 char로 강제 형변환하여 문자로 출력
		System.out.print((char)data );
		
	  }
		
	}catch(IOException e) {
		e.printStackTrace();
		
	}finally {
		
		try {
			fis.close();
		}catch(IOException e) {
			e.printStackTrace();
		}
		
	}
}

//4) 파일 입력(문자 기반 스트림)
public void input2() {
	
	FileReader fr = null;
	
	try {
		
		fr = new FileReader("test1.txt"); // 파일로부터 읽어오는 통로 객체 생성
		
		while(true) {
			int data = fr.read(); // 다음 한문자를 읽어옴 없으면-1
			
			if(data == -1) {
				break;
			}
			System.out.print((char)data);
		}
		
		
	}catch(IOException e){
		e.printStackTrace();
		
	}finally {
		try {
			
			fr.close();
			
		}catch(IOException e){
			e.printStackTrace();
		}
		
	}
	
	
	
}

}

profile
이우진

1개의 댓글

comment-user-thumbnail
2023년 8월 2일

공감하며 읽었습니다. 좋은 글 감사드립니다.

답글 달기

관련 채용 정보