본문 바로가기

Java

[Java] 입출력(IO) File, 직렬화(Serialization)

 

File 클래스

 

파일 자체를 관리하는 클래스이다. 파일의 정보를 가져오고 수정하고, 생성, 삭제를 하는 메서드를 제공한다.

 

파일 객체 생성

File file = new File("C:\\java\\abc.txt");

C드라이브 java디렉토리 안에 abc.txt에 대한 File 객체를 생성

 

파일과 디렉토리 정보 가져오기

메서드 내용
boolean exsists() 파일/디렉토리가 있으면 true, 없으면 false 리턴
boolean isFile() 파일이면 true, 아니면 false 리턴 
boolean isDirectory 디렉토리면 true, 아니면 false 리턴
String getName() 파일의 이름을 반환
String getPath() 파일의 경로를 반환
long size() 파일의 크기를 반환
File[] listFiles 디렉토리 안의 파일목록을 File배열로 반환
boolean createNewFile() 내용이 없는 새로운 파일 생성
boolean mkdir() 디렉토리 생성
boolean delete() 파일을 삭제
  • 예제코드

경로 안에 있는 모든 파일과 디렉토리 리스트 출력

```
public class showFile {
public static void main(String[] args) {
    String path = "C:\\Users\\89201\\java_work\\javaBasic\\src";
    File file = new File(path);

    if(file.exists() && file.isDirectory()) {
        fileList(file);
    }
}

public static void fileList(File file) {

    File list[] = file.listFiles();

    for (int i = 0; i < list.length; i++) {
        if (list[i].isFile()) {
            System.out.println("-" + list[i].getName());
        } else if (list[i].isDirectory()) {
            System.out.println("*" + list[i].getName());
            fileList(list[i]);
        }
    }
}
```

}

 

  • 예제코드 2

경로 안에 있는 모든 디렉토리와 파일을 복사하여 새로운 디렉토리에 생성

CopyUtil.java

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;

public class CopyUtil {
//새로운 디펙토리를 생성하고 그 안에 모든 파일을 복사
    public static void copyDirectory(File source, File dest) throws Exception {
        dest.mkdir();        
        File list[] = source.listFiles();

        for(int i = 0; i < list.length; i++) {
            File sourceFile = list[i];
            if(sourceFile.isDirectory()) {
                File s_destFile = new File(dest, sourceFile.getName());
                copyDirectory(sourceFile, s_destFile);
            } else if(sourceFile.isFile()){
                File destFile = new File(dest, sourceFile.getName());
                copyFile(sourceFile, destFile);        

            }
        }
    }    

    //바이트값을 가진 파일을 복사
    public static void copyFile(File source, File dest) throws Exception {

        FileReader reader = null;
        FileWriter writer = null;
        char arr[] = new char[1000];
        int count = 0;

        reader = new FileReader(source);
        writer = new FileWriter(dest);

        while((count = reader.read(arr)) != -1) {
            writer.write(arr);
        }

        if(reader != null) 
            reader.close();
        if(writer != null)        
            writer.close();

    }
 }

 

Main.java

import java.io.File;
public class Main {
    public static void main(String[] args) {
        // 1.바이트스트림을 이용하여 파일 복사를 구현
        String source = "C:\\Users\\89201\\Desktop\\ddd";
        String dest = "C:\\Users\\89201\\Desktop\\ddd2";

        try {            
            CopyUtil.copyDirectory(new File(source), new File(dest));
            System.out.println("복사완료");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 }

 


 

직렬화(Serialization)

 

직렬화 : 객체를 스트림으로 만드는작업

역직렬화 : 스트림을 객체로 만드는 작업

java.io.Serializable 인터페이스를 구현한 클래스는 직렬화가 가능하고 구현되어 있지 않다면 직렬화가 불가능하다.

생성자, 메서드 , static필드는 직렬화 대상이 아니고 인스턴스 변수는 직렬화의 대상이 된다.

인스턴스 변수 중 직렬화 대상에서 제외하고 싶다면 transient를 앞에 명시해 준다. (ex. password)

 

 

  • 예제 코드

Member.java

import java.io.Serializable;

public class Member implements Serializable {
    private String name;
    private int age;

    public Member() {}
    public Member(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Member [name=" + name + ", age=" + age + "]";
    }
 }

 

SerialMain.java

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class SerialMain {

    Member m;

    //직렬화
    public void write() {
        m = new Member("홍길동", 20);
        ObjectOutputStream oos = null;
        try {
            oos = new ObjectOutputStream(new FileOutputStream("object.ser"));
            oos.writeObject(m);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                oos.close();
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
    }

    //역직렬화
    public void read() {
        ObjectInputStream ois = null;
        try {
            ois = new ObjectInputStream(new FileInputStream("object.ser"));
            m = (Member) ois.readObject();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                ois.close();
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {

        SerialMain se = new SerialMain();

        se.write(); //직렬화
        se.m = null;
        se.read(); //역직렬화

        System.out.println(se.m);
    }
  }

 

'Java' 카테고리의 다른 글

[Java] 쓰레드(Thread) 정리  (0) 2020.07.26
[Java] 정렬(Sort) Comparator, Comparable  (0) 2020.07.24
[Java] 자료구조 List, Set, Map  (0) 2020.07.24
[Java] 입출력(IO) 정리  (0) 2020.07.22
[Java] 정규표현식(Regular Expression)  (0) 2020.07.20