재밌고 어려운 IT를 이해해보자~!

파일 입출력 본문

교육전 개인공부

파일 입출력

언제나즐거운IT 2023. 10. 28. 22:05

파일 입출력 스트림을 통해서 파일을 생성하고 읽고 쓸 수 있다.

FileInputStream과 FileOutputStream은 

OutputStreamWriter, InputStreamReader을 통해 보조받을 수 있다. (인코딩 같은것)

BufferedInputStream, BufferedOutputStream을 쓰면

버퍼에 저장해서 한번에 옮기는식으로 하기때문에 시간이 훨씬 단축한다!

 

바이트단위로 파일 생성 후 쓰기 (FileOutputStream)

package study.io.bytes;

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

public class FileOutTest {
	public static void main(String[] args) {
		
		FileOutputStream out = null;
		
		try {
			//이어쓰기(true)는 기존파일이 있다면, 이어쓰기 없다면 새로생성
			//이어쓰기(false)는 기존파일이 있다면,덮어쓰기 없다면 새로 생성
			out = new FileOutputStream("write.txt", false);
			
			//write(int val)은 단일 값만 가능
			out.write(97); // 아스키
			out.write('B');
			out.write('C');
			out.write('\n');
			
			String str = "문장을 출력합니다.";
			byte[] strArray = str.getBytes();
			
			out.write(strArray);
			
			System.out.println("파일생성 완료");
		}catch (IOException e) {
			e.printStackTrace();
		}finally {
			try {
				
				if(out != null) {
					out.close();
				}
			}catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

파일 읽기 (FIleInputStream)

 

package study.io.input;

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

//절대경로와 상대경로
//절대경로는 물리적인 경로이다. c://program//Java// ...etc
//상대경로는 내위치를 기준으로 지정하는 경로이다.
public class FileReadExam {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//IO는 파일이 없을수도있고 없을수도있다 checked exception이 된다. 직접 체크해줘야한다?
		FileInputStream in = null;
		try {
		//try catch 안에 선언되면 finally는 모른다.
	//	FileInputStream in = new FileInputStream("text.txt");
		in = new FileInputStream("text.txt");
		//파일이 끝이면 -1을 뱉는다.
		//read() 메서드가 int단위로 리턴하기때문에 int로 선언
		int read = 0;
		
		while((read = in.read()) != -1) {
			//read = in.read();
			//아스키코드표에 의해서 문자--> 숫자로 표기하여 리턴
			System.out.print((char)read); //ln을 쓰면 줄바꿈까지 읽어서 안된다.
		}
		
		}catch (IOException e) {
			e.printStackTrace();
		}finally {
			if( in != null) {
				try {
					in.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} //close 자체가 IOException을 받는 애이다.
			}
		}

	}
}

바이트배열 buffer를 사용해 읽기

package study.io.input;

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

//절대경로와 상대경로
//절대경로는 물리적인 경로이다. c://program//Java// ...etc
//상대경로는 내위치를 기준으로 지정하는 경로이다.
public class FileReadExam02 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//IO는 파일이 없을수도있고 없을수도있다 checked exception이 된다. 직접 체크해줘야한다?
		FileInputStream in = null;
		try {
		//try catch 안에 선언되면 finally는 모른다.
	//	FileInputStream in = new FileInputStream("text.txt");
		in = new FileInputStream("text.txt");
		//파일이 끝이면 -1을 뱉는다.
		//read() 메서드가 int단위로 리턴하기때문에 int로 선언
		int read = 0;
		byte[] buffer = new byte[50];
		//read(byte[] arr)은 리턴으로 읽은 개수
		//한글이 깨지지 않을려면 바이트배열로 읽어오는게 좋다.
		while((read = in.read(buffer)) != -1) {
			System.out.write(buffer,0,read);//write라는 메서드는 바이트배열을 출력해줄 수 있다.
			System.out.print(new String(buffer,0,read));//read 대신 buffer.length를 사용하면 
			//딱 맞아 떨어지지 않아 버퍼에 남아있는것들이 그대로 같이 출력되어 이상하게 된다.
			//read = in.read();
			//아스키코드표에 의해서 문자--> 숫자로 표기하여 리턴
			//System.out.print((char)read); //ln을 쓰면 줄바꿈까지 읽어서 안된다.
		}
		}catch (IOException e) {
			e.printStackTrace();
		}finally {
			if( in != null) {
				try {
					in.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} //close 자체가 IOException을 받는 애이다.
			}
		}

	}
}

바이트단위가 아닌 캐릭터단위로 읽고 쓰는 방법으로는

FileReader, FireWriter가 있다. 이밥법을 쓰면 한글이 깨지지 않는다.

 

 

'교육전 개인공부' 카테고리의 다른 글

MVC Pattern Self Practice  (1) 2023.12.18
리스트로 수정해보는 로또  (1) 2023.10.29
쓰레드  (0) 2023.10.26
정렬, 비교, 람다  (0) 2023.10.25
컬렉션 프레임워크  (2) 2023.10.23
Comments