관리 메뉴

드럼치는 프로그래머

[JAVA] 자바 입출력 본문

★─Programing/☆─JAVA

[JAVA] 자바 입출력

드럼치는한동이 2007. 11. 5. 10:22

1. 파일과 디렉토리 관리

가. 추상 경로명(abstract pathname)

UNIX 플랫폼 또는 Win32 플랫폼 등과 같은 각 운영체제는 파일과 디렉토리 이름에 시스템 의존적인 경로명(system-dependent pathname)의 문자열을 사용합니다. 이는 프로그램 개발자로 하여금 시스템에 일일이 신경쓰도록 해야 하고, 프로그램의 이식성 또는 상호호환성을 어렵게 하는 원인 중의 하나가 됩니다. 이러한 문제를 해결하기 위해, 다시 말해서 플랫폼 독립적인 파일 또는 디렉토리 관리 기능을 제공하기 위해, 자바에서는 File 클래스를 제공해 주고 있으며, 이 클래스는 추상적이고 시스템(플랫폼) 독립적인 관점의 계층적인 경로명을 제공하고 있습니다. 이러한 추상 경로명은 다음과 같은 두 가지 요소로 구성되어 있습니다.

            - 플랫폼 의존적인 prefix 문자열: UNIX 플랫폼 상에서의 루트 디렉토리를 나타내는 "/", 그리고 Win32 플랫폼 상에서는 디스크 드라이브명(disk-drive specifier) 또는 UNC 경로명을 사용할 경우에 사용하는 "\\" 등이 있습니다.

            - 파일 또는 디렉토리를 나타내는 경로명: 이름을 나타내는 0개 이상의 문자열입니다.

prefix 개념은 UNIX 플랫폼상에서의 루트 디렉토리와 Win32 플랫폼 상에서의 드라이브명(drive specifiers), 루트 디렉토리, 그리고 UNC 경로명을 다루기 위해 사용됩니다. 예를 들면, 다음과 같습니다.

            - UNIX 플랫폼: 절대 경로명의 prefix는 항상 "/"이고, 상대 경로명은 prefix를 갖지 않습니다. 이 때, 루트 디렉토리에 대한 자바의 추상 경로명은 prefix "/"와 빈 이름열(name sequence)을 갖습니다.

"/"

"/home/ywpark/"

            - Win32 플랫폼: 경로명의 prefix는 드라이브 문자와 ":"로 구성된 드라이브명(drive specifier)과 절대 경로명일 경우 "\" 등을 포함합니다. UNC 경로명의 prefix는 "\\"이고, 호스트이름과 공유 이름은 이름열의 처음에 나타나는 두 개의 이름입니다. 드라이브를 갖지 않는 상대 경로명은 prefix가 없습니다.

"\\D:\ "

"\\Park\mp3z"

추상 경로명 내의 마지막 이름을 제외한 각 이름은 디렉토리를 의미하고, 마지막 이름은 디렉토리 이름일 수도 있고 파일 이름일 수도 있습니다. 경로명 문자열을 추상 경로명으로 변환하거나 또는 추상 경로명으로부터 경로명 문자열로 변환하는 것은 시스템에 의존적입니다.

추상 경로명 또는 문자열 형태의 경로명은 절대 경로일 수도 있고 상대 경로일 수도 있습니다. 절대 경로명은 파일의 완전한 위치를 나타내므로 더 이상의 정보가 필요 업습니다. 반면, 반면, 상대 경로명이 가리키고 있는 파일은 다른 경로명에서 얻은 정보를 이용하여 그 위치를 얻을 수 있습니다. 일반적으로, java.io 패키지 내에 있는 클래스들은 항상 시스템 속성인 user.dir이 가지고 있는 현재 사용자 디렉토리(current user directory)로부터 상대 경로명을 얻습니다. 일반적으로, 현재 사용자 디렉토리는 자바 가상 머신이 시작된(invoked) 디렉토리입니다.

추상 경로명이 경로명 문자열로 변환될 때, 각 이름은 디폴트 구분자 문자를 이용하여  서로 구분됩니다. 디폴트 이름 구분자 문자(name-separator character)는 시스템 속성으로 file.separator에 정의되어 있습니다. 반면, 경로명 문자열이 추상 경로명으로 변환될 때, 경로명 내의 이름들은 디폴트 이름 구분자 문자 또는 시스템에 의해 지원되는 다른 이름 구분자 문자 등에 의해 구분되어 있습니다.

나. File 클래스

File 클래스는 파일 및 디렉토리를 관리할 수 있도록 기능을 제공해 주는 클래스입니다. File 클래스는 파일의 복사 또는 이름 변경 등의 조작을 할 경우에 사용될 뿐, 파일의 내용을 입출력 하기 위한 메소드를 제공해 주지는 않습니다. 자바에서는 모든 데이터의 입출력을 스트림에 기반하여 수행하므로, File 클래스 내부적으로 이러한 메소드를 구현할 필요가 없기 때문입니다. 입출력 스트림과 관련된 내용은 뒤에서 자세히 살펴보도록 하겠습니다. 그런데, 이러한 File 클래스의 인스턴스는 변경 불가능합니다. 다시 말해서, 한 번 생성되면, File 객체에 의해 표현되는 추상 경로명은 절대로 변하지 않습니다. File 클래스에는 다음과 같은 종류의 경로 구분자와 이름 구분자를 제공해 주고 있습니다.

            - static char separatorChar: 시스템에 해당하는 디폴트 이름 구분 문자로서, 시스템 속성인 file.separator의 값을 갖습니다.

UNIX 시스템: '/'

Win32 시스템: '\'

            - public static final String separator: 시스템에 해당하는 디폴트 이름 구분 문자(name-separator character)로서, 편의상 문자열로 표현되어 있습니다.

UNIX 시스템: "/"

Win32 시스템: "\"

            - public static final char pathSeparatorChar: 시스템에 해당하는 경로 구분 문자로서, 시스템 속성인 path.separator의 값을 갖습니다.

UNIX 시스템: ':'

Win32 시스템: ';'

            - public static final String pathSeparator: 시스템에 해당하는 경로 구분 문자(path-separator character)로서, 편의상 문자열로 표현되어 있습니다.

UNIX 시스템: ":"

Win32 시스템: ";"

File 클래스에는 다음과 같은 세 종류의 생성자가 있습니다. 각각에 대하여 간단히 살펴보도록 하겠습니다.

            - public File(String pathname): 주어진 경로명을 추상 경로명으로 변환하여 새로운 File 객체를 생성합니다. 만약, 주어진 문자열이 빈 문자열이라면, 빈 추상 경로명이 됩니다.

            - public File(String parent, String child): 두 개의 문자열에 주어진 경로명을 이용하여 새로운 File 객체를 생성합니다. parent 문자열이 null이면, child 문자열을 경로명으로 하는 객체를 생성하고, 그렇지 않을 경우 parent 문자열은 디렉토리를 나타내고, child 문자열은 디렉토리 또는 파일일 수 있습니다.

            - public File(File parent, String child): 주어진 File 객체와 문자열을 이용하여 새로운 File 객체를 생성합니다. parent 객체가 null이면, child 문자열을 경로명으로 하는 객체를 생성하고, 그렇지 않을 경우 parent 객체는 디렉토리를 나타내고, child 문자열은 디렉토리 또는 파일일 수 있습니다.

File 클래스에서 제공해주는 주요 메소드를 살펴보면, 다음과 같습니다.

            - public String getName(): 추상 경로명이 나타내는 파일 또는 디렉토리의 이름을 얻습니다. 이 이름은 경로명 이름에 있는 마지막 이름입니다.

            - public String getParent(): 추상 경로명의 부모 경로에 대한 경로명을 문자열로 얻습니다. 이 때, 부모 경로명은 추상 경로명이 갖는 prefix와 경로명에 있는 마지막 이름을 제외한 나머지 이름들을 포함하고 있습니다.

            - public File getParentFile(): 추상 경로명의 부모 경로에 대한 추상 경로명(File 객체)을 얻습니다. 이 때, 부모 경로명은 추상 경로명이 갖는 prefix와 경로명에 있는 마지막 이름을 제외한 나머지 이름들을 포함하고 있습니다.

            - public String getPath(): 추상 경로명을 경로명 문자열로 변환하여 얻습니다. 이 때, 디폴트 이름 구분 문자가 적용됩니다.

            - public boolean isAbsolute(): 절대 경로명인지를 얻습니다. UNIX 시스템 상에서는 prefix가 "/"를 포함하고 있을 경우, Win32 시스템 상에서는 prefix가 "\\"와 드라이브 문자 또는 "\\"를 포함하고 있을 경우 절대 경로명입니다.

            - public String getAbsolutePath(): 추상 경로명에 대한 절대 경로명을 문자열로 얻습니다. UNIX 시스템 상에서 상대 경로명일 경우, 현재 사용자 디렉토리와 결합하여 절대 경로명을 얻습니다. Win32 시스템 상에서의 상대 경로명은 드라이브 문자를 포함하여, UNIX 시스템과 마찬가지로 현재 사용자 디렉토리와 결합하여 얻습니다.

            - public File getAbsoluteFile(): "new File(this.getAbsolutePath()())"와 같습니다.

            - public String getCanonicalPath() throws IOException: 추상 경로명에 대한 유일한 정규 표현 경로명을 얻습니다.

            - public File getCanonicalFile() throws IOException: "new File(this.getCanonicalPath()())"와 같은 효과를 얻습니다.

            - public URL toURL() throws MalformedURLException: 추상 경로명을 URL로 변환하여 얻습니다.

            - public boolean canRead(): 파일이 읽기 가능한지를 얻습니다.

            - public boolean canWrite(): 파일이 쓰기 가능한지를 얻습니다.

            - public boolean exists(): 파일이 존재하는지를 얻습니다.

            - public boolean isDirectory(): 디렉토리인지를 얻습니다.

            - public boolean isFile(): 파일인지를 얻습니다.

            - public boolean isHidden(): 숨겨진(hidden) 파일인지를 얻습니다.

            - public long lastModified(): 파일이 마지막으로 갱신된 시간을 얻습니다.  시간은 epoch (00:00:00 GMT, January 1, 1970)로부터 경과된 밀리초를 나타내며, 값이 0L이면 파일이 존재하지 않거나 I/O 에러가 발생했음을 나타냅니다.

            - public long length(): 파일의 크기를 얻습니다.

            - public boolean createNewFile() throws IOException: 추상 경로명에 해당하는 파일이 존재하지 않는 경우 비어있는 새로운 파일을 생성합니다.

            - public boolean delete(): 추상 경로명이 가리키는 파일이나 디렉토리를 삭제합니다. 이 때, 비어있지 않은 디렉토리는 삭제할 수 없습니다.

            - public void deleteOnExit(): 가상 머신이 종료될 때, 이 추상 경로명이 나타내는 파일을 삭제되도록 요청합니다. 이 메소드에 의해 파일이 지워지도록 요청되면, 이 요청은 취소될 수 없을므로, 주의를 기울여서 사용해야 합니다.

            - public String[] list(): 추상 경로명이 나타내는 디렉토리 내의 파일과 디렉토리의 이름에 대한 문자열 배열을 얻습니다.

            - public File[] listFiles(): 추상 경로명이 나타내는 디렉토리 내의 파일과 디렉토리의 이름에 대한 File 객체 배열을 얻습니다.

            - public boolean mkdir(): 이 추상 경로명에 해당하는 디렉토리를 생성합니다.

            - public boolean mkdirs(): 이 추상 경로명에 해당하는 디렉토리를 생성가능한지를 얻습니다. 만약, 경로명의 부모 경로명이 존재하지 않을 경우도 고려됩니다.

Comments