1. Đổi tên file trong Java – Rename file

Java cung cấp phương thức renameTo() để đổi tên một file. Tuy nhiên, phương thức này phụ thuộc nền tảng. Ta có thể đổi tên 1 file thành công trong Linux nhưng thất bại trong Windows. Nó trả về giá trị boolean cho biết trạng thái của thao tác : True nếu đổi tên file thành công và ngược lại False nếu thất bại.

import java.io.File;

public class RenameFileExample {
    public static void main(String[] args) {
    File oldFile = new File("oldfile.txt");
    File newFile = new File("newfile.txt");

    if (oldFile.renameTo(newFile)) {
        System.out.println("Đổi tên thành công!");
    } else {
        System.out.println("Đổi tên bị lỗi!");
    }
    }
}

Do những hạn chế còn tồn đọng từ phương thức renameTo() của Java, rất nhiều thư viện từ cộng đồng được viết ra để thay thế cho phương thức còn nhiều hạn chế kia. Nổi bật như thư viện Commons IO của Apache cung cấp các class cho phép thao tác với file, tên file,… Bạn có thể tìm hiểu thêm nếu muốn.

2. Coppy file trong Java

Copy file là một trong những nhu cầu phổ biến trong lập trình nói chung và Java nói riêng. Thế nhưng trong java.io.File class lại không hề cung cấp một method nào cho phép sao chép một file nguồn đến file đích một cách nhanh chóng. Tuy nhiên ta cũng có thể tự tạo ra việc xử lý. Chúng ta có thể sử dụng File, FileInputStream, FileOutputStream, FileChannel, và Files. Ngoài ra, chúng ta có thể sử dụng thư viện thứ ba: Apache Commons IO và Google Guava.

2.1. Copy file sử dụng Stream

Đây là cách thông thường để sao chép file trong java. Ở đây chúng ta tạo hai file – nguồn và đích. Sau đó, tạo InputStream từ nguồn và ghi nó vào tệp đích bằng OutputStream.

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

public class CopyFileExample{
private static void copyFileUsingStream(File source, File dest) throws IOException {
    InputStream is = null;
    OutputStream os = null;
    try {
        is = new FileInputStream(source);
        os = new FileOutputStream(dest);
        byte[] buffer = new byte[1024];
        int length;
        while ((length = is.read(buffer)) > 0) {
            os.write(buffer, 0, length);
        }
    } finally {
        is.close();
        os.close();
    }
  }
}

2.2. Copy file sử dụng FileChannel

Các class trong Java NIO đã được giới thiệu trong Java 1.4 và FileChannel có thể được sử dụng để sao chép tệp trong Java một cách nhanh chóng thông qua transferFrom() method.

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
 
public class CopyFileChannel {
 
    public static void main(String[] args) throws IOException {
 
        File source = new File("src/resources/sample.txt");
        File dest = new File("src/resources/sample2.txt");
 
        FileChannel sc = null;
        FileChannel dc = null;
         
        try {
             
            sc = new FileInputStream(source).getChannel();
            dc = new FileOutputStream(dest).getChannel();
            dc.transferFrom(sc, 0, sc.size());
             
            sc.close();
            dc.close();
             
        } finally {
             
            if (sc != null) {
                sc.close();
            }
 
            if (dc != null) {
                dc.close();
            }
        }
    }
}

Kênh nguồn được tạo từ FileInputStream với phương thức getChannel(). Phương thức transferFrom() biến đổi byte từ kênh ngồn vào kênh đích. Tham số thứ nhất là kênh nguồn, tham số thứ 2 là vị trí bắt đầu cho việc biến đổi trong file và tham số cuối là số byte cần biến đổi.

2.3. Copy file sử dụng Files class

Nếu đang sử dụng phiên bản Java 7 hoặc cao hơn, bạn Việc copy file fail nếu file đích đã tồn tại, nếu chúng ta chỉ định tùy chọn REPLACE_EXISTING , file đích mới sẽ ghi đè lên file cũ.

Ví dụ:

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
 
public class CopyFileJava7 {
 
    public static void main(String[] args) throws IOException {
 
        File source = new File("src/resources/sample.txt");
        File dest = new File("src/resources/sample2.txt");
 
        Files.copy(source.toPath(), dest.toPath(), StandardCopyOption.REPLACE_EXISTING);
    }
}

3. Di chuyển file trong Java – Move file

Trong Java cũng không hỗ trợ ta di chuyển file. Tuy nhiên ta có thể linh động thực hiện nó bằng cách sau:

  • Cách 1 : Sử dụng File.renameTo()
  • Cách 2 : Copy sang 1 file mới và xóa file gốc đi

Ví dụ:

  • Sử dụng File.renameTo()
import java.io.File;
 
public class MoveFileExample1 {
    public static void main(String[] args) {
        try {
            File afile = new File("D:\\log\\file1.txt");
 
            if (afile.renameTo(new File("D:\\logtest\\" + afile.getName()))) {
                System.out.println("File is moved successful!");
            } else {
                System.out.println("File is failed to move!");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  • Coppy tới một file mới và xóa file cũ
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
 
public class MoveFileExample2 {
    public static void main(String[] args) throws IOException {
        InputStream inStream = null;
        OutputStream outStream = null;
 
        try {
            File fileLog1 = new File("D:\\log\\file1.txt");
            File fileLog2 = new File("D:\\logtest\\file1.txt");
            inStream = new FileInputStream(fileLog1);
            outStream = new FileOutputStream(fileLog2);
 
            int length;
            byte[] buffer = new byte[1024];
            // copy the file content in bytes
            while ((length = inStream.read(buffer)) > 0) {
                outStream.write(buffer, 0, length);
            }
            // delete the original file
            fileLog1.delete();
            System.out.println("File is copied successful!");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            inStream.close();
            outStream.close();
        }
    }
}