article thumbnail image
Published 2022. 10. 13. 16:35

- File 클래스 

파일 또는 디렉터리를 다루는 클래스이다.

입출력과 관련된 작업을 수행한다.

 

 

- 만드는 법 

File 참조변수 = new File(파일경로 또는 파일이름);

 

 

- File 클래스 메소드

메소드 의미 반환값
exist() 파일이 실제 존재하는지 여부 boolean
isDirectory() 해당 경로가 디렉토리인지 여부 boolean
length() 파일 데이터 길이를 반환 (byte),
한글 : 3byte
영어/ 특수문자/ 공백 : 1byte
long
mkdir() 디렉토리를 생성한다. boolean
createNewFile() 파일을 생성한다. boolean

 

 

 


 

- FileInputStream 클래스

java.io의 가장 기본이 되는 입력 클래스

입력 스트림을 생성한다.

 

 

- FIleInputStream 클래스 메소드

read( ) : 스트림을 통해 1byte 단위로 데이터를 읽어온다.

이 때 반환 값이 int이기 때문에 문자로 보여주기 위해서는 char타입으로 형 변환을 해주어야 한다.

 

read(byte [] b) 메소드  : 파일 내용을 한 번에 모두 읽어서 배열에 저장한다.

 

 

- FileOutputStream 클래스

java.io의 가장 기본이 되는 출력 클래스

출력 스트림을 생성한다.

 

wtrite( ) : 스트림을 통해 바이트 단위로 데이터를 작성한다.

 

 

✔️ 스트림(stream)

자바는 파일이나 콘솔의 입출력을 직접 다루지 않고 스트림이라는 흐름을 통해서 다루게 된다.
    운영체제에 의해 생성되는 가상의 연결고리를 의미하고 중간 매개자 역할을 한다.

        Java 프로그램 <---------------------> OS(운영체제) <------------------> 디스크 (파일, 디렉터리)
                                           스트림                           모니터, 프린터, 네트워크,...

 


 

- FileReader 클래스

FileInputStream과 유사하다.

문자 스트림으로서 문자 단위의 바이트 변환 기능을 가지고 있다.

바이트 단위가 아닌 문자 단위로 입출력을 실행한다.

스트림 끝에 도달하면 -1을 반환하고 예외를 발생시킨다.

 

FileReader fr  = new FileReader("파일경로");

 

read() 메소드 : 파일로부터 한 개의 문자를 읽어온다.

 

 

 

- FileWriter 클래스

FileOutputStream과 유사하다.

문자 스트림으로서 문자 단위의 바이트 변환 기능을 가지고 있다.

바이트 단위가 아닌 문자 단위로 입출력을 실행한다.

 

FileWriter fw = new FileWriter(생성할파일);

// 파일에 원래 있던 내용을 유지하면 추가 작성
FileWriter fw = new FileWriter(생성할파일, true);

 

write() 메소드 : 하나의 문자를 파라미터로 받아 텍스트 파일에 작성한다.

close() 메소드 : 파일을 닫는다.

 

 


 

FileWriter, FileReader 사용해보기!

 

FileWriter 클래스

package day09;

import java.io.FileWriter;
import java.io.IOException;

public class File1 {
    public static void main(String[] args) {
        // FileWriter
        String str = "자바 공부 열심히 하자..!";

        try {
            FileWriter fw = new FileWriter("input.txt");
            fw.write(str.charAt(0));
            // str을 문자로 바꾸고 0번째 인덱스를 텍스트 파일에 작성
            fw.write("\n");
            fw.write(str);
            fw.write("\n");
            fw.write(str.charAt(0));
            fw.write("\t");
            fw.write(str);
            fw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }
}

위 코드의 결과_txt파일

FileWriter() 생성자에 파일명을 넣어주면 파일이 없을 경우에는 파일을 생성하고 그 안에 작성한다.

파일이 있는 경우에는 동일한 이름의 파일에 작성한다. 콘솔 창에는 아무것도 뜨지 않고, 바로 텍스트 파일에서 확인할 수 있다. 

첫 번째 줄에 '자'는 str.charAt(0)이 작성된 것이다.

두 번째 줄에 str이 작성됐으며 그다음에 \n으로 개행을 해준다.

세 번째 줄에  '자'는 str.charAt(0)이 작성됐고 \t으로 tab을 해주고 str이 작성된 것을 확인할 수 있다.

 


FileReader 클래스

package day09;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class File2 {
    public static void main(String[] args) {
        // FileReader

        char[] arr = new char[50];

        try {
            FileReader fr = new FileReader("input.txt");
            System.out.print((char)fr.read());
            System.out.println();
            System.out.println("------------------------------");
            fr.read(arr);
            for(char c :  arr) {
                System.out.print(c);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

위 코드의 결과 _ console

FileReader도 Writer와 마찬가지로 생성자에 파일 이름을 넘겨주면 동일한 이름의 파일을 찾아 읽어온다. (없을 경우에는 에러!)

먼저 read() 메소드의 경우 int로 값을 반환하기 때문에 형 변환을 해준다. 그것의 결과가 '자'이다. read로 하나의 문자만 읽어온 것을 확인할 수 있다. 그 이후 read() 메소드에 char타입의 배열을 넘겨 하나 씩 읽어와서 담아준다. 그리고  텍스트 파일을 전체를 읽은 것이 아니라 '자' 이후로 읽은 것을 확인할 수 있는데, 이는 '자'를 읽고 포인터가 이동해 다음 것부터 읽었기 때문이다. 그리고 "하자..!" 이후에 네모는 배열 공간이 남아있어서 뜨는 것이다.


 

- PrintWriter 클래스

문자열을 출력하는 스트림인 Writer 속성을 가진 클래스이다.

OutputStream의 자식 클래스이며, byte 단위 출력 클래스인 PrintStream의 print 메소드를 모두 구현하여 사용할 수 있다.

 

PrintWriter pw = new PrintWriter(OutputStream 객체)

 

print() 메소드 : boolean, int, char, float, double 등등의 데이터 형을  String으로 변환해서 쓰지 않고 직접 입력한다.

println() 메소드 : print와 동일하나 끝에 개행을 해준다.

 

 

 

✔️ 절대 경로

물리적인 전체 경로

ex) D:\Biblia\Java\Day09\Day09.txt

 

 

✔️ 상대 경로

현재 동작하고 있는 파일을 중심으로 상대적인 경로

ex) Day09.txt, 디렉토리명/Day09.txt , ../Day09.txt

 


PrintWriter, Scanner 사용해서 파일 입출력 해보기!

 

 

PrintWriter  클래스

package day09;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;

public class File4 {
    public static void main(String[] args) {
        String file = "input1.txt";

        String[] arr = {
                "김사과",
                "오렌지",
                "반하나",
                "이메론"
        };


            try {
                PrintWriter pw = new PrintWriter(new FileOutputStream(file));
                for(int i = 0; i < arr.length; i++) {
                    pw.print(arr[i] + " ");
                }
                pw.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }


    }
}

 

위 코드의 결과_ txt파일

PrintWriter 생성자에 익명 클래스 형태로 FileOutputStream()을 넘기고 파일 이름을 넘겨준다. 파일이 없으면 파일을 만들어서 작성하고, 파일이 있으면 동일한 이름의 파일을 찾아 작성한다. 그리고 PrintWriter클래스는 print() 메소드를 사용하고, 작성이 끝나면 close() 메소드로 닫아주어야 작성이 완료된다.

 


Scanner를 이용해서 파일 읽기

package day09;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class File3 {
    public static void main(String[] args) {
        String file = "input1.txt";

        try {
            Scanner sc = new Scanner(new FileInputStream(file));

            while(sc.hasNext()) {
                String str = sc.nextLine();
                System.out.println(str);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

위 코드의 결과 _console

위의 PrintWriter처럼 생성자에 FileInputStream을 넘겨준다. 그리고 파일이름 넘겨 파일을 찾아서, 읽어온다.

hasNextLine은 다음 문장이 있는지 없는 지를 확인하고 있으면 nextLine()으로 읽어온다. 그리고 읽어온 값을 str문자열에 담고, 이를 출력해준 결과이다.

 


+)  StringBuilder 클래스

String 클래스와 동일하게 문자열을 다루는 클래스이다.

String 클래스는 문자열을 인스턴스로 생성하고 나면 인스턴스가 가진 문자열을 변경하지 못하는 불변 객체라는 단점을 가지고 있다. 이를 보완하기 위한 클래스이다.

 

StringBuilder : 같은 인스턴스 안의 문자열 필드 값을 추가하거나 변경할 수 있도록 해준다.

 

StringBuilder 참조변수 = new StringBuilder("문자열");
참조변수.append("문자열").append("문자열") ...            
// 문자열 더하기, heap에 계속 생성해서 만드는 것이 아니라 값을 변경함

 


과제👀
    1. "product.txt" 에서 데이터를 읽어 product 객체에 각각 데이터를 저장하고 ArrayList에 담아
    출력하는 프로그램을 작성해보자.

    product.txt 내용 (product 클래스)
    갤럭시노트,1200000,삼성
    아이버드,130000,삼성
    그램노트북,1000000,엘지
    60인치 TV,3000000,소니
    맥북프로,1800000,애플

 

Product 클래스

package Assignment;

public class Product {
    private String name;
    private int price;
    private String brand;

    Product() { }
    public Product(String name, int price, String brand) {
        this.name = name;
        this.price = price;
        this.brand = brand;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    @Override
    public String toString() {
        return "상품명 : " + name +
                ", 가격 : " + price +
                ", 브랜드 : " + brand ;
    }
}

 

 

메인메소드

package Assignment;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;

public class ProductRead {
    public static void main(String[] args) {
        ArrayList<Product> products = new ArrayList<>();


        try {
            Scanner sc = new Scanner(new FileInputStream("product.txt"));
            while(sc.hasNextLine()) {
                String[] get = sc.nextLine().split(",");
                String name = get[0];
                int price = Integer.parseInt(get[1]);
                String brand = get[2];

                Product product = new Product(name,price,brand);
                products.add(product);
            }

            for(int i= 0; i < products.size(); i++) {
                System.out.println(products.get(i));
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }


    }
}

위 코드의 결과

 

위의 과제에 나와있는 product.txt을 만들고 그 안에 물품 리스트를 넣는다. 이를 읽어오는 것이다.

물품 리스트는 ", "로 이름, 가격, 브랜드가 나누어져 있기 때문에 split() 메소드로 나누고, 각 각 배열에 저장해준다. 

그리고 Product 타입의 ArrayList에 넣어주고 이를 출력해준다.

복사했습니다!