관련글



java.io.File 클래스
File 클래스는 자바 입출력과 관련된 패키지인 java.io 패키지에 속해 있는 클래스이며, 디스크에 존재하는 파일에 대한 정보를 얻거나 파일을 새로 생성하거나 제거하기 위한 기능을 하는 클래스입니다. 그러나 File 클래스는 실제 파일의 내용은 조작할수는 없으며, 파일에 대한 정보 즉 메타 데이터(생성 날짜, 권한, 수정일, 경로, 파일명, 소유자 등)를 다루기 위해 추상화된 클래스라고 볼 수 있습니다.




파일을 추상화한 클래스라고 했는데 추상화라고 표현한 이유는 파일은 파일 시스템에 따라서 다른 의미를 갖기 때문입니다. 파일 시스템이란 파일을 관리하는 체계(또는 방법)을 의미하며, 예를 들어 Windows의 NTFS, 리눅스의 EXT, 유닉스의 UFS 등 운영체제별 사용하는 파일시스템은 여러가지인데, 파일시스템 별로 정의하는 파일의 의미가 다르기 때문입니다. 파일을 생성하고 삭제하는 것도 각 운영체제에서 사용하는 파일 시스템마다 내부 동작이 상이할 것입니다. 반대로 자바는 운영체제에 의존적이지 않고 JVM을 통해 모든 운영체제에서 동작 가능합니다.

따라서 운영체제별로 달라지는 File의 의미를 공통적인 부분만을 빼내어 추상화하여, 자바를 통해 파일을 다루는 프로그램을 개발했을 때 어느 운영체제에서 실행시키더라도 프로그램 수정 없이 구동이 가능하도록 한 것입니다. 


여러 운영체제에서의 파일 개념은 추상화 했다고는 하지만 현실적으로는 운영체제 별로 파일과 관련하여 실행시키면 안되는 메서드들이 존재할 수 있습니다. 예를 들어 Windows의 파일에 대한 권한 시스템과 리눅스 유닉스에서의 파일 권한 시스템이 다르기 때문에 권한과 관련된 메서드는 Windows에서 실행시 정상적으로 동작하지 않을 수 있습니다.




File 클래스 생성자
File 클래스의 생성자는 네 가지 방법으로 오버로딩 되어 있습니다. 운영체제에서 파일 시스템은 트리 구조를 이루고 있고 상위 부모 디렉터리 안에 여러 파일들 및 또 다른 디렉터리가 있는 구조인데 JAVA에서는 디렉터리 또한 파일 목록을 가진 하나의 파일로 다루어 집니다.

생성자
설명
new File(String path)
주어진 문자열 경로를 갖는 File 객체를 생성합니다. 절대 경로 또는 현재 프로그램이 실행되는 위치를 기준으로 하는 상대경로로 지정 가능합니다.
new File(File parent, String child)
미리 생성된 File 객체를 부모로 하는 파일(파일명)을 두번째 문자열 매개변수로 지정하여 File 객체를 생성합니다.
new File(String parent, String child)
부모 파일의 경로와, 그 하위의 파일명을 각각 매개변수로 지정하여 해당 경로를 조합하여 그 위치에 대한 File 객체를 생성합니다.
new File(URI uri)
파일 경로를 객체로 생성한 URI 객체를 기준으로 File 객체를 생성합니다.
URI 클래스는 경로를 관리하기 위한 클래스이고, 이를 이용하여 File 객체를 생성하는 것입니다.



생성자 사용 예시
다음과 같이 개발자가 익숙한 Windows 운영체제를 바탕으로 생성자에 대해 설명해 보도록 하겠습니다. 텍스트 파일이 D:\test\text.txt 경로를 갖는다고 가정합니다.


Windows에서는 디렉터리 경로를 구분할 때 \(역슬래시)를 통해 구분하는데 자바 언어에서는 String에서 역슬래시는 유니코드를 뜻하기 때문에 이스케이프 처리를 위해 역슬래시를 두 번 '\\' 해주어야 역슬래시 하나로 인식된다는 점은 유의합니다.



new File(String path)
디렉터리와 파일명까지 경로를 모두 지정하여 파일 객체를 생성합니다.
File f = new File("D:\\testDir\\test.txt");                                                    
cs


new File(File parent, String child)
자바에서는 디렉터리 또한 단순 파일로 취급합니다. 다만 파일들의 목록을 가지고 있는 파일로 인식합니다. 만약 디렉터리에 관련된 File 객체가 이미 생성된 경우 첫번째 매개변수로 전달하고 그 하위에 있는 파일명을 문자열로 하여 File 객체를 생성할 수 있습니다.
File dir = new File("D:\\testDir");
File file = new File(dir, "test.txt");                                                        
cs


new File(String parent, String child)
첫번째 매개변수에 디렉터리의 경로를 두번째 매개변수에 그 하위 파일명을 지정하여 File 객체를 생성할 수 있습니다.
File file = new File("D:\\testDir""test.txt");                                            
cs


new File(URI uri)
URI 클래스는 자원의 경로를 관리할 수 있는 클래스입니다. 파일의 경로를 지정하여 URI 객체를 만들고 그 객체를 File 클래스의 생성자로 넘겨 File 객체 생성이 가능합니다. URI객체를 생성할때는 경로에 file:// 을 붙여주고 최상위 경로라는 것을 알리기 위해 / (슬래시) 를 붙여줍니다. 따라서 경로 맨 앞에 file:/// 이 붙고 그 뒤에 Windows 형식의 경로를 지정하는데, URI 클래스에서는 역슬래시가 아닌 그냥 슬래시를 디렉터리 구분자로 지정합니다.
URI uri = new URI("file:///D:/testDir/text.txt");                                            
File file = new File(uri);        
cs





File 객체와 디스크에 존재하는 파일과의 관계
지금까지의 예시에서는 실제로 존재하는 디렉터리 및 파일에 대해서 File 객체를 생성했는데, 사실 JVM의 힙공간에 생성된 File 객체는 실제 디스크상에 존재하는 파일의 존재여부는 신경쓰지 않습니다. 다만 JVM에 생성된 File객체의 메서드를 실행하면 JVM은 운영체제에게 해당 메서드에 대한 명령을 전달하는 역할을 할 뿐입니다.

예를 들어 File 클래스에는 exists() 라는 메서드가 존재하는데, 이 메서드는 현재 File 객체에 지정된 실제 경로에 파일이나 디렉터리가 존재하는지 여부를 판단하기 위한 메서드입니다. 이 경우 JVM과 운영체제는 다음 그림과 같이 동작합니다.


즉 정리하자면 File 객체와 실제 경로에 있는 파일을 서로 연결고리가 없으며 단지 File 객체는 자신에게 지정된 경로를 바라보는것 뿐입니다. 실제 해당 경로에 파일이 존재하지 않는다 해도 신경쓰지 않습니다.





디스크에 존재하지 않는 파일경로에 대해 File 객체를 생성한 경우
앞에서 설명했지만 실제로 존재하지 않는 파일에 대해 File객체를 생성하더라도 전혀 신경쓰지 않습니다. 다만 실제로 존재하지 않는 파일이기에 특정 정보를 얻는 메서드를 실행하여도 null이나 false 등의 값이 리턴될 뿐입니다.


새로운 파일 및 디렉터리 생성
여기서 중요한 File 객체의 기능이 있는데, 파일 및 디렉터리 생성 기능입니다. 위의 예처럼 D:\test\new.txt 파일은 존재하지 않는 상태에서 File객체 생성후 createNewFile() 메서드 또는 mkdir(), mkdirs() 메서드를 사용하면 지정된 경로에 해당하는 파일 및 디렉터리를 생성할 수 있습니다.
URI filePath = new URI("file:///D:/test/new.txt");
File file = new File(filePath); //실제 경로에 존재하지 않는 File 객체 생성
System.out.println(file.createNewFile()); //해당 경로에 대한 파일을 생성. 정상적으로 생성시 true 리턴
cs




주의사항
만약 파일 생성시 createNewFile() 메서드를 실행했을 때 다음과 같은 오류가 발생할 수 있는데, 이는 생성하려는 파일 경로상의 디렉터리가 존재하지 않아서입니다. D:\test\new.txt 파일을 생성하려는 경우 D:\test 디렉터리가 존재해야 합니다. 따라서 mkdir() 또는 mkdirs() 메서드로 디렉터리를 생성한 이후 실행해야 합니다.
Exception in thread "main" java.io.IOException: 지정된 경로를 찾을 수 없습니다
     at java.io.WinNTFileSystem.createFileExclusively(Native Method)
     at java.io.File.createNewFile(Unknown Source)



다음글

블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

,