코드 그라데이션
<보충> Day28-29 파일 입출력 본문
파일 입출력
- 일단 우선적으로 콘솔 입출력과 비교해야함.
- 입력과 출력의 기준 => 컴퓨터
콘솔 출력 : 컴퓨터 -> 콘솔
콘솔 입력 : 콘솔 -> 컴퓨터
파일 입력 : 컴퓨터 기준으로 컴퓨터가 읽는 것.
파일 출력 : 컴퓨터 기준으로 컴퓨터가 파일에게 내보내는 것.
package Day28;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
public class FileWirterTest {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
String str = "자바는 정말 쉬워요!\n"+ "오늘 숙제는 2개입니다.";
char[] change = new char[str.length()];
str.getChars(0, str.length(), change, 0);
System.out.print("파일이름을 만드세요 : ");
String fileName = sc.next();
FileWriter fw = new FileWriter(fileName);
fw.write(change);
fw.close();
System.out.println(fileName+"파일생성");
}
}
파일 쓰는 방법은 여러가지인데,
여기서는 String fileName = sc.next();
FileWriter fw = new FileWriter(fileName); 방식으로
FileWriter를 사용해서 거기다가 저장을 하고 있음.
그리고 이걸 다 쓰면
fw.close(); 처럼 자원반납을 해줘야 하는데
자바 7인가부터 이 작업을 자동으로 하는 게 가능해짐.
근데 close() 도 에러가 날 수 있으므로, 거기다가 트라이캐치를 만들어줘야함.
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
String str = "자바는 정말 쉬워요!\n" + "오늘 숙제는 2개입니다.";
char[] change = new char[str.length()];
str.getChars(0, str.length(), change, 0);
System.out.print("파일이름을 만드세요 : ");
String fileName = sc.next();
FileWriter fw = new FileWriter(fileName);
try {
fw.write(change);
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
try {
fw.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
System.out.println(fileName + "파일생성");
}
}
}
그런데 이것도 너무 귀찮다.
그걸 해결하기 위한 좋은 방법이 바로 try-with-resources
public class Main {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
String str = "자바는 정말 쉬워요!\n" + "오늘 숙제는 2개입니다.";
char[] change = new char[str.length()];
str.getChars(0, str.length(), change, 0);
System.out.print("파일이름을 만드세요 : ");
String fileName = sc.next();
try (FileWriter fw = new FileWriter(fileName);) {
fw.write(change);
}
System.out.println(fileName + "파일생성");
}
}
이렇게 하면 close가 필요 없다.
public class FileWriterTest {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
String str = "자바는 정말 쉬워요! \n" + "오늘 숙제는 2개입니다. \n" + "주말 숙제는 4개입니다.";
char[] change = new char[str.length()]; // 문자열을 문자열 길이의 배열으로 만들고
str.getChars(0, str.length(), change, 0);
//처음부터 str의 길이만큼을 change 배열에 0(첫위치)부터 삽입한다.
// 그럼 str의 내용이 전부 change 배열 안으로 들어가게 된다.
System.out.print("파일 이름을 정하세요 : ");
String fileName = sc.next();
FileWriter fw = new FileWriter(fileName); // 지금 fileName이라는 파일에다가 글을 쓰겠다는 말.
// 외부로 나가는 것이므로 오류 발생. 일단 throw IoException 처리 해준다.
// try-catch의 방법도 있음.
fw.write(change); // 쓰는 작업
fw.close(); // 닫는 작업. 반드시 해줘야함.
System.out.println(fileName + " 파일이 생성됨");
}
}
public class FileReaderTest {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
System.out.print("읽고싶은 파일 입력 : ");
String fileName = sc.next();
String root = "C:\\Users\OneDrive\\바탕 화면\\메가It\\" + fileName;
FileReader fr = new FileReader(root);
int i;
while ((i = fr.read()) != -1) { // 얘가 int로 읽어요. -1이면 데이터가 없는 것(디폴트)
System.out.print((char) i);
}
fr.close();
}
}
읽을 때는 문자 하나 읽어서 캐릭터로 바꾸고, 그 작업을 계속
public class FileTest01 {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("study.txt");
BufferedReader reader = new BufferedReader(fr);
String line;
while ((line = reader.readLine()) != null) { // 읽으려고 한 줄 뺐는데 null이 아니면!(내용 유)
System.out.println(line);
// 얘가 더 편한 건, 한 줄 문자열로 넘어온다는것. 저번처럼 귀찮은 형변환이 필요가 없어요.
}
}
}
BufferedReader는 빨리 읽는 것(속도 up!)
=> 한번 갔다 한번 오고 이 왔다갔다를 계속 반복하지 말고,
한번에 데이터를 쌓았다가, 한 번 갈때 한번에 처리하고 오고(몰아서) 이런 식의 작업을 가능하게 만들어주는 애.
또하나 주목해야하는건
BufferedReader(fr);
버퍼리더 안에 파일리더를 끼워서 쓰고 있다는 것.
또 하나 알아둘만한 명령어는
Files.readAllLines();
=> 모든 라인을 한 번에 읽을 수 있습니다.
List<String> strings = Files.readAllLines()
이렇게 리스트로 들어와서, 뺄 때는 한줄씩 빼서 보면 됨.
public class FileTest02 {
// 덮어쓰기(새로 쓰기)와 이어쓰기가 있다.
public static void main(String[] args) throws IOException {
FileWriter fw1 = new FileWriter("study.txt", false); // 덮어쓰기
// FileWriter fw2 = new FileWriter("study.txt", true); // 이어쓰기
// fw2.write("자바 정말 쉬워요! 진짜로요. 제발 좀 믿으세요!");
// fw2.close();
// // 얘는 출력하는 게 없어서 아무것도 안나오지만, 파일경로 타고 들어가서 열어보면 추가되어 있음을 확인 가능
fw1.write("실험을 위해 덮어쓰기를 해볼거예요. 자바 정말 쉬워요!!!");
fw1.close();
}
}
덮어쓰기와 이어쓰기는 경우에 따라 매우 자주 활용합니다.
'Java > Mega' 카테고리의 다른 글
<보충> upCasting과 downCasting (0) | 2023.05.03 |
---|---|
Day23. super 보충 (0) | 2023.04.30 |
<보충> 컬랙션 추가 공부 (2) Map, Set, Queue (0) | 2023.04.28 |
Day27. 스타크래프트 문제 코드 비교 (0) | 2023.04.28 |
<보충> 컬랙션 추가 공부(1) List, Stack (0) | 2023.04.28 |