Манипулирование файлами и каталогами в Java

View more Tutorials:

1- Обзор

На самом деле, вы часто работаете с файлами и папками в системе, операции здесь включают добавление, удаление, переименование. Java дает вам два класса, чтобы сделать это:
  • java.io.File
  • java.nio.file.Files

java.io.File

Java.io.File класс представляет файл (file) или папку (directory) системы, он введен в Java, из версии 1.0

java.nio.file.Files

Версия 7.0, Java  дополняет  java.nio.file.Files класс, что позволяет легко манипулировать файлами и папками, все методы этого класса являются статическими и естественными (static and nature)
В этой статье я только говорю об использовании класса java.io.File, вы можете посмотреть больше  про java.nio.file.Files по ссылке:
  • TODO Link!

2- java.io.File

Java.io.File класс представляет  файл или папку в системе, которая представляет  путь (pathname). В следующем примере создается объект File представляющий путь в Windows, или Unix:
// Window

File apath1 = new File("C:/mydocument/test.txt");

File apath2 = new File("C:/mydocument/java");

// Unix

File apath3 = new File("/mydocument/test.txt");

File apath3 = new File("/mydocument/java");
 
java.io.File может представлять собой путь (pathname), где этот путь может на самом деле не существовать в системе. Если существовует, то может быть в виде папки (directory) или файла (file).
Следующий простой пример создает объект File, который  представляет собой путь, и проверяет его существование, записывает основную информацию, если путь на самом деле существует:
FileInfoExample.java
package org.o7planning.filedirectory;

import java.io.File;
import java.util.Date;

public class FileInfoExample {

	public static void main(String[] args) {

		// Создать объект File представлюящий путь.
		File apath = new File("C:/test/mytext.txt");

		// Проверка существования.
		System.out.println("Path exists? " + apath.exists());

		if (apath.exists()) {

			// Проверить является ли 'apath' папкой или нет?
			System.out.println("Directory? " + apath.isDirectory());

			// Проверить является ли 'apath' скрытым путем или нет?
			System.out.println("Hidden? " + apath.isHidden());

			// Простое название.
			System.out.println("Simple Name: " + apath.getName());

			// Абсолютный путь.
			System.out.println("Absolute Path: " + apath.getAbsolutePath());

			// Проверка размера файла (По единицам byte):
			System.out.println("Length (bytes): " + apath.length());

			// Последнее изменение (в милисекундах)
			long lastMofifyInMillis = apath.lastModified();
			Date lastModifyDate = new Date(lastMofifyInMillis);

			System.out.println("Last modify date: " + lastModifyDate);

		}

	}

}

3- Создать каталог

Класс File содержит два метода для создания:
Метод Описание
public boolean mkdir() Создает папку данную путем. Заметьте, что папка создается только при существовании родительской папки.
public boolean mkdirs() Создает папку данную путем, включая родительскую папку если она не существует.
MakeDirExample.java
package org.o7planning.filedirectory;

import java.io.File;

public class MakeDirExample {

	public static void main(String[] args) {

		File dir1 = new File("C:/test2/test3");

		System.out.println("Pathname: " + dir1.getAbsolutePath());
		System.out.println("Path Exists? " + dir1.exists());
		System.out.println("Parent Path Exists? " + dir1.getParentFile().exists());

		// С mkdir(), папка может быть создана только если существует родительская папка.
		boolean created = dir1.mkdir();

		System.out.println("Directory created? " + created);

		System.out.println("--------------------");

		File dir2 = new File("C:/test2/test3/test4");

		System.out.println("Pathname: " + dir2.getAbsolutePath());
		System.out.println("Exists? " + dir2.exists());

		//  
		created = dir1.mkdirs();

		System.out.println("Directory created? " + created);
	}

}

4- File Filter

Java.io.File класс предлагает несколько способов, чтобы получить список подфайлов и подкаталогов в каталоге. И использует  FileFilter для фильтрации файлов
Метод Описание
static File[] listRoots()
Возвращает массив объектов File, который представляет корневой каталог. В операционной системе Windows это диски (C:, D :, ..) в Unix это /
File[] listFiles()
Возвращает массив объектов File, файлы и подпапки из текущей папки, и соотствествующий фильтру  FilenameFilter на параметр.
File[] listFiles(FilenameFilter filter)
Возвращает массив объектов File, файлы и подпапки из текущей папки, и соответствует с фильтром  FilenameFilter на параметр
File[] listFiles(FileFilter filter) Возвращает массив объектов File, файлы и подпапки из текущей папки, а соответствует с фильтром FileFilter на параметр
   
String[] list() Возвращает массив путей, пути файлов и путь подпапок в текущей папке.
String[] list(FilenameFilter filter) Возвращает массив путей, пути файлов и путь подпапках текущей папки, и соответствует с фильтром FiltenameFilter на параметр
Например, список всех корневых каталогов:
RootFilesExample.java
package org.o7planning.filedirectory;

import java.io.File;

public class RootFilesExample {

    public static void main(String[] args) {


        File[] roots = File.listRoots();
        
        for(File root: roots)  {
            System.out.println(root.getAbsolutePath());
        }

    }

}
В следующем примере составляется список всех файлов и подпапок в непосредственной папке:
FileListExample.java
package org.o7planning.filedirectory;

import java.io.File;

public class FileListExample {

    public static void main(String[] args) {
       
        System.out.println("File[] listFiles():\n");

        File dir = new File("C:/test");

        File[] children = dir.listFiles();

        for (File file : children) {
            System.out.println(file.getAbsolutePath());
        }

        System.out.println("\n-----------------------");
       
        System.out.println("String[] list():\n");

        String[] paths = dir.list();

        for (String path : paths) {
            System.out.println(path);
        }
    }

}

java.io.FileFilter

** FileFilter **
package java.io;


@FunctionalInterface
public interface FileFilter {
 
    boolean accept(File pathname);


}
Простой пример ниже использует FileFilter, чтобы отфильтровать файлы в папке и имеющие расширенную часть"txt":
TxtFileFilter.java
package org.o7planning.filedirectory;

import java.io.File;
import java.io.FileFilter;

public class TxtFileFilter implements FileFilter {

	// Только принимает 'pathname' как файл и имеет 'расширение' (extension) это txt.
	@Override
	public boolean accept(File pathname) {

		if (!pathname.isFile()) {
			return false;
		}

		if (pathname.getAbsolutePath().endsWith(".txt")) {
			return true;
		}

		return false;
	}

}
FileFilterExample.java
package org.o7planning.filedirectory;

import java.io.File;

public class FileFilterExample {

    public static void main(String[] args) {

        File dir = new File("C:/test");

        File[] txtFiles = dir.listFiles(new TxtFileFilter());

        for (File txtFile : txtFiles) {
            System.out.println(txtFile.getAbsolutePath());
        }
    }

}

java.io.FilenameFilter

** FilenameFilter **
package java.io;

@FunctionalInterface
public interface FilenameFilter {
    /**
     * Tests if a specified file should be included in a file list.
     *
     * @param   dir    the directory in which the file was found.
     * @param   name   the name of the file.
     * @return  <code>true</code> if and only if the name should be
     * included in the file list; <code>false</code> otherwise.
     */
    boolean accept(File dir, String name);

}

 
Пример использовния  FilenameFilter:
TxtFilenameFilter.java
package org.o7planning.filedirectory;

import java.io.File;
import java.io.FilenameFilter;

public class TxtFilenameFilter implements FilenameFilter {

	// Принимает пути (path) с окончаниями '.txt'
	@Override
	public boolean accept(File dir, String name) {

		if (name.endsWith(".txt")) {
			return true;
		}

		return false;
	}

}
FilenameFilterExample.java
package org.o7planning.filedirectory;

import java.io.File;

public class FilenameFilterExample {

    public static void main(String[] args) {

        File dir = new File("C:/test");

        File[] txtFiles = dir.listFiles(new TxtFilenameFilter());

        for (File txtFile : txtFiles) {
            System.out.println(txtFile.getAbsolutePath());
        }
    }

}

5- Перечисление всех подпапок

Java.io.File класс предлагает несколько методов для перечисления папок и файлов, которые являются "прямым потомком" текущего каталога. В примере ниже, используется рекурсия для перечисления всех папок потомков (дети, внуки, ..) и потомок файла.
RecursiveFileExample.java
package org.o7planning.filedirectory;

import java.io.File;

public class RecursiveFileExample {

	private void fetchChild(File file) {

		System.out.println(file.getAbsolutePath());

		if (file.isDirectory()) {

			File[] children = file.listFiles();

			for (File child : children) {
				// Рекурсивный (Recursive)
				this.fetchChild(child);
			}
		}

	}

	public static void main(String[] args) {

		RecursiveFileExample example = new RecursiveFileExample();

		File dir = new File("C:/test");

		example.fetchChild(dir);

	}

}

6- Переименование

Используя методы rename() класса File, вы можете изменить имя (или путь) файла или каталога. Если вы измените и путь, убедитесь, что новый родительский каталог уже существует.

Переименование

Следующий простой пример, чтобы переименовать файл (или папку), но не изменить путь своего отца.
SimpleRenameExample.java
package org.o7planning.filedirectory;

import java.io.File;

public class SimpleRenameExample {

    public static void main(String[] args) {

        File srcFile = new File("C:/test/test2/abc.txt");

        File destFile = new File("C:/test/test2/def.txt");

        boolean renamed = srcFile.renameTo(destFile);
       
        System.out.println("Renamed: "+ renamed);

    }

}

Переименование включая путь родителя:

Переименование и измение пути родителя, подобно действию " Cut" файла или папки в другую папку, а затем переименовать ее.
ПРИМЕЧАНИЕ: Для операционной системы  Windows, метод  File.rename() не будет работать, если вы измените путь с одной диска на другой.
RenameAndPathExample.java
package org.o7planning.filedirectory;

import java.io.File;

public class RenameAndPathExample {

	public static void main(String[] args) {

		// Исходный файл (Source file).
		File srcFile = new File("C:/test/test2/abc.txt");

		// Файл назначения (Destination file).
		File destFile = new File("C:/test2/test3/defgh.txt");

		if (!srcFile.exists()) {
			System.out.println("Src File doest not exists");
			return;
		}

		// Создать родительскую папку файла назначения.
		destFile.getParentFile().mkdirs();

		boolean renamed = srcFile.renameTo(destFile);

		System.out.println("Renamed: " + renamed);

	}

}

View more Tutorials: