JAVA/JAVA2
[java2] #36 - PrintWriter (Text File Write Test)
yoonddo
2022. 11. 23. 16:44
텍스트 파일에 데이터를 저장하는 printWriter를 사용해 키보드로 입력받은 데이터를 파일에 저장하는
코드를 작성해보자
package com.it.textfileio;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Scanner;
public class TextFileWriteTest {
public static void main(String[] args) {
Scanner sc = null; //텍스트 파일로 저장할 데이터를 입력받는 Scanner
PrintWriter pw = null; //텍스트 파일에 데이터를 저장하는 printWriter
String filename = "./src/com/koreait/textfileio/out.txt"; //상대경로
try {
pw = new PrintWriter(filename);
sc = new Scanner(System.in);
// "QUIT"가 입력될 대 까지 반복하며 키보드로 입력받은 데이터를 파일에 저장한다.
while (true) {
System.out.println(">>> ");
String str = sc.nextLine().trim();
// "QUIT"가 입력되면 무한루프를 탈출시킨다.
if (str.toUpperCase().equals("QUIT")) {
break;
}
if (str.length() != 0) {
// write() 메소드를 사용해서 PrintWriter클래스 객채로 생성한 파일로 출력한다
// write() 메소드로 출력할 때 "\n"을 입력했는데 텍스트 파일에서 줄이 변경되지 않으면 "\r\n"을 사용한다.
// \n: new line, 줄을 바꾼다.
// \r: carriage return, 커서를 줄의 맨 앞으로 보낸다
pw.write(str + "\r\n");
}
}
System.out.println("저장완료!!!");
}catch (FileNotFoundException e) {
// e.printStackTrace();
System.out.println("디스크에 파일이 존재하지 않습니다.");
}finally {
// 출력 용도로 사용하는 파일은 출력 작업이 완료되면 반드시 파일을 닫아야 정상적으로 처리된다.
if (pw != null) {
pw.close();
}
}
}
}
결과
- 출력 파일의 경로와 이름을 설정한다. 경로 지정 방식은 절대경로 지정방식과 상대경로 지정방식이 잉ㅆ다.
- 절대경로는 작업중인 파일이 위치한 디스크 드라이브의 최상위(root) 폴더(디렉토리)부터 파일이 위치한
폴더까지의 경로를 의미한다. -> ex) C:/Project/JAVA/workspace/0719/src/com/it/textfileio/out.txt
- 상대경로는 작업중인 파일이 포함된 프로젝트 이름의 폴더(".")부터 작업중인 파일이 위치한 폴더까지의
경로를 의미한다. -> ex) ./src/com/koreait/textfileio/out.txt
- python이나 c/c++의 "."은 화면에 열려있는 파일이 위치한 폴더를 의미하지만 java에서는 파일이 포함된
프로젝트 이름의 폴더를 의미한다. 경로와 경로 또는 경로와 파일을 구분하는 "\"는 에러가 발생되면 "\\"나
"/"로 변경한다. (이클립스 버전이 올라가면서 경로를 복사해 붙여넣으면 자동으로 "\"가 "\\"로 변경된다. - try - catch문을 사용해 지정한 경로에 파일이 존재하지 않을시 알려주도록 만든다.
- while문을 사용해 "QUIT"가 입력될 때 까지 무한으로 반복하며 입력받은 데이터를 파일에 저장한다.
- 입력받은 문자의 길이가 0이 아닐시 write() 메서드를 사용해서 PrintWriter클래스 객체로 생성한 파일에 저장한다.write() 메서드로 저장할 때 "\n"을 입력했는데 텍스트 파일에서 줄이 변경되지 않으면 "\r\n"을 사용한다.
- 쓰기 용도로 사용하는 파일은 작업이 완료되면 반드시 파일을 닫아야 정상적으로 처리되기 때문에 close()를 해준다.
다음은 Scanner클래스 객체를 생성해서 지정된 경로를 입력해 사용할 파일을 오픈해 읽어들일 데이터의 값이
정수형, 논리형, 실수형, 문자열 중 어떤 유형인지 검사하는 코드를 작성해보자.
package com.it.textfileio;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class TextFileReadTest {
public static void main(String[] args) {
Scanner sc = null;
String filename = "./src/com/it/textfileio/out.txt";
try {
// Scanner 클래스 객체를 생성해서 지정된 경로의 입력으로 사용할 파일을 open한다.
// Scanner로 텍스트파일을 읽어오려면 Scanner클래스 생성자의 인수로 파일의 경로와 이름을 사용해서 File클래스 객체를 생성해서 넘겨줘야한다.
sc = new Scanner(new File(filename));
// 텍스트 파일에서 더 이상 읽어들일 데이터(줄)가 없을 때까지 반복하며 읽어들인다.
// hasNextLine() : Scanner로 지정된 파일에서 읽어들일 데이터가 있으면 true, 없으면 false를 리턴한다.
while (sc.hasNextLine()) {
String str = sc.nextLine().trim();
System.out.println(str);
int i = 0;
boolean b = false;
double d = 0;
String s ="";
// String 변수에 저장된 문자열 데이터를 읽어들이는 스캐너
Scanner scan = new Scanner(str);
// hasNext() : Scanner로 지정된 String변수에 저장된 공백으로 구분하는 메소드
while (scan.hasNext()) {
if(scan.hasNextInt()) { //String 변수에서 읽어들일 데이터가 정수인가?
i = scan.nextInt();
}else if (scan.hasNextBoolean()) { //String 변수에서 읽어들일 데이터가 논리값인가?
b = scan.nextBoolean();
}else if (scan.hasNextDouble()) {
d = scan.nextDouble();
}else {
s = scan.next();
}
}
System.out.println("i = " + i);
System.out.println("b = " + b);
System.out.println("d = " + d);
System.out.println("s = " + s);
}
}catch (FileNotFoundException e){
// e.printStackTrace();
System.out.println("디스크에 파일이 존재하지 않습니다.");
}finally {
// 입력 용도로 사용하는 파일은 파일을 닫지않아도 정상적으로 처리된다.
if (sc != null) {
sc.close();
}
}
}
}
결과
- Scanner로 텍스트 파일을 읽어오려면 Scanner 클래스 생성자의 인수로 파일의 경로와 이름을 사용해서 File클래스
객체를 생성해 넘겨줘야한다. Scanner클래스 객체를 만들 때 생성자의 인수로 "System.in"을 넣으면 키보드로 입력
받는 스캐너가 만들어지고, 생성자의 인수로 String변수를 넣어주면 String 변수에 저장된 내용을 읽어들이는 스캐너가 만들어진다. 이때 파일의 내용을 읽어들여야 하기 때문에 new File(파일경로가 저장된 변수)를 스캐너에 넣어줘야한다. - hasNextLine() 메서드를 사용해 Scanner로 지정된 파일에서 읽어들일 데이터가 있으면 true, 없으면 false를 리턴해
읽어들일 데이터가 없을 때까지 반복한다. - 읽어들인 데이터를 str에 저장한 후 str에 저장된 문자열 데이터를 Scanner로 지정된 String변수에 저장해 데이터의
값을 검사하고 출력한다.