오늘의 코드
절대 경로 : 루트부터 파일의 위치까지 전체 이름
상대 경로 : 현재 작업 디렉토리를 기준으로 파일의 위치를 표시
package edu.java.file08;
import java.io.File;
// File 클래스 :
// 파일(txt, doc, mp4, jpg, png, ..) 객체와
// 디렉토리(폴더) 객체를 다루기 위한 클래스
// File 클래스의 인스턴스 생성 : new File();
// 메모리(힙)에 File 클래스의 인스턴스를 생성한다는 의미
// 실제 하드디스크에 있는 물리적인 파일/폴더(디렉토리)를 생성하는 것은 아님
// 실제 파일/폴더를 만들기 위해서는 File 클래스의 메소드를 호출해야 함
// 파일(디렉토리)의 경로 : 절대 경로, 상대 경로
// 절대 경로 : 루트(C:\, D:\)부터 파일(폴더)의 위치까지 전체 이름
// (예) C:\Users\sdedu\git\JavaStudy\Java17_File\temp
// 상대 경로 : 현재 작업 디렉토리를 기준으로 파일(폴더)의 위치를 표시
// (예) temp\test.txt
// . : 현재 디렉토리(폴더)
// .. : 상위 디렉토리(폴더)
// 파일 구분자(file separator) - 운영체제(OS)마다 다르게 사용
// MS Windows - \ 사용 ==> 아레과 같은 의미
// Unix, Linux, Android, ... - / 사용
// 자바에는 File.separator 변수를 제공
public class FileMain08 {
public static final String TEST_DIR1 = "C:\\test1";
public static final String TEST_DIR2 = "test2"; // 상대 경로
public static final String TEST_DIR3 = "C:" + File.separator + "Study" + File.separator + "test3";
public static void main(String[] args) {
System.out.println(TEST_DIR1);
System.out.println(TEST_DIR2);
System.out.println(TEST_DIR3);
File f = new File(TEST_DIR3); // 파일, 폴더를 다루기 위한 객체
// exists() : 파일, 폴더가 존재하는지(true), 아닌지(false)를 리턴
if(!f.exists()) { // 파일, 폴더가 없는 경우
System.out.println("폴더가 없습니다.");
// mkdir() : 디렉토리를 생성하는 메소드, 성공하면 true, 실패하면 false
// mkdirs() : 상위디렉토리를 포함하여 생성하는 메소드.
if(f.mkdirs()) {
System.out.println("폴더 생성 성공");
} else {
System.out.println("폴더 생성 실패");
}
} else { // 파일, 폴더가 있는 경우
System.out.println("폴더가 이미 존재합니다.");
}
} // end main()
} // end FileMain08
package edu.java.file09;
import java.io.File;
import java.io.IOException;
public class FileMain09 {
public static final String DIR_NAME = "test1";
public static final String FILE_NAME = "dummy.txt";
public static final String FILE_PATH =
DIR_NAME + File.separator + FILE_NAME;
public static void main(String[] args) {
System.out.println(FILE_PATH);
File f = new File(FILE_PATH);
if(!f.exists()) {
System.out.println("파일이 없습니다.");
// createNewFile() : 새로운 빈 파일을 생성
try {
if(f.createNewFile()) {
System.out.println("파일 생성 성공");
} else {
System.out.println("파일 생성 실패");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
System.out.println("파일이 이미 존재합니다.");
}
} // end main()
} // end FileMain09
package edu.java.file10;
import java.io.File;
public class FileMain10 {
public static final String TEST1 = "test1";
public static final String TEST2 = "test2";
public static final String DUMMY = "dummy.txt";
public static void main(String[] args) {
// 파일, 디렉토리 이름 변경/삭제
// test1 -> test2 디렉토리 이름 변경
File org = new File(TEST1);
File dest = new File(TEST2);
if(org.renameTo(dest)) {
System.out.println("디렉토리 이름 변경 성공");
} else {
System.out.println("디렉토리 이름 변경 실패");
}
// test2\dummy.txt 파일 삭제
String filePath = TEST2 + File.separator + DUMMY;
File file = new File(filePath);
if(file.delete()) {
System.out.println("파일 삭제 성공");
} else {
System.out.println("파일 삭제 실패");
}
} // end main()
} // FileMain10
package edu.java.file11;
import java.io.File;
public class FileMain11 {
public static void main(String[] args) {
// 현재 디렉토리(current working directory) 정보 확인
String cwd = System.getProperty("user.dir");
System.out.println("CWD : " + cwd);
// 현재 디렉토리에 대한 File 객체
File f = new File(cwd);
// getName() : 파일, 디렉토리의 이름 리턴
System.out.println("이름 : " + f.getName());
// getPath() : 경로를 리턴
// File 객체를 생성할 때
// 1) 절대 경로로 생성했으면, 절대 경로로 이름을 리턴
// 2) 상대 경로로 생성했으면, 상대 경로로 이름을 리턴
System.out.println("경로 : " + f.getPath());
// getAbsolutePath() : 절대 경로를 리턴
System.out.println("절대 경로 : " + f.getAbsolutePath());
// isDirectory() : File 객체가 디렉토리이면 true를 리턴
// isFile() : File 객체가 파일이면 true를 리턴
System.out.println("디렉토리? : " + f.isDirectory());
System.out.println("파일? : " + f.isFile());
// listFiles() : 폴더(디렉토리)의 내용 확인
File[] list = f.listFiles();
for(File file : list) {
if(file.isDirectory()) {
System.out.print("<DIR>\t");
} else {
System.out.print("<FILE>\t");
}
System.out.print(file.getName() + "\t");
System.out.println(file.length() + "Bytes");
}
} // end main()
} // end FileMain10
오늘의 코드 바꾼것
package edu.java.contact04;
import java.io.*;
import java.util.*;
public class ContactDAOImple implements ContactDAO {
// 1. private static 자기 자신 타입의 변수 선언
private static ContactDAOImple instance = null;
// 2. private 생성자
private ContactDAOImple() {
initDataDir();
initDataFile();
}
// 3. public static 메소드 - 인스턴스를 리턴하는 메소드 구현
public static ContactDAOImple getInstance() {
if (instance == null) {
instance = new ContactDAOImple();
}
return instance;
}
// 파일 연동을 위해 사용
private ArrayList<ContactDTO> list = new ArrayList<>(); // 연락처 정보를 저장할 배열
// 데이터를 저장할 폴더와 파일 이름 정의
private static final String DATA_DIR = "data";
private static final String DATA_FILE = "contact.data";
// data 폴더의 contact.data 파일을 관리할 File 객체 선언
private File dataDir; // mkdir() : 디렉토리를 생성하는 메소드, 성공하면 true, 실패하면 false
private File dataFile;
// TODO : data 폴더가 있는지 검사하고, 없으면 생성하는 함수
private void initDataDir() {
dataDir = new File(DATA_DIR);
if (!dataDir.exists()) { // 폴더가 없으면
System.out.println("폴더가 없습니다.");
// mkdir() : 디렉토리를 생성하는 메소드, 성공하면 true, 실패하면 false
// mkdirs() : 상위디렉토리를 포함하여 생성하는 메소드.
if (dataDir.mkdirs()) {
System.out.println("폴더 생성 성공");
} else {
System.out.println("폴더 생성 실패");
}
} else { // 파일, 폴더가 있는 경우
System.out.println("폴더가 이미 존재합니다.");
}
} // end initDataDir()
// TODO : 데이터 파일이 존재하는지 검사하고,
// 없는 경우 - 새로운 데이터 파일 생성
// 있는 경우 - 기존 파일에서 데이터를 읽어서 ArrayList에 추가
private void initDataFile() {
String filePath = DATA_DIR + File.separator + DATA_FILE;
dataFile = new File(filePath);
if (!dataFile.exists()) {
System.out.println("파일이 없습니다.");
// createNewFile() : 새로운 빈 파일을 생성
try {
if (dataFile.createNewFile()) {
System.out.println("파일 생성 성공");
} else {
System.out.println("파일 생성 실패");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
System.out.println("파일이 이미 존재합니다.");
readDataFromFile();
}
} // end initDataFile()
// TODO : 멤버 변수 list 객체를 data\contact.data 파일에 저장(쓰기)
private void writeDataToFile() {
System.out.println("ArrayList<ContactDTO> 객체를 파일에 저장하는 코드");
OutputStream out = null;
BufferedOutputStream bout = null;
ObjectOutputStream oout = null;
try {
out = new FileOutputStream(dataFile);
bout = new BufferedOutputStream(out);
oout = new ObjectOutputStream(bout);
oout.writeObject(list);
System.out.println("데이터 저장 완료");
} catch (Exception e) {
e.toString();
} finally {
try {
oout.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} // end wrtieDataToFile()
// TODO : data\contact.data 파일에서 ArrayList 객체를 읽어와서
// 멤버 변수 list에 저장(읽기)
private void readDataFromFile() {
System.out.println("readDataFromFile()");
InputStream in = null;
BufferedInputStream bin = null;
ObjectInputStream oin = null;
try {
System.out.println("try 내부");
in = new FileInputStream(dataFile);
bin = new BufferedInputStream(in);
oin = new ObjectInputStream(bin);
list = (ArrayList<ContactDTO>) oin.readObject();
System.out.println("데이터 불러옴");
} catch (Exception e) {
System.out.println(e.toString());
} finally {
try {
oin.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} // end readDataFromFile()
public int getCount() {
return list.size();
}
@Override
public int insert(ContactDTO dto) {
System.out.println("insert()"); // 로그 찍기
System.out.println("dto = " + dto);
list.add(dto);
writeDataToFile();
return 1; // 0 : 실패, 1 : 성공
}
@Override
public ArrayList<ContactDTO> select() {
return list;
}
@Override
public ContactDTO select(int index) {
return list.get(index);
}
@Override
public int update(int index, ContactDTO dto) {
list.set(index, dto);
writeDataToFile();
return 1;
}
@Override
public int delete(int index) {
list.remove(index);
return 1;
}
}