파일입출력

최주영·2023년 3월 27일
0

자바

목록 보기
16/30

입출력


스트림


✅ 스트림의 종류 : OutputStream , InputStream, Reader, Write
= > 넷 다 추상클래스로 그 밑에 서브(하위)클래스틀 통해서 사용가능

 OutPutStream (save : 저장)
	--------------->
	RAM   =>   하드 
	<--------------
 inputstream(load : 불러오기)
  • OutputStream
  • 그림, 오디오, 비디오, 텍스트 파일 등 모든 종류의 등 모든 종류의 데이터를 파일로 저장

  • 파일로부터 바이트 단위로 저장할 때 사용함

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

  • 파일 생성시 FileNotFoundException 예외처리 필수로 해야함
public class FileStreamController {

	public void fileSave() {
		// 애플리케이션에서 관리하는 데이터를 지정한 파일에 저장하는 기능
		// 1. OutputStream 클래스를 이용 -> 불가능함 
		// OutputStream 클래스 상속받은 FileOutputStream 클래스를 이용
		// FileOutputStream 클래스 생성
		// 매개변수있는 생성자를 이용
		// 1) new FileOutputStream(File f);  // 클래스 타입 방식
		// 2) new FileOutputStream(String filename); // 스트링 타입 방식
		
		FileOutputStream fos = null;
		
		// try~catch로 미리 예외처리 해줘야 할 수 있음
		try {
//			FileOutputStream fos = 
//					new FileOutputStream(new File("test.txt"));  // (1)번 방식
			fos = new FileOutputStream("test"); // (2)번 방식
			// 만일 지정한 파일 없으면 생성해서 연결함	
			
			// 생성한 스트림을 이용해서 데이터 저장하기
			// write() 메소드를 이용
			// 매개변수는 정수형이나 바이트배열형만 가능함
			fos.write(65);
			fos.write(66);
			fos.write(10);
			String name = "유병승";
			fos.write(name.getBytes()); // 문자열을 바이트 배열형으로 형변환해서 저장
			
		}catch(FileNotFoundException e) { // 파일생성 예외처리
			e.printStackTrace();  
		}catch(IOException e) {  // fos.write 예외처리
			e.printStackTrace();
		}finally {   // 예외가 발생하든 안하든 무조건 실행하는 문장
			// 생성한 Stream을 반드시 닫아줘야한다.
			// close();
			try {
				if(fos!= null)fos.close();  // fos에 널값이 들어가면 널포인터 오류뜨기때문에
			}catch(IOException e) {
				e.printStackTrace();
			}
		}
	}

  • InputStream

    FileInputStream
  • 그림, 오디오, 비디오, 텍스트 파일 등 모든 종류의 파일 읽기 가능

  • 파일로부터 바이트 단위로 읽을 때 사용함

  • FileInputStream객체가 생성될 때 파일과 직접 연결 되며 만약 파일이 존재하지 않으면 FileNotFoundException이 발생하므로 예외처리 필수
// 파일데이터 불러오기
	public void fileOpen() {
		FileInputStream fis = null;
		try {
//			fis = new FileInputStream(new File("test.txt")); //(1번방식)
			fis = new FileInputStream("test"); //(2번방식)
			
			// 연결된 파일에서 데이터를 읽어오기
			// read() 메소드를 이용
			// 1byte씩 읽어옴 -> int로 반환해줌
			// 파일의 내용을 끝까지 다 읽어오면 -1을 반환함
			int value = 0;
			
			while((value = fis.read()) != -1) {
				System.out.println((char)value); // 영어이외의 문자들은 깨져서 나옴
			}
			
			
		}catch(IOException e) {
			e.printStackTrace();
		}finally {
			try {
				if(fis!=null) fis.close();
			}catch(IOException e) {
				e.printStackTrace();
			}
		}
	}

  • Writer

FileWriter

  • 텍스트 가 아닌 그림, 오디오, 비디오 등의 파일은 저장 불가능

  • 텍스트 파일로부터 문자 단위저장 할 때 사용

  • FileWriter객체가 생성될 때 파일과 직접 연결 됨 만약 파일이 존재하지 않으면 자동으로 생성하지만 이미 파일이 존재하는 경우 파일을 덮어쓰는 단점이 있음
	// 데이터를 문자열로 저장하기
	// Write 클래스 이용하기
	// 추상클래스인 Write 클래스를 사용하지 않고 상속받은 FileWrite 클래스를 사용한다
	// 값을적어서 파일로 보내는거 = FileWrite
    
    // 파일을 저장하는 메소드 구현하기 -> 문자열
	// 파일 저장 메소드 구현
	// 매개변수로 저장할 데이터와 파일명을 받는 메소드
	public void saveMsg(String data, String fileName) { // 추가할 데이터, 추가할 파일이름
		FileWriter fw = null;
		
		try {
			// 스트림이 연결됨
			fw = new FileWriter(fileName,true);  // true -> 값을 추가할 때마다 값이 누적됨
			fw.write(data);
		}catch(IOException e) {
			e.printStackTrace();
		}finally {
			try {
				if(fw!=null) fw.close();
			}catch(IOException e) {
				e.printStackTrace();
			}
		}
	}

  • Reader

FileReader

  • 텍스트가 아닌 그림, 오디오, 비디오 등의 파일은 읽기 불가능

  • 텍스트 파일로부터 문자 단위로 읽을 때 사용

  • FileInputStream객체가 생성될 때 파일과 직접 연결 되며 만약 파일이 존재하지 않으면 FileNotFoundException이 발생하므로 예외처리 필수
//파일읽기메소드 구현
//매개변수로 파일명을 입력받아 파일에 있는 데이터를 가져와 출력하는 메소드
// Reader 클래스 이용하기
// 추상클래스인 Reader 클래스를 사용하지 않고 상속받은 FileReader 클래스를 사용한다
// 파일을 읽어서 값을 불러읽는것 = FileReader
	public void loadMsg(String fileName) {
		FileReader fr = null;
		
		try {
			fr = new FileReader(fileName);
			int data = 0;
			StringBuilder sb = new StringBuilder(); // 값을 출력할 때 한번에 출력하기 위해 
            // StringBuilder 클래스를 통해서 값을 누적하려고 만듬
			while((data=fr.read())!= -1) { // 읽은곳이 마지막부분까지
				sb.append((char)data);
			}
			System.out.println(sb);
		}catch(IOException e){
			e.printStackTrace();
		}finally {
			try {
				if(fr!=null)fr.close();
			}catch(IOException e) {
				e.printStackTrace();
			}
		}
	}
profile
우측 상단 햇님모양 클릭하셔서 무조건 야간모드로 봐주세요!!

0개의 댓글