[I/O] File, 경로

포키·2023년 1월 12일
0

국비과정

목록 보기
40/73

I/O 입출력

  • java.io
  • 사용 빈도 매우 높음, 모든 곳에서 입출력 기능 사용!
    (대표적으로 우리가 사용해왔던 println())
  • 성능에 직결
    속도 & 다양성 (입출력 처리에 따라 프로그램의 성능이 많이 좌우됨)

목적

  1. I/O 원리 이해 - 성능 직결
  2. File 컨트롤 - 더이상 휘발성의 정보만을 사용하지 않음
    -> 사용자가 파일을 직접 컨트롤하다가, 나중에는 DB 파일을 통해 CRUD 하게 됨

File

  • File : 파일(Some.java) / 경로(directory)

    경로란 자바의 패키지와 같다. 실제로 존재하지 않으나 (=디스크 상에 존재하지 않음) 파일 객체를 구분하는데 사용되는 논리적 식별자다.

  • File 객체는 파일의 데이터를 들고있는게 아니라 디스크 상의 파일을 참조하는 기능을 함.

  • 파일의 종류
    물리적 파일 : 실제로 디스크 상에 존재하는 파일
    논리적 파일 : 실제 디스크에는 존재하지 않음

  • 주소를 찾아갔을 때 파일이 있으면 물리적 파일, 없으면 (자바 코드에서 만든) 논리적 파일
  • 파일 삭제?

파일을 삭제하는 행위는 사실 디스크 상의 데이터를 삭제하지 않는다. 데이터에 대한 참조를 끊는다는 것이 정확한 표현. (참조변수에 null을 대입하는 것과 같은 행위)
디스크 상의 실제 데이터는 우연히 덮어쓰기 되지 않는 이상 사라지지 않음!

  • 리눅스에서는 모든 것이 파일. 즉 디렉토리도 파일.
    운영체제 제약없는 자바이므로 자연히 자바의 File 클래스에도 경로(directory)가 존재하게 되었다.
  • URI (Uniform Resource Identifier)

자원을 구분할 수 있는 통합식별자
URL(Uniform Resource Locator: 정형화 된 리소스 위치표시)을 포함하는 개념
참고

File 생성자

  • File(path) : 경로를 한 번에 넣어 생성
  • File(parent, name) : 경로를 parent와 name으로 나눠넣어 생성
		// c:\some\text.txt
		File f1 = new File("c:\\some\\test.txt");
		File f2 = new File("c:\\some", "test.txt");
		File dir = new File("c:\\some");
		File f3 = new File(dir, "text.txt");
  • c:\text\some\abc.txt : path
  • c:\text\some\ : parent + abc.txt : name

File 메서드

  • exists() : 객체가 물리적으로 존재하는지 확인 (return : boolean)

    파일과 디렉토리를 구분하기 전에 exists()로 물리적 파일이 존재하는지 먼저 확인해야 한다.

  • isFile() : 객체가 파일인지 확인 (return : boolean)

  • isDirectory() : 객체가 디렉토리인지 확인 (return : boolean)

  • 운영체제에 생성/제거 요청할 때는 권한이 필요 -> 없으면 IOException 발생
if(f.exists()) {
	try {
		// 파일을 디스크에 생성
		f.createNewFile();
		// 파일 생성은 '운영체제'가 하는 것! 
		// createNewFile() 은 운영체제에 파일 생성을 요청한다.
		// 권한이 없을 경우 에러 발생 ->  IOException을 대비한 try~catch문 작성
	} catch(IOException e) {
		e.printStackTrace();
	}
}
  • createNewFile() : 객체를 실제 물리적 파일로 생성

  • mkdir() : 객체를 실제 디렉토리로 생성

  • mkdirs() : 객체를 실제 디렉토리로 생성 (경로에 포함된 모든 실재하지 않는 디렉토리도 함께 생성)

  • delete() : 객체를 물리적으로 제거 (디렉토리는 비어있을 때만 삭제 가능)

  • length() : 파일 객체의 용량 반환 (return : long)

    int가 아닌 long 값 반환됨에 주의

  • getPath() : 객체의 경로 반환

  • getParent() : 경로 중 parent 반환

  • getName() : 파일의 이름 반환

  • canRead() : 파일의 읽기권한 확인

  • canWrite() : 파일의 쓰기권한 확인

  • canExecute() : 파일의 실행권한 확인

  • lastModified() : 마지막으로 수정된 시간 반환 (return : long)

  • lastModified()는 long값을 반환하므로,
    Date클래스와 SimpleDateFormat 클래스를 이용하여 원하는 형식의 String값으로 전환하기
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd a hh:mm");
		Date date = new Date();
		date.setTime(time);
		System.out.println("마지막 수정시간 : " + sdf.format(date));
		String strDate = "2021-11-04 오전 10:50";
		try {
			Date someday = sdf.parse(strDate);
			long target = someday.getTime();
			System.out.println(target);
		} catch (ParseException e) {
			e.printStackTrace();
		}

경로

경로 표시 방법

  1. 절대 경로 (Absolute Path) : 언제나 root로부터 출발하는 경로, 어디서 접근하든 경로가 변하지 않는다.
    ex) c:\first\target.txt
    (root도 변경 가능! 파일 시스템에서는 c드라이브지만 경우에 따라 달라질 수 있다.)
  2. 상대 경로 (Relative Path): 현재 위치에서 출발하는 경로, 접근 위치에 따라 경로가 변한다.
    ex) c:\second 에서 시작 -> ..\first\target.txt
    c:\second\sub 에서 시작 -> ..\..\first\target.txt
  • 대부분의 경우 절대 경로가 유리하지만, 같은 위치 혹은 바로 아래 위치에 있는 파일에서는 상대 경로가 유리하다.
  1. 이상 경로 (Canonical Path) : 절대경로 중 가장 짧은 경로를 의미한다. (자바에만 존재)
  • 이상경로는 주어진 경로를 가장 짧은 절대경로로 바꾸는데, 이 과정에서 경로가 존재하지 않는 위치를 가리키게 된다면 IOException이 발생한다. (참고)
  • 이상 경로 참고

. : 현재 위치
.. : 한 칸 위 위치

경로 메서드

  1. getPath(), getParent() + getName() : 파일 객체를 생성할 때 입력한 경로를 그대로 반환한다. (return : String)
  2. getAbsolutePath() : 파일 객체의 절대 경로를 반환한다. (return : String)
    getAbsoluteFile() : 절대경로를 지닌 파일 객체를 반환한다. (return : File)
  3. getCanonicalPath() : 파일 객체의 이상경로(최단거리 절대경로)를 반환한다. (return : String)
    getCanonicalFile() : 이상경로를 지닌 파일 객체를 반환한다. (return : File)
profile
welcome

0개의 댓글