package com.java.ch151;
import java.io.File;
import java.io.IOException; //引入类
public class TextCreateFileAndDir { // 创建新文件和目录
public static boolean createFile(String filePath) { // 创建单个文件
File file = new File(filePath);
if (file.exists()) { // 判断文件是否存在
System.out.println("目标文件已存在" + filePath);
return false;
}
if (filePath.endsWith(File.separator)) { // 判断文件是否为目录
System.out.println("目标文件不能为目录!");
return false;
}
// 判断目标文件所在的目录是否存在
if (!file.getParentFile().exists()) {
// 如果目标文件所在的文件夹不存在,则创建父文件夹
System.out.println("目标文件所在目录不存在,准备创建它!");
if (!file.getParentFile().mkdirs()) { // 判断创建目录是否成功
System.out.println("创建目标文件所在的目录失败!");
return false;
}
}
try {
if (file.createNewFile()) { // 创建目标文件
System.out.println("创建文件成功:" + filePath);
return true;
} else {
System.out.println("创建文件失败!");
return false;
}
} catch (IOException e) { // 捕获异常
e.printStackTrace();
System.out.println("创建文件失败!" + e.getMessage());
return false;
}
}
public static boolean createDir(String destDirName) {// 创建目录
File dir = new File(destDirName);
if (dir.exists()) { // 判断目录是否存在
System.out.println("创建目录失败,目标目录已存在!");
return false;
}
if (!destDirName.endsWith(File.separator)) { // 结尾是否以"/"结束
destDirName = destDirName + File.separator;
}
if (dir.mkdirs()) { // 创建目标目录
System.out.println("创建目录成功!" + destDirName);
return true;
} else {
System.out.println("创建目录失败!");
return false;
}
}
public static String createTempFile(String prefix, String suffix,
String dirName) { // 创建临时文件
File tempFile = null;
if (dirName == null) { // 目录如果为空
try {
// 在默认文件夹下创建临时文件
tempFile = File.createTempFile(prefix, suffix);
return tempFile.getCanonicalPath(); // 返回临时文件的路径
} catch (IOException e) { // 捕获异常
e.printStackTrace();
System.out.println("创建临时文件失败:" + e.getMessage());
return null;
}
} else { // 指定目录存在
File dir = new File(dirName); // 创建目录
if (!dir.exists()) { // 如果目录不存在则创建目录
if (TextCreateFileAndDir.createDir(dirName)) {
System.out.println("创建临时文件失败,不能创建临时文件所在的目录!");
return null;
}
}
try {
// 在目录下创建临时文件
tempFile = File.createTempFile(prefix, suffix, dir);
return tempFile.getCanonicalPath(); // 返回临时文件的路径
} catch (IOException e) { // 捕获异常
e.printStackTrace();
System.out.println("创建临时文件失败!" + e.getMessage());
return null;
}
}
}
public static void main(String[] args) { // java程序的主入口处
String dirName = "E:/createFile/"; // 创建目录
TextCreateFileAndDir.createDir(dirName); // 调用方法创建目录
String fileName = dirName + "/file1.txt"; // 创建文件
TextCreateFileAndDir.createFile(fileName); // 调用方法创建文件
String prefix = "temp"; // 创建临时文件
String surfix = ".txt"; // 后缀
for (int i = 0; i < 10; i++) { // 循环创建多个文件
System.out.println("创建临时文件: " // 调用方法创建临时文件
+ TextCreateFileAndDir.createTempFile(prefix, surfix,dirName));
}
}
}
以上程序,createFile方法创建一个新的文件。首先通过File的exists方法和isDirectory方法判断目标文件是否存在,对于文件存在,则返回false,新建文件失败。如果目标文件不存在,通过File的getParentFile方法获得目标文件的父目录,如果父目录不存在,调用File的mkdirs方法创建父目录(如果父目录的父目录也不存在,都会一起创建),此时能确定目标文件不存在,而且父目录已经存在,使用File的createNewFile方法便能成功地创建一个新的空文件了。
文件和目录的复制与移动。包括单个文件的移动复制、复制目录到指定目录连同目录下的子目录一起复制、将目录以及目录下的文件和子目录全部复制。具体代码如下:
import java.io.File; //引入类
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
//实现文件的简单处理,复制和移动文件、目录等
public class TextCopyFileAndMove {
// 移动指定文件夹内的全部文件
public static void fileMove(String from, String to) throws Exception {
try {
File dir = new File(from);
File[] files = dir.listFiles(); // 将文件或文件夹放入文件集
if (files == null) // 判断文件集是否为空
return;
File moveDir = new File(to); // 创建目标目录
if (!moveDir.exists()) { // 判断目标目录是否存在
moveDir.mkdirs(); // 不存在则创建
}
for (int i = 0; i < files.length; i++) {// 遍历文件集
// 如果是文件夹或目录,则递归调用fileMove方法,直到获得目录下的文件
if (files[i].isDirectory()) {
// 递归移动文件
fileMove(files[i].getPath(), to + "\\" + files[i].getName());
files[i].delete(); // 删除文件所在原目录
}
// 将文件目录放入移动后的目录
File moveFile = new File(moveDir.getPath() + "\\"
+ files[i].getName());
if (moveFile.exists()) { // 目标文件夹下存在的话,删除
moveFile.delete();
}
files[i].renameTo(moveFile); // 移动文件
System.out.println(files[i] + " 移动成功");
}
} catch (Exception e) {
throw e;
}
}
// 复制目录下的文件(不包括该目录)到指定目录,会连同子目录一起复制过去。
public static void copyFileFromDir(String toPath, String fromPath) {
File file = new File(fromPath);
createFile(toPath, false); // true:创建文件 false创建目录
if (file.isDirectory()) { // 如果是目录
copyFileToDir(toPath, listFile(file));
}
}
// 复制目录到指定目录,将目录以及目录下的文件和子目录全部复制到目标目录
public static void copyDir(String toPath, String fromPath) {
File targetFile = new File(toPath); // 创建文件
createFile(targetFile, false); // 创建目录
File file = new File(fromPath); // 创建文件
if (targetFile.isDirectory() && file.isDirectory()) { // 如果传入是目录
copyFileToDir(targetFile.getAbsolutePath() + "/" + file.getName(),
listFile(file)); // 复制文件到指定目录
}
}
// 复制一组文件到指定目录。targetDir是目标目录,filePath是需要复制的文件路径
public static void copyFileToDir(String toDir, String[] filePath) {
if (toDir == null || "".equals(toDir)) { // 目录路径为空
System.out.println("参数错误,目标路径不能为空");
return;
}
File targetFile = new File(toDir);
if (!targetFile.exists()) { // 如果指定目录不存在
targetFile.mkdir(); // 新建目录
} else {
if (!targetFile.isDirectory()) { // 如果不是目录
System.out.println("参数错误,目标路径指向的不是一个目录!");
return;
}
}
for (int i = 0; i < filePath.length; i++) { // 遍历需要复制的文件路径
File file = new File(filePath[i]); // 创建文件
if (file.isDirectory()) { // 判断是否是目录
// 递归调用方法获得目录下的文件
copyFileToDir(toDir + "/" + file.getName(), listFile(file));
System.out.println("复制文件 " + file);
} else {
copyFileToDir(toDir, file, ""); // 文件到指定目录
}
}
}
// 复制文件到指定目录
public static void copyFileToDir(String toDir, File file, String newName) {
String newFile = "";
if (newName != null && !"".equals(newName)) {
newFile = toDir + "/" + newName;
} else {
newFile = toDir + "/" + file.getName();
}
File tFile = new File(newFile);
copyFile(tFile, file); // 调用方法复制文件
}
public static void copyFile(File toFile, File fromFile) { // 复制文件
if (toFile.exists()) { // 判断目标目录中文件是否存在
System.out.println("文件" + toFile.getAbsolutePath() + "已经存在,跳过该文件!");
return;
} else {
createFile(toFile, true); // 创建文件
}
System.out.println("复制文件" + fromFile.getAbsolutePath() + "到"
+ toFile.getAbsolutePath());
try { // 创建文件输入流
InputStream is = new FileInputStream(fromFile);
FileOutputStream fos = new FileOutputStream(toFile);// 文件输出流
byte[] buffer = new byte[1024]; // 字节数组
while (is.read(buffer) != -1) { // 将文件内容写到文件中
fos.write(buffer);
}
is.close(); // 输入流关闭
fos.close(); // 输出流关闭
} catch (FileNotFoundException e) { // 捕获文件不存在异常
e.printStackTrace();
} catch (IOException e) { // 捕获异常
e.printStackTrace();
}
}
public static String[] listFile(File dir) { // 获取文件绝对路径
String absolutPath = dir.getAbsolutePath(); // 获取传入文件的路径
String[] paths = dir.list(); // 文件名数组
String[] files = new String[paths.length]; // 声明字符串数组,长为传入文件的个数
for (int i = 0; i < paths.length; i++) { // 遍历显示文件绝对路径
files[i] = absolutPath + "/" + paths[i];
}
return files;
}
public static void createFile(String path, boolean isFile) {// 创建文件或目录
createFile(new File(path), isFile); // 调用方法创建新文件或目录
}
public static void createFile(File file, boolean isFile) { // 创建文件
if (!file.exists()) { // 如果文件不存在
if (!file.getParentFile().exists()) { // 如果文件父目录不存在
createFile(file.getParentFile(), false);
} else { // 存在文件父目录
if (isFile) { // 创建文件
try {
file.createNewFile(); // 创建新文件
} catch (IOException e) {
e.printStackTrace();
}
} else {
file.mkdir(); // 创建目录
}
}
}
}
public static void main(String[] args) { // java程序主入口处
String fromPath = "E:/createFile"; // 目录路径
String toPath = "F:/createFile"; // 源路径
System.out.println("1.移动文件:从路径 " + fromPath + " 移动到路径 " + toPath);
try {
fileMove(fromPath, toPath); // 调用方法实现文件的移动
} catch (Exception e) {
System.out.println("移动文件出现问题" + e.getMessage());
}
System.out.println("2.复制目录 " + toPath + " 下的文件(不包括该目录)到指定目录" + fromPath
+ " ,会连同子目录一起复制过去。");
copyFileFromDir(fromPath, toPath); // 调用方法实现目录复制
System.out.println("3.复制目录 " + fromPath + "到指定目录 " + toPath
+ " ,将目录以及目录下的文件和子目录全部复制到目标目录");
// 调用方法实现目录以用目录下的文件和子目录全部复制
copyDir(toPath, fromPath);
}
}
文件和目录的复制与移动。包括单个文件的移动复制、复制目录到指定目录连同目录下的子目录一起复制、将目录以及目录下的文件和子目录全部复制。具体代码如下:
package com.java.ch152;
import java.io.File; //引入类
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
//实现文件的简单处理,复制和移动文件、目录等
public class TextCopyFileAndMove {
// 移动指定文件夹内的全部文件
public static void fileMove(String from, String to) throws Exception {
try {
File dir = new File(from);
File[] files = dir.listFiles(); // 将文件或文件夹放入文件集
if (files == null) // 判断文件集是否为空
return;
File moveDir = new File(to); // 创建目标目录
if (!moveDir.exists()) { // 判断目标目录是否存在
moveDir.mkdirs(); // 不存在则创建
}
for (int i = 0; i < files.length; i++) {// 遍历文件集
// 如果是文件夹或目录,则递归调用fileMove方法,直到获得目录下的文件
if (files[i].isDirectory()) {
// 递归移动文件
fileMove(files[i].getPath(), to + "\\" + files[i].getName());
files[i].delete(); // 删除文件所在原目录
}
// 将文件目录放入移动后的目录
File moveFile = new File(moveDir.getPath() + "\\"
+ files[i].getName());
if (moveFile.exists()) { // 目标文件夹下存在的话,删除
moveFile.delete();
}
files[i].renameTo(moveFile); // 移动文件
System.out.println(files[i] + " 移动成功");
}
} catch (Exception e) {
throw e;
}
}
// 复制目录下的文件(不包括该目录)到指定目录,会连同子目录一起复制过去。
public static void copyFileFromDir(String toPath, String fromPath) {
File file = new File(fromPath);
createFile(toPath, false); // true:创建文件 false创建目录
if (file.isDirectory()) { // 如果是目录
copyFileToDir(toPath, listFile(file));
}
}
// 复制目录到指定目录,将目录以及目录下的文件和子目录全部复制到目标目录
public static void copyDir(String toPath, String fromPath) {
File targetFile = new File(toPath); // 创建文件
createFile(targetFile, false); // 创建目录
File file = new File(fromPath); // 创建文件
if (targetFile.isDirectory() && file.isDirectory()) { // 如果传入是目录
copyFileToDir(targetFile.getAbsolutePath() + "/" + file.getName(),
listFile(file)); // 复制文件到指定目录
}
}
// 复制一组文件到指定目录。targetDir是目标目录,filePath是需要复制的文件路径
public static void copyFileToDir(String toDir, String[] filePath) {
if (toDir == null || "".equals(toDir)) { // 目录路径为空
System.out.println("参数错误,目标路径不能为空");
return;
}
File targetFile = new File(toDir);
if (!targetFile.exists()) { // 如果指定目录不存在
targetFile.mkdir(); // 新建目录
} else {
if (!targetFile.isDirectory()) { // 如果不是目录
System.out.println("参数错误,目标路径指向的不是一个目录!");
return;
}
}
for (int i = 0; i < filePath.length; i++) { // 遍历需要复制的文件路径
File file = new File(filePath[i]); // 创建文件
if (file.isDirectory()) { // 判断是否是目录
// 递归调用方法获得目录下的文件
copyFileToDir(toDir + "/" + file.getName(), listFile(file));
System.out.println("复制文件 " + file);
} else {
copyFileToDir(toDir, file, ""); // 文件到指定目录
}
}
}
// 复制文件到指定目录
public static void copyFileToDir(String toDir, File file, String newName) {
String newFile = "";
if (newName != null && !"".equals(newName)) {
newFile = toDir + "/" + newName;
} else {
newFile = toDir + "/" + file.getName();
}
File tFile = new File(newFile);
copyFile(tFile, file); // 调用方法复制文件
}
public static void copyFile(File toFile, File fromFile) { // 复制文件
if (toFile.exists()) { // 判断目标目录中文件是否存在
System.out.println("文件" + toFile.getAbsolutePath() + "已经存在,跳过该文件!");
return;
} else {
createFile(toFile, true); // 创建文件
}
System.out.println("复制文件" + fromFile.getAbsolutePath() + "到"
+ toFile.getAbsolutePath());
try { // 创建文件输入流
InputStream is = new FileInputStream(fromFile);
FileOutputStream fos = new FileOutputStream(toFile);// 文件输出流
byte[] buffer = new byte[1024]; // 字节数组
while (is.read(buffer) != -1) { // 将文件内容写到文件中
fos.write(buffer);
}
is.close(); // 输入流关闭
fos.close(); // 输出流关闭
} catch (FileNotFoundException e) { // 捕获文件不存在异常
e.printStackTrace();
} catch (IOException e) { // 捕获异常
e.printStackTrace();
}
}
public static String[] listFile(File dir) { // 获取文件绝对路径
String absolutPath = dir.getAbsolutePath(); // 获取传入文件的路径
String[] paths = dir.list(); // 文件名数组
String[] files = new String[paths.length]; // 声明字符串数组,长为传入文件的个数
for (int i = 0; i < paths.length; i++) { // 遍历显示文件绝对路径
files[i] = absolutPath + "/" + paths[i];
}
return files;
}
public static void createFile(String path, boolean isFile) {// 创建文件或目录
createFile(new File(path), isFile); // 调用方法创建新文件或目录
}
public static void createFile(File file, boolean isFile) { // 创建文件
if (!file.exists()) { // 如果文件不存在
if (!file.getParentFile().exists()) { // 如果文件父目录不存在
createFile(file.getParentFile(), false);
} else { // 存在文件父目录
if (isFile) { // 创建文件
try {
file.createNewFile(); // 创建新文件
} catch (IOException e) {
e.printStackTrace();
}
} else {
file.mkdir(); // 创建目录
}
}
}
}
public static void main(String[] args) { // java程序主入口处
String fromPath = "E:/createFile"; // 目录路径
String toPath = "F:/createFile"; // 源路径
System.out.println("1.移动文件:从路径 " + fromPath + " 移动到路径 " + toPath);
try {
fileMove(fromPath, toPath); // 调用方法实现文件的移动
} catch (Exception e) {
System.out.println("移动文件出现问题" + e.getMessage());
}
System.out.println("2.复制目录 " + toPath + " 下的文件(不包括该目录)到指定目录" + fromPath
+ " ,会连同子目录一起复制过去。");
copyFileFromDir(fromPath, toPath); // 调用方法实现目录复制
System.out.println("3.复制目录 " + fromPath + "到指定目录 " + toPath
+ " ,将目录以及目录下的文件和子目录全部复制到目标目录");
// 调用方法实现目录以用目录下的文件和子目录全部复制
copyDir(toPath, fromPath);
}
}
以上程序中,TextCopyFileAndMove类的fileMove()方法移动指定文件夹内的全部文件。根据传入的路径创建文件目录,根据listFiles()方法获得目录中的文件与子文件夹。创建目标目录并判断目标是否存在。利用循环将目录中的文件移动到指定的目录,如果循环得到的是文件夹运用递归获得该文件夹中的文件,再删除文件所在的原目录,将获得的文件放入指定的目录。如果目标文件夹存在则删除该文件夹。将获得的文件根据renameTo()方法移动到指定的文件夹。
copyFileFromDir()方法复制目录下的文件到指定的目录,会连同子目录一起复制过去,其中不包括该目录。根据指定目录创建文件对象,调用createFile()方法创建文件对象,由于传递的第二个参数为false则是创建目录,如果参数为true,则是创建文件。根据目标路径创建文件对象。如果创建的都是目录时,则调用copyFileToDir()方法将指定目录中的文件复制到目标目录中。
copyFileToDir()方法复制一组文件到指定目录。判断指定目录是否为空,如果为空则返回。根据目标路径创建文件对象,如果该文件对象不存在,则新建该目录对象,否则判断文件对象是否是目录,如果不是目录则返回。运用循环遍历需要复制的文件路径,根据路径创建相应的文件对象,如果该文件对象是目录,则调用copyFileDir()方法通过listFile()方法获得目录中的文件并将文件复制到指定目录中,如果是文件则直接将文件复制到目录中。
copyFile()方法是复制文件到指定的目录中。File类的exists()方法判断指定文件是否存在,如果存在则返回,否则调用createFile()方法创建文件。根据传入的目标文件创建输入流,再根据流对象创建文件输出流,创建字节数组用来存储流读取的数据。根据读取的数据不为空进行循环,利用文件输出流的write()方法将目标文件的内容写入到指定文件中,读取完毕后释放相关的流资源。
listFile()方法获得指定目录下的文件,并将文件的绝对路径放入字符串数组中返回。文件对象list()方法是获得目录中的文件,运用循环将目录中的文件的绝对路径放字符串数组中返回。
createFile()方法判断文件是否存在,如果不存在则判断该文件的上级目录是否存在,如果不存在则调用createFile()方法创建该目录,否则判断上级目录是否是文件,如果是文件则创建新文件否则创建目录。
运行结果如下所示。
1.移动文件:从路径 E:/createFile 移动到路径 F:/createFile
E:\createFile\file1.txt 移动成功
E:\createFile\temp1\file1.txt 移动成功
E:\createFile\temp1 移动成功
E:\createFile\temp26661.txt 移动成功
E:\createFile\temp26662.txt 移动成功
……
2.复制目录 F:/createFile 下的文件(不包括该目录)到指定目录E:/createFile ,会连同子目录一起复制过去。
复制文件F:\createFile\createFile\file1.txt到E:\createFile\createFile\file1.txt
复制文件F:\createFile\createFile\temp1\file1.txt到E:\createFile\createFile\temp1\file1.txt
复制文件 F:\createFile\createFile\temp1
复制文件F:\createFile\createFile\temp26661.txt到E:\createFile\createFile\temp26661.txt
……
3.复制目录 E:/createFile到指定目录 F:/createFile ,将目录以及目录下的文件和子目录全部复制到目标目录
复制文件E:\createFile\createFile\file1.txt到F:\createFile\createFile\createFile\file1.txt
复制文件 E:\createFile\createFile\temp1
复制文件 E:\createFile\createFile
文件F:\createFile\createFile\file1.txt已经存在,跳过该文件!
文件F:\createFile\createFile\temp1\file1.txt已经存在,跳过该文件!
文件F:\createFile\createFile\temp26661.txt已经存在,跳过该文件!
……