@[TOC]

(1)创建目录及文件

/**
 * 基于指定文件名称创建目录及文件
 * 如果文件已经存在,则忽略
 *
 * @param fileName
 * @throws IOException 
 */
private static void createFile(String fileName) throws IOException {
    Path dir = Paths.get(fileName);
    Files.createDirectories(dir.getParent());// 创建目录,存在目录也不会抛出异常
    try{
        Files.createFile(dir);// 创建文件,若文件已经存在则会抛出异常
        System.out.println("创建文件成功!文件位置:" + fileName);
    }
    catch(FileAlreadyExistsException e) {
        System.out.println("文件 " + fileName + " 已存在,无需创建!");
    }
    System.out.println();
}

(2)写入文件(基于Files.write或者BufferedWriter)

/**
 * 提示:文件以字节操作,因此可以
 * 字符串,转字节数组,直接基于Files写入文件
 * 
 * @param fileName
 * @param content
 * @throws IOException 
 */
static void write(String target, String content) {
    byte[] buffer = content.getBytes();
    Path p = Paths.get(target);
    try {
        Files.write(p, buffer); // 默认是覆盖内容
        //Files.write(p, buffer, StandardOpenOption.APPEND); // 添加内容
        System.out.println("数据写入成功!文件位置:" + target);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

或者可以用直接用的BufferedWriter:

private static void writeToFile(String fileName, String content) throws IOException{
    String[] lines = content.split("\r\n"); // 先把要写入的字符串按行分割
    try( BufferedWriter output = new BufferedWriter(new FileWriter(fileName)); ) {
        for (String line: lines) {
            output.write(line); // 写入一行(不含换行符)
            output.newLine(); // 写入换行符
        }
        output.flush();
        System.out.println("数据写入成功!文件位置:" + fileName);
    }
    System.out.println();
}

(3)基于基本IO复制文件

/**
 * 基于基本IO,以及字节数组缓冲区,复制文件
 * 打印显示循环读写循环次数
 *
 * @param sourceFile
 * @param targetFile
 * @throws IOException 
 */
private static void copyByIO(String sourceFile, String targetFile) throws IOException {

    try( InputStream input = new FileInputStream(sourceFile);
         OutputStream output = new FileOutputStream(targetFile); ){
        int size = 4;
        byte[] buffer = new byte[size]; // 字节数组缓冲区,大小为size
        int len;
        int cnt = 0;
        while( (len = input.read(buffer)) != -1) {
            output.write(buffer, 0, len);
            cnt++;
        }
        System.out.println(sourceFile + " -> " + targetFile + " 复制成功!");
        System.out.println("字节数组缓冲区大小为" + size + "时,读写循环次数为" + cnt + "\n");
    }
}

(4)基于NIO复制文件

/**
 * 基于NIO,实现文件的复制
 *
 * @param sourceFile
 * @param targetFile
 * @throws IOException 
 */
private static void copyByNIO(String sourceFile, String targetFile) throws IOException {
    Path source = Paths.get(sourceFile);
    Path target = Paths.get(targetFile);
    Files.createDirectories(target.getParent());
    Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING); // 如果输出文件存在,则替换
    System.out.println(sourceFile + " -> " + targetFile + " 复制成功!\n");
}

(5)删除文件

/**
 * 删除文件
 *
 * @param fileName
 * @throws IOException 
 */
private static void deleteFile(String fileName) throws IOException {
    Path dir = Paths.get(fileName);
    Files.deleteIfExists(dir);
    System.out.println(fileName + " 删除成功!\n");
}

(6)递归遍历指定目录下所有文件

/**
 * 遍历打印指定目录下全部目录/文件名称
 *
 * @param dir
 * @throws IOException 
 */
private static void walkDirectories(String dir) throws IOException {
    Path d = Paths.get(dir);
    Files.walk(d)
        //.sorted(Comparator.reverseOrder()) // 反向遍历
        .forEach(System.out::println);
}

完整代码

import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.FileAlreadyExistsException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.Comparator;

public class IOTest {

    public static void main(String[] args) throws IOException {

        String fileName = "C:/example/from.txt";

        System.out.println("----- 创建文件 ------");
        createFile(fileName);

        System.out.println("-----  将字符串写入文件 -------");
        // \r\n在txt文本中换行
        String str =
                "白日依山尽\r\n" +
                "黄河入海流\r\n" +
                "欲穷千里目\r\n" +
                "更上一层楼\r\n";
        writeToFile(fileName, str);

        System.out.println("--------- 基于基本IO流实现文件的复制 ----------");
        String toFile = "C:/example/to.txt";
        copyByIO(fileName, toFile);

        System.out.println("--------- 基于NIO实现文件的复制 ----------");
        String toFile2 = "C:/example/nio/to.txt";
        copyByNIO(fileName, toFile2);

        System.out.println("---------- 删除指定文件 -------------");
        deleteFile(toFile);

        System.out.println("---------- 遍历指定目录文件 -------------");
        String dir = "C:/example";
        walkDirectories(dir);
    }

    /**
     * 基于指定文件名称创建目录及文件
     * 如果文件已经存在,则忽略
     *
     * @param fileName
     * @throws IOException 
     */
    private static void createFile(String fileName) throws IOException {
        Path dir = Paths.get(fileName);
        Files.createDirectories(dir.getParent());// 创建目录,存在目录也不会抛出异常
        try{
            Files.createFile(dir);// 创建文件,若文件已经存在则会抛出异常
            System.out.println("创建文件成功!文件位置:" + fileName);
        }
        catch(FileAlreadyExistsException e) {
            System.out.println("文件 " + fileName + " 已存在,无需创建!");
        }
        System.out.println();
    }

    /**
     * 提示:文件以字节操作,因此可以
     * 字符串,转字节数组,直接基于Files写入文件
     * 
     * (注:我是直接用的BufferedWriter,比较方便)
     *
     * @param fileName
     * @param content
     * @throws IOException 
     */
    private static void writeToFile(String fileName, String content) throws IOException{
        String[] lines = content.split("\r\n"); // 先把要写入的字符串按行分割
        try( BufferedWriter output = new BufferedWriter(new FileWriter(fileName)); ) {
            for (String line: lines) {
                output.write(line); // 写入一行(不含换行符)
                output.newLine(); // 写入换行符
            }
            output.flush();
            System.out.println("数据写入成功!文件位置:" + fileName);
        }
        System.out.println();
    }

    /**
     * 基于基本IO,以及字节数组缓冲区,复制文件
     * 打印显示循环读写循环次数
     *
     * @param sourceFile
     * @param targetFile
     * @throws IOException 
     */
    private static void copyByIO(String sourceFile, String targetFile) throws IOException {

        try( InputStream input = new FileInputStream(sourceFile);
             OutputStream output = new FileOutputStream(targetFile); ){
            int size = 4;
            byte[] buffer = new byte[size]; // 字节数组缓冲区,大小为size
            int len;
            int cnt = 0;
            while( (len = input.read(buffer)) != -1) {
                output.write(buffer, 0, len);
                cnt++;
            }
            System.out.println(sourceFile + " -> " + targetFile + " 复制成功!");
            System.out.println("字节数组缓冲区大小为" + size + "时,读写循环次数为" + cnt + "\n");
        }
    }

    /**
     * 基于NIO,实现文件的复制
     *
     * @param sourceFile
     * @param targetFile
     * @throws IOException 
     */
    private static void copyByNIO(String sourceFile, String targetFile) throws IOException {
        Path source = Paths.get(sourceFile);
        Path target = Paths.get(targetFile);
        Files.createDirectories(target.getParent());
        Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING); // 如果输出文件存在,则替换
        System.out.println(sourceFile + " -> " + targetFile + " 复制成功!\n");
    }

    /**
     * 删除文件
     *
     * @param fileName
     * @throws IOException 
     */
    private static void deleteFile(String fileName) throws IOException {
        Path dir = Paths.get(fileName);
        Files.deleteIfExists(dir);
        System.out.println(fileName + " 删除成功!\n");
    }

    /**
     * 遍历打印指定目录下全部目录/文件名称
     *
     * @param dir
     * @throws IOException 
     */
    private static void walkDirectories(String dir) throws IOException {
        Path d = Paths.get(dir);
        Files.walk(d)
            //.sorted(Comparator.reverseOrder()) // 反向遍历
            .forEach(System.out::println);
    }

}