입출력
스트림
✅ 스트림의 종류 : OutputStream , InputStream, Reader, Write
= > 넷 다 추상클래스로 그 밑에 서브(하위)클래스틀 통해서 사용가능
OutPutStream (save : 저장)
--------------->
RAM => 하드
<--------------
inputstream(load : 불러오기)
- 그림, 오디오, 비디오, 텍스트 파일 등 모든 종류의 등 모든 종류의 데이터를 파일로 저장
- 파일로부터 바이트 단위로 저장할 때 사용함
- 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();
}
}
}
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();
}
}
}
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();
}
}
}
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();
}
}
}