"안녕, 아미고. 오랜만이야."

"안녕, Bilaabo. 무슨 얘기를 할 건데?"

"오늘은 파일 작업에 대해 말씀드리겠습니다.  Java에는 하드 드라이브의 파일을 관리하는 데 사용할 수 있는 특수 클래스(File)가 있습니다. 파일 내용을 관리하기 위한 다른 클래스: FileInputStream, FileOutputStream 등 "

파일, 파일, 경로 - 1

"흥미롭군. 그런데 '파일 관리'라고 하면 무슨 뜻이야?"

"그게 바로 내가 지금 설명하려는 것입니다. 파일은 생성, 삭제, 이름 변경 등을 할 수 있습니다. File 객체를 파일 내용과 함께 작동(읽기, 쓰기, 변경)하는 거의 모든 클래스에 전달할 수 있습니다. . 예를 들어:"

파일 이름을 FileInputStream에 직접 전달할 수 있습니다.
FileInputStream input = new FileInputStream("c:/path/a.txt");
또는 File 객체를 별도로 만든 다음 FileInputStrea에 전달할 수 있습니다.
File file = new File("c:/path/a.txt");
FileInputStream input = new FileInputStream(file);

"하지만 두 번째 옵션은 더 깁니다. 저는 여전히 이러한 파일 개체가 필요한 이유를 이해하지 못합니다."

"이 특정 예의 경우 귀하가 옳습니다. "이것은 어떻게 해야 하는지에 대한 예가 아니라 어떻게 할 수 있는지에 대한 예입니다.
그러나 특정 디렉토리에 있는 모든 파일의 목록을 표시해야 한다고 상상해 보십시오. 파일 개체를 사용하여 이 작업을 수행하는 방법은 다음과 같습니다."

암호
File folder = new File("c:/path/");
for (File file : folder.listFiles())
{
 System.out.println(file.getName());
}

" listFiles() 는 «c:/path/»로 표시된 폴더의 파일 목록을 반환하는 메서드입니까?"

"예. 하지만 프로그래머들은 보통 '디렉토리'라고 합니다. '폴더'라는 용어는 비교적 최근에 사용되기 시작했지만 원칙적으로 두 용어 모두 정확하며 원하는 것을 말할 수 있습니다."

"좋아요. 그리고 getName () 은 무엇을 합니까? 파일 이름을 반환합니까? 이름에 정확히 무엇이 포함되어 있습니까? 경로를 포함한 전체 이름입니까, 아니면 파일 자체의 이름입니까?"

"파일 자체의 이름만. 전체 경로의 경우 file.getAbsolutePath()가 있습니다."

"그럼 File 클래스에는 어떤 다른 메서드가 있습니까?"

"이것 좀 보세요:"

방법 설명
boolean isDirectory() File 객체가 디렉토리입니까?
boolean isFile() 개체가 파일입니까?
long length() 파일 크기/길이를 바이트 단위로 반환합니다.
boolean createNewFile() 이 이름을 가진 파일이 아직 존재하지 않는 경우 비어 있는 새 파일을 만듭니다.
boolean mkdir() 디렉토리를 생성합니다. «mkdir»이라는 이름은 «make directory»에서 유래되었습니다.
boolean mkdirs() 디렉토리와 모든 하위 디렉토리를 생성합니다.
boolean delete() 개체와 관련된 파일을 삭제합니다. 개체가 디렉터리인 경우 파일이 없는 경우에만 디렉터리가 삭제됩니다.
void deleteOnExit() 프로그램 종료 시 자동으로 삭제되는 특수 파일 목록에 파일을 추가합니다.
File createTempFile(
String prefix,
String suffix,
File directory)
«dasd4d53sd»와 같이 임의로 생성된 고유 이름으로 임시 파일을 만듭니다.
추가 매개변수는 이름 접두어와 접미어입니다. 디렉토리를 지정하지 않으면 임시 파일용 특수 OS 디렉토리에 파일이 생성됩니다.
boolean exists() 동일한 이름의 파일이 하드 드라이브에 있으면 true를 반환합니다.
String getAbsolutePath() 모든 하위 디렉터리가 있는 파일의 전체 경로를 반환합니다.
String getCanonicalPath() 정식 파일 경로를 반환합니다.
예를 들어 «c:/dir/dir2/../a.txt» 경로를 «c:/dir/a.txt»로 변환합니다.
String[] list() 현재 개체가 나타내는 디렉터리에 포함된 파일 이름의 배열을 반환합니다.
File[] listFiles() 현재 File 객체가 나타내는 디렉토리에 포함된 파일 배열을 반환합니다.
long getTotalSpace() 파일이 있는 디스크의 총 공간(바이트 수)을 반환합니다.
long getFreeSpace() 파일이 있는 디스크의 여유 공간(바이트 수)을 반환합니다.
boolean renameTo(File) 파일의 이름을 바꿉니다. 즉, 파일의 내용이 실제로 새 이름을 얻습니다. 즉, «c:/dir/a.txt» 파일의 이름을 «d:/out/text/b.doc»로 바꿀 수 있습니다.
String getName() 경로 없이 파일 이름만 반환합니다.
String getParent() 이름 자체 없이 현재 파일에 대한 경로(디렉토리)만 반환합니다.
Path toPath() 현재 File 객체에 해당하는 Path 객체를 반환합니다.

"우와! 아주 작은 목록이 아니죠? 그리고 그것으로 꽤 많은 일을 할 수 있는 것 같습니다: 파일 생성 및 삭제, 이름 바꾸기,..."

"그러면 현재 파일의 디렉토리를 가져오려면 getParent()를 호출해야 합니까?"

"예, 하지만 File 객체가 아니라 String(파일 경로)을 반환합니다. 사실 File 클래스는 거의 모든 메서드를 복제합니다. 한 버전은 String을 반환하고 다른 버전은 File 객체를 반환합니다. 확인해보세요:"

File file = new File("c:/path/a.txt");
String directory = file.getParent();
File file = new File("c:/path/a.txt");
File directory = file.getParentFile();

파일 경로가 있는 문자열이 있고 File 객체가 필요한 경우 생성자를 사용하십시오. 상황이 반대인 경우( File 객체가 있지만 String이 필요한 경우) getAbsolutePath ()를 사용하십시오. 예를 들어:"

String path = "c:/a.txt";
File file = new File(path);
File file = new File("c:/a.txt");
String path = file.getAbsolutePath();

"알았어요."

"좋습니다. 그럼 여기 작은 작업이 있습니다. 현재 파일과 동일한 디렉토리에 있는 모든 파일의 이름을 표시하십시오."

"이보다 더 쉬울 수는 없습니다. 여기 보세요:"

암호
//Some file
File originalFile = new File("c:/path/dir2/a.txt");

//An object representing the directory
File folder = originalFile.getParentFile();

//Print the file list on screen
for (File file : folder.listFiles())
{
 System.out.println(file.getName());
}

"흠. 맞다."

"하지만 같은 클래스인 File이 파일과 디렉토리 모두에 사용된다는 것은 약간 혼란스럽습니다. 제게는 그다지 논리적이지 않은 것 같습니다."

"역사적인 이유로 그렇게 되었습니다. 디렉토리는 디스크에 있는 특별한 '빈' 파일이었습니다. 물론 지금은 많이 바뀌었지만 전부는 아닙니다. 오늘 제가 가진 전부입니다."

"흥미로운 수업 감사합니다, Bilaabo."