package day12.io;
import java.io.File;
import java.io.IOException;
public class FileExample {
// 파일을 저장할 기본 경로
public static final String ROOT_PATH = "C:/Users/smr78/OneDrive/바탕 화면/yocong";
public static void main(String[] args) {
// 폴더 생성 명령
// 파일 정보 객체 생성
File directory = new File(ROOT_PATH + "/hello");
// 폴더 생성 (hello 폴더)
if (!directory.exists()) directory.mkdir();
// 파일 생성하기 (food.txt)
File newFile = new File(ROOT_PATH + "/hello/food.txt");
if (!newFile.exists()) {
try {
newFile.createNewFile();
} catch (IOException e) {
System.out.println("존재하는 파일입니다.");
}
}
}
}
입력 스트림
read()
: 입력 스트림으로부터 1바이트를 읽고 읽은 바이트를 리턴.read(byte[] b)
: 입력 스트림으로부터 읽은 바이트들을 매개값으로 주어진 바이트 배열에 저장하고 실제로 읽은 바이트 수를 리턴 public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream(FileExample.ROOT_PATH + "/hello/pet.txt")) {
int data = 0; // 세이브파일 로드 명령
while ((data = fis.read()) != -1) {
// write() : 아스키코드를 문자로 출력
System.out.write(data);
}
// 출력 버퍼 비우기
System.out.flush();
} catch (FileNotFoundException e) {
System.out.println("해당 경로를 찾을 수 없습니다.");
} catch (IOException e) {
System.out.println("출력 시스템에 장애가 발생했습니다.");
}
}
출력 스트림
write(byte b)
: 출력 스트림으로 1바이트를 내보냄.write(byte[] b)
: 출력 스트림으로 주어진 바이트 배열 b의 모든 바이트들을 내보냄.public class FileOutputExample {
public static void main(String[] args) {
String message = "멍멍이는 멍멍멍 왈왈왈! 야옹이는 냐냐냥~";
// try의 ()안에 입력해주는 코드는 자동으로 close해줌 -> finally에 close 할 필요 X
try (FileOutputStream fos = new FileOutputStream(FileExample.ROOT_PATH + "/hello/pet.txt")) {
fos.write(message.getBytes()); // 세이브파일 생성 명령, byte 기반이기 떄문에 byte로 변환
} catch (FileNotFoundException e) {
System.out.println("해당 경로를 찾을 수 없습니다.");
} catch (IOException e) {
System.out.println("출력 시스템에 장애가 발생했습니다.");
}
}
}
try with resource
: close가 필요한 하드웨어 접근 코드에 대해 메모리 자원 반납 처리를 자동화해주는 문법입력 스트림
public static void main(String[] args) {
String targetPath = FileExample.ROOT_PATH + "/hello/hobby.txt";
try (FileWriter fw = new FileWriter(targetPath)) {
String hobby = SimpleInput.input("취미를 입력하세요!!\n>>");
String outputMessage = String.format("내 취미는 %s입니다.\n", hobby);
// 파일 생성 명령
fw.write(outputMessage);
} catch (Exception e) {
e.printStackTrace();
}
}
출력 스트림
public static void main(String[] args) {
String targetPath = FileExample.ROOT_PATH + "/hello/member.txt";
try (FileReader fr = new FileReader(targetPath)) {
// 보조 스트림 활용
// 텍스트를 라인단위로 읽어들이는 보조스트림
BufferedReader br = new BufferedReader(fr);
// 회원정보를 저장할 리스트 생성
List<Member> memberList = new ArrayList<>();
while (true) {
String s = br.readLine();
if (s == null) break;
String[] split = s.split(",");
// 읽어들인 회원정보로 회원 객체 생성
Member member = new Member(
split[0],
split[2],
split[1],
split[3],
Integer.parseInt(split[4])
);
// System.out.println("member = " + member);
memberList.add(member);
}
System.out.println(memberList);
} catch (Exception e) {
e.printStackTrace();
}
}
FileInputStream fis = new FileInputStream(new File("test.txt"));
BufferedInputStream bis = new BufferedInputStream(fis);
Writer rt = new FileWriter("파일 경로");
BufferedWriter bw = new BufferedWriter(rt);
Reader rd = new FileReader("파일 경로");
BufferedReader bf = new BufferedReader(rd);
-> BufferedReader, BufferedWriter 를 사용하면 비용과 속도적인 측면에서 빠르고 효율적이다.
// 회원정보 텍스트파일에 저장하기
try (FileWriter fw = new FileWriter(FileExample.ROOT_PATH + "/hello/member.txt", true)) {
String newMemberInfo = String.format("%s,%s,%s,%s,%d\n"
, newMember.email, newMember.memberName
, newMember.password, newMember.gender, newMember.age);
fw.write(newMemberInfo);
} catch (Exception e) {
e.printStackTrace();
}
}
true
를 두 번째 매개변수로 전달하여 파일의 기존 내용 끝에 새로운 내용을 추가할 수 있게 해줬다.fw.write();
를 사용하여 새로운 회원 정보를 추가한다. // 회원 정보 세이브파일 불러오기
public void loadFile() {
String targetPath = FileExample.ROOT_PATH + "/hello/member.txt";
try (FileReader fr = new FileReader(targetPath)) {
// 보조 스트림 활용
// 텍스트를 라인단위로 읽어들이는 보조스트림
BufferedReader br = new BufferedReader(fr);
// 회원정보를 저장할 리스트 생성
List<Member> memberList = new ArrayList<>();
while (true) {
String s = br.readLine();
if (s == null) break;
String[] split = s.split(",");
// 읽어들인 회원정보로 회원 객체 생성
Member member = new Member(
split[0],
split[2],
split[1],
split[3],
Integer.parseInt(split[4])
);
this.members.push(member);
}
System.out.println(memberList);
} catch (Exception e) {
e.printStackTrace();
}
}
package day12.io.obj;
import day12.io.FileExample;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.util.List;
public class SaveSnack {
public static void main(String[] args) {
List<Snack> snackList = List.of(
new Snack("콘칲", 1970, 1500, Snack.Taste.GOOD)
, new Snack("사브레", 1980, 2500, Snack.Taste.BAD)
, new Snack("오징어집", 1985, 1800, Snack.Taste.SOSO)
);
try (FileOutputStream fos = new FileOutputStream(FileExample.ROOT_PATH + "/hello/snack.sav")) {
// 객체를 통째로 저장할 수 있는 보조 스트림
// serialize: 직렬화 - 데이터를 일렬로 늘여뜨려 놓는 것
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(snackList);
} catch (Exception e) {
e.printStackTrace();
}
}
}
implements Serializable
해준다.public class Snack implements Serializable {
public static void main(String[] args) {
// 세이브 파일 로딩하기
try (FileInputStream fis = new FileInputStream(FileExample.ROOT_PATH + "/hello/snack.sav")) {
// 객체를 로딩할 보조 스트림
ObjectInputStream ois = new ObjectInputStream(fis);
List<Snack> snackList = (List<Snack>) ois.readObject();
System.out.println("snackList = " + snackList);
} catch (Exception e) {
e.printStackTrace();
}
}