1. The Hook (The "Byte-Sized" Intro)
In a Nutshell: File class (java.io) represents file/directory paths and provides metadata/operations. Does NOT read/write content—only manages paths! Methods: exists() (check existence), isFile()/isDirectory() (check type), length() (file size), list() (directory contents), createNewFile() (create file), mkdir()/mkdirs() (create directories), delete() (remove). Platform-independent but legacy—use NIO.2 Path/Files (Java 7+) for production!
Think of real estate agent. File class = agent who knows property locations, sizes, prices (metadata), and can buy/sell (create/delete). Agent doesn't live in the house (doesn't read contents)!
2. Conceptual Clarity (The "Simple" Tier)
💡 The Analogy
- File object: Address on a map (may or may not exist)
- exists(): Check if house is built at address
- list(): List all houses on a street (directory)
3. Technical Mastery (The "Deep Dive")
File Class Operations
| Category | Methods | Purpose |
|---|---|---|
| Creation | createNewFile(), mkdir(), mkdirs() | Create files/dirs |
| Deletion | delete(), deleteOnExit() | Remove files/dirs |
| Metadata | exists(), length(), lastModified() | File info |
| Type checks | isFile(), isDirectory(), isHidden() | Type queries |
| Permissions | canRead(), canWrite(), canExecute() | Access checks |
| Directory ops | list(), listFiles() | List contents |
| Path ops | getAbsolutePath(), getName(), getParent() | Path manipulation |
4. Interactive & Applied Code
import java.io.*;
import java.util.*;
public class FileClassDemo {
public static void main(String[] args) {
demonstrateFileCreation();
demonstrateFileMetadata();
demonstrateDirectoryOperations();
demonstrateFileFilters();
}
// Creating files and directories
static void demonstrateFileCreation() {
System.out.println("=== FILE CREATION ===");
// Create file
File file = new File("test.txt");
try {
if (file.createNewFile()) {
System.out.println("File created: " + file.getName());
} else {
System.out.println("File already exists");
}
} catch (IOException e) {
e.printStackTrace();
}
// Create directory
File dir = new File("testdir");
if (dir.mkdir()) {
System.out.println("Directory created: " + dir.getName());
}
// Create nested directories
File nestedDir = new File("parent/child/grandchild");
if (nestedDir.mkdirs()) { // mkdirs creates parent dirs
System.out.println("Nested directories created");
}
}
// File metadata
static void demonstrateFileMetadata() {
System.out.println("\n=== FILE METADATA ===");
File file = new File("test.txt");
if (file.exists()) {
System.out.println("Name: " + file.getName());
System.out.println("Absolute path: " + file.getAbsolutePath());
System.out.println("Parent: " + file.getParent());
System.out.println("Is file: " + file.isFile());
System.out.println("Is directory: " + file.isDirectory());
System.out.println("Is hidden: " + file.isHidden());
System.out.println("Can read: " + file.canRead());
System.out.println("Can write: " + file.canWrite());
System.out.println("Can execute: " + file.canExecute());
System.out.println("Size: " + file.length() + " bytes");
System.out.println("Last modified: " + new Date(file.lastModified()));
} else {
System.out.println("File does not exist");
}
}
// Directory operations
static void demonstrateDirectoryOperations() {
System.out.println("\n=== DIRECTORY OPERATIONS ===");
File dir = new File(".");
// List files (returns String[])
String[] files = dir.list();
System.out.println("Files in current directory:");
if (files != null) {
for (String file : files) {
System.out.println(" " + file);
}
}
// List files (returns File[])
File[] fileObjects = dir.listFiles();
System.out.println("\nFile objects:");
if (fileObjects != null) {
for (File file : fileObjects) {
String type = file.isDirectory() ? "[DIR]" : "[FILE]";
System.out.println(" " + type + " " + file.getName());
}
}
}
// File filters
static void demonstrateFileFilters() {
System.out.println("\n=== FILE FILTERS ===");
File dir = new File(".");
// Filter by extension (FilenameFilter)
FilenameFilter txtFilter = (dir1, name) -> name.endsWith(".txt");
String[] txtFiles = dir.list(txtFilter);
System.out.println("Text files:");
if (txtFiles != null) {
for (String file : txtFiles) {
System.out.println(" " + file);
}
}
// Filter by type (FileFilter)
FileFilter dirFilter = File::isDirectory;
File[] directories = dir.listFiles(dirFilter);
System.out.println("\nDirectories only:");
if (directories != null) {
for (File directory : directories) {
System.out.println(" " + directory.getName());
}
}
}
}
// Recursive directory traversal
class DirectoryTraversal {
public static void listFilesRecursively(File dir, int depth) {
if (!dir.isDirectory()) {
return;
}
File[] files = dir.listFiles();
if (files != null) {
for (File file : files) {
String indent = " ".repeat(depth);
System.out.println(indent + file.getName());
if (file.isDirectory()) {
listFilesRecursively(file, depth + 1);
}
}
}
}
}5. The Comparison & Decision Layer
| Method | Returns | Use When |
|---|---|---|
| list() | String[] (filenames) | Need just names |
| listFiles() | File[] (File objects) | Need file metadata |
| mkdir() | boolean | Create single directory |
| mkdirs() | boolean | Create nested directories |
6. The "Interview Corner" (The Edge)
The "Killer" Interview Question:
"What's the difference between mkdir() and mkdirs()?"
Answer: mkdir() fails if parent doesn't exist, mkdirs() creates entire path!
// Scenario: Create "parent/child/grandchild"
// ❌ FAILS: mkdir() requires parent to exist
File dir = new File("parent/child/grandchild");
dir.mkdir(); // Returns false (parent doesn't exist)
// ✅ SUCCESS: mkdirs() creates entire path
File dir = new File("parent/child/grandchild");
dir.mkdirs(); // Creates parent, child, and grandchildPro-Tip: File object != actual file:
// Creating File object doesn't create actual file!
File file = new File("phantom.txt");
System.out.println(file.exists()); // false
// Must explicitly create
file.createNewFile(); // Now file exists on disk
System.out.println(file.exists()); // trueFile object is just a path wrapper!