시스템은 정형화된 데이터를 저장하기위한 방식을 중요시하는데요. 보통 정형화 데이터는 테이블 형식으로 저장하는데 파일에서도 데이터를 정형화해서 넣기 위해 ObjectOutputStream이 사용됩니다.
그리고 중요한 점은 ObjectOutputStream에서 사용되는 객체는 Serializable 인터페이스를 구현하고 있어야합니다!
public class Member implements Serializable{}
Object타입을 파일에 쓰거나 파일에서 읽어오고싶을 때 Serializable 인터페이스를 구현하는 클래스로 선언하면 돼요. 구현해야할 추상메소드는 없어서 implements만 추가하면 끝입니다
OutputStream out=null;
ObjectOutputStream oout=null;
try {
out=new FileOutputStream("temp/member.txt");
oout=new ObjectOutputStream(out);
Member m1=new Member(1, "root", "root123");
oout.writeObject(m1);
System.out.println("파일 저장 성공!");
} catch (Exception e) {
e.printStackTrace();
}finally {
ry {
oout.close();
} catch (IOException e) {
e.printStackTrace();
}
}
filnally에서 리소스(oout)를 해제할때는 최종적으로 생성된 리소스만 해제하면 그 리소스가 사용하고 있던 다른 리소스(out)도 순차적으로 해제됩니다!
그리고 데이터를 가지고올 때도 ObjectInputStream을 사용하는데요
InputStream in=null;
ObjectInputStream oin=null;
try {
in=new FileInputStream("temp/member.txt");
oin=new ObjectInputStream(in);
List<Member> list = new ArrayList<Member>();
while(true) {
try {
Member m=(Member)oin.readObject();
list.add(m);
}catch(EOFException e) { //end of file
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
oin.close();
} catch (IOException e) {
e.printStackTrace();
}
}
object타입으로 데이터를 넣었으니 데이터를 가져올땐 형변환을 해야합니다.
그럼 그냥 처음부터 클래스 타입으로 넣으면 되는게 아닐까? 하지만 읽고 쓸때 쓸 수 있는 기능이 한정적이거든요.
object의 기능인 readObject와 writeObject를 잘 쓰기위해서 Object로 데이터를 저장하고 꺼내오는 것입니다. 클래스를 만든 이유는 자료를 구분하기 위해서일뿐이에요 그래서 저장하고 가져올땐 모든 클래스의 상위클래스인 Object를 쓰는겁니다
반복문으로 파일을 가져오다가 파일의 끝을 만나면 오류가 생겨요! 그래서 파일이 끝났을 때의 오류를 catch하는 예외처리를 해주었습니다.
파일(txt,doc,mp4,jpg,png 기타등등)객체의 디렉토리(폴더)객체를 다루기 위한 클래스입니다.
new File();
메모리(Heap)에 File클래스의 인스턴스를 생성해서 사용하는데요 실제 하드디스크에 있는 물리적인 파일이나 폴더를 생성하는건 아닙니다. 실제 파일과 폴더를 만들려면 File클래스의 메소드를 호출해야해요
. : 현재 디렉토리.. : 상대 디렉토리경로 속 디렉토리를 연결해주는 \는 운영체제마다 다른 기호로 사용되는데요. Java에는 File.separator라는 변수를 제공하고있어서 운영체제에 맞는 파일 구분자를 저장해줍니다.
\ 사용/ 사용TEST_DIR="C:"+File.separator+"Study"+File.separator+"test";
저는 윈도우라서 절대경로가 C:\Study\test 라고 출력되네요
File f=new File(TEST_DIR);
if(!f.exists()) { //파일, 폴더가 없는 경우
System.out.println("폴더가 없습니다");
if(f.mkdir()) {
System.out.println("폴더 생성 성공");
}else {
System.out.println("폴더 생성 실패");
}
}else {
System.out.println("폴더가 존재합니다");
}
파일이나 폴더가 존재하면 true, 없으면 false를 리턴합니다.
지정한 경로의 디렉토리를 하나를 생성하는 메소드입니다. 디렉토리를 생성하면 true, 실패하면 false를 반환해요.
지정한 경로의 파일을 생성하는 메소드입니다. 파일을 생성하면 true, 실패하면 false를 반환해요.
파일이나 디렉토리의 이름을 변경시켜주는 메소드입니다. 매개변수는 File 변수기때문에 변경하고싶은 이름을 가진 File 변수를 생성해줘야 합니다. 이름을 변경하면 true, 실패하면 false를 반환해요.
지정한 경로의 파일, 디렉토리를 삭제하는 메소드입니다.
현재 디렉토리(current working directory) 정보 확인하는 방법
:
System.getProperty("user.dir")
String cwd=System.getProperty("user.dir");
System.out.println("CWD:"+cwd);
File f=new File(cwd);
System.out.println("이름:"+f.getName());
System.out.println("경로:"+f.getPath());
System.out.println("절대경로:"+f.getAbsolutePath());
System.out.println("디렉토리인가요?"+f.isDirectory());
System.out.println("파일인가요?"+f.isFile());
File[] list=f.listFiles();
for(File file:list) {
if(file.isDirectory()) {
System.out.println("<DIR>\t");
}else {
System.out.println("<FILE>\t");
}
System.out.println(file.getName()+"\t");
System.out.println(file.length()+"bytes");
}
현재 파일이나 디렉토리의 이름을 리턴합니다.
현재 경로를 반환하는데 File 객체를 생성할 때 절대경로로 생성했다면 절대경로로 알려주고 상대경로로 생성했으면 상대경로로 반환합니다.
현재 경로의 절대경로를 리턴합니다.
File객체가 디렉토리면 true를 반환합니다.
File객체가 파일이면 true를 반환합니다.
폴더(디렉토리)의 내용을 확인할 수 있습니다. File[] 배열로 쓸 수 있어요!
디렉토리의 용량을 알려줍니다.
tip💡
"
\t" : 문자열에서 tap 키 . tap의 의미가 아닌\t~을 쓰고싶으면\\t로 써야합니다.