코드 그라데이션

<보충> Day28-29 파일 입출력 본문

Java/Mega

<보충> Day28-29 파일 입출력

완벽한 장면 2023. 4. 30. 10:27

파일 입출력

- 일단 우선적으로 콘솔 입출력과 비교해야함.

- 입력과 출력의 기준 => 컴퓨터

 

콘솔 출력 : 컴퓨터 -> 콘솔

콘솔 입력 : 콘솔 -> 컴퓨터

 

파일 입력 : 컴퓨터 기준으로 컴퓨터가 읽는 것.

파일 출력 : 컴퓨터 기준으로 컴퓨터가 파일에게 내보내는 것. 

 

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();
  }

}

덮어쓰기와 이어쓰기는 경우에 따라 매우 자주 활용합니다.

728x90
Comments