Working with File Objects, Recursion, and Input/Output Streams in Java

File Class Overview

The java.io.File class provides a abstract representation of file and directory pathnames. It allows manipulation of file system objects.

Path Specifications

Paths can be defined as either absolute (complete from the root) or relative (relative to the current working directory). The File.separator field provieds the system-dependent name separator character.

import java.io.File;

public class FileExample {
    public static void main(String[] args) {
        // Using forward slashes
        File f1 = new File("C:/data/documents/report.txt");
        // Using backslashes with escape sequences
        File f2 = new File("C:\\data\\documents\\report.txt");
        // Using system-independent separator
        File f3 = new File("C:" + File.separator + "data" + File.separator + "report.txt");
        
        System.out.println(f1);
        System.out.println(f2);
        System.out.println(f3);
    }
}

File Creation and Directory Operations

import java.io.File;
import java.io.IOException;

public class CreateFilesDirectories {
    public static void main(String[] args) throws IOException {
        // Create a new file
        File newFile = new File("C:/data/sample.txt");
        boolean fileCreated = newFile.createNewFile();
        System.out.println("File created: " + fileCreated);
        
        // Create a single directory
        File singleDir = new File("C:/data/temp");
        boolean dirCreated = singleDir.mkdir();
        System.out.println("Directory created: " + dirCreated);
        
        // Create nested directories
        File nestedDirs = new File("C:/data/projects/java/src");
        boolean nestedCreated = nestedDirs.mkdirs();
        System.out.println("Nested directories created: " + nestedCreated);
    }
}

File Deletion

import java.io.File;

public class DeleteFilesDirectories {
    public static void main(String[] args) {
        File fileToRemove = new File("C:/data/sample.txt");
        boolean fileDeleted = fileToRemove.delete();
        System.out.println("File deleted: " + fileDeleted);
        
        File emptyFolder = new File("C:/data/temp");
        boolean folderDeleted = emptyFolder.delete();
        System.out.println("Empty folder deleted: " + folderDeleted);
        
        // Note: Directories must be empty before deletion
    }
}

File Attribute Methods

import java.io.File;

public class FileAttributes {
    public static void main(String[] args) {
        File target = new File("C:/data/report.pdf");
        
        System.out.println("Is file: " + target.isFile());
        System.out.println("Is directory: " + target.isDirectory());
        System.out.println("Exists: " + target.exists());
        System.out.println("Is hidden: " + target.isHidden());
        System.out.println("Is absolute path: " + target.isAbsolute());
        
        if (!target.exists()) {
            System.out.println("File does not exist");
        }
    }
}

Path Information Methods

import java.io.File;

public class PathInformation {
    public static void main(String[] args) {
        File doc = new File("C:/data/documents/report.txt");
        
        System.out.println("Name: " + doc.getName());
        System.out.println("Path: " + doc.getPath());
        System.out.println("Parent: " + doc.getParent());
        System.out.println("Size (bytes): " + doc.length());
        System.out.println("Last modified: " + doc.lastModified());
    }
}

Listing Directory Contents

import java.io.File;

public class ListDirectoryContents {
    public static void main(String[] args) {
        File directory = new File("C:/data");
        
        // Get array of File objects
        File[] contents = directory.listFiles();
        if (contents != null) {
            for (File item : contents) {
                System.out.println("Item: " + item);
            }
        }
        
        // Get array of names as strings
        String[] names = directory.list();
        if (names != null) {
            for (String name : names) {
                System.out.println("Name: " + name);
            }
        }
    }
}

Recursive File Operations

Recursive File Listing

import java.io.File;

public class RecursiveFileLister {
    public static void main(String[] args) {
        listAllFiles(new File("C:/data"));
    }
    
    public static void listAllFiles(File directory) {
        File[] files = directory.listFiles();
        if (files == null) return;
        
        for (File file : files) {
            if (file.isFile()) {
                System.out.println("File: " + file.getName());
            } else if (file.isDirectory()) {
                listAllFiles(file); // Recursive call
            }
        }
    }
}

Recursive File Deletion

import java.io.File;

public class RecursiveFileDeletion {
    public static void main(String[] args) {
        deleteDirectoryContents(new File("C:/temp"));
    }
    
    public static void deleteDirectoryContents(File dir) {
        File[] contents = dir.listFiles();
        if (contents == null) return;
        
        for (File item : contents) {
            if (item.isDirectory()) {
                deleteDirectoryContents(item); // Recursive call
            }
            item.delete();
        }
    }
}

Input/Output Streams

Streams provide sequential access to data for reading from or writing to various sources like files.

Buffered Byte Input Stream

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;

public class BufferedByteInputExample {
    public static void main(String[] args) throws Exception {
        File sourceFile = new File("C:/data/input.txt");
        FileInputStream baseStream = new FileInputStream(sourceFile);
        BufferedInputStream bufferedStream = new BufferedInputStream(baseStream);
        
        byte[] dataBuffer = new byte[1024]; // 1KB buffer
        int bytesRead;
        
        while ((bytesRead = bufferedStream.read(dataBuffer)) != -1) {
            String content = new String(dataBuffer, 0, bytesRead);
            System.out.print(content);
        }
        
        bufferedStream.close();
        baseStream.close();
    }
}

Understanding the Read Buffer

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;

public class BufferMechanics {
    public static void main(String[] args) throws Exception {
        File dataSource = new File("C:/data/test.txt");
        FileInputStream rawStream = new FileInputStream(dataSource);
        BufferedInputStream enhancedStream = new BufferedInputStream(rawStream);
        
        // Small buffer for demonstration
        byte[] storage = new byte[4];
        
        int firstRead = enhancedStream.read(storage);
        System.out.println("Bytes read first time: " + firstRead);
        System.out.println("Buffer content: " + new String(storage, 0, firstRead));
        
        int secondRead = enhancedStream.read(storage);
        System.out.println("Bytes read second time: " + secondRead);
        if (secondRead > 0) {
            System.out.println("Buffer content: " + new String(storage, 0, secondRead));
        }
        
        enhancedStream.close();
        rawStream.close();
    }
}

Tags: java File Handling Recursion IO Streams BufferedInputStream

Posted on Sun, 31 May 2026 21:26:53 +0000 by Citizen