这会复制文件内容。
此实现在下面的示例中完美运行(您可以将其复制并粘贴到 java 文件中,它会编译并执行您想要的操作)。唯一的潜在缺点是它会跳过两者之间的“版本”。所以如果它有 A1.txt 和 A3.txt,它只会创建 A4.txt。它也无法处理没有扩展名的文件,但我认为这对你来说并不重要。
如果文件已经存在,则打印“失败”,否则由于某种原因无法创建文件。
请注意,您可以在命令行中指定文件目录,否则它将使用当前工作目录。
它还会递归搜索下面的文件夹,如果您只想搜索当前/指定的文件目录,只需在getFilesForFolder方法中删除return fileMap;之前的else语句即可。
之前:
~/当前目录
- A1.txt
- A4.txt
- B1.txt
- ~/当前目录/asdf
之后:
~/当前目录
- A1.txt
- A4.txt
- A5.txt
- B1.txt
- B2.txt
- ~/当前目录/asdf
- A1.txt
- A2.txt
- B1.txt
- B5.txt
- B6.txt
import java.io.File;
import java.io.IOException;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.Map;
import java.util.HashMap;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class Files {
static File folder;
static List<String> files;
public static void main(String[] args) {
if (args.length > 0)
folder = new File(args[0]);
else
folder = new File(System.getProperty("user.dir") + "/testfiles");
Map<File, Map<String, Integer>> files = new HashMap<File, Map<String, Integer>>();
files = getFilesForFolder(folder);
writeFile(files);
}
public static void writeFile(Map<File, Map<String, Integer>> files) {
String fileName;
for (Map.Entry<File, Map<String, Integer>> mapOfMapEntry : files.entrySet()) {
File originalFile = mapOfMapEntry.getKey();
for (Map.Entry<String, Integer> entry : (mapOfMapEntry.getValue()).entrySet()) {
fileName = entry.getKey();
try {
int i = fileName.contains(".") ? fileName.lastIndexOf('.') : fileName.length();
fileName = fileName.substring(0, i) + Integer.toString(entry.getValue() + 1) + fileName.substring(i);
File file = new File(fileName);
if (file.createNewFile()) {
System.out.println("Success: " + file.getAbsolutePath());
//File originalFile = new File(entry.getKey());
InputStream in = new FileInputStream(originalFile);
OutputStream out = new FileOutputStream(file);
byte[] buffer = new byte[1024];
int length;
while ((length = in.read(buffer)) > 0) {
out.write(buffer, 0, length);
}
in.close();
out.close();
} else {
//currently has duplicate value in map
//I tried to remove them but it was taking too long to debug
//I might come back to it later,
//otherwise you're just wasting a bit of computational resources
//by trying to create the same file multiple times
System.out.println("Failure: " + file.getAbsolutePath());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//note this is recursive and will search files
//in subdirectories. you can change this by removing the else clause before return map
public static Map<File, Map<String, Integer>> getFilesForFolder(File folder) {
Map<File, Map<String, Integer>> mapOfMap = new HashMap<File, Map<String, Integer>>();
Map<String, Integer> fileMap = new HashMap<String, Integer>();
Integer number;
//any non-digit character 0-inf amount of times, any digit character, 0-inf amount of times,
//then a period, then the rest of the extension
Pattern pattern = Pattern.compile("(\\D*)(\\d*)(\\.\\w*)?");
//match each file in the file directory with the above regex expr
for (final File fileEntry : folder.listFiles()) {
if (!(fileEntry.isDirectory())) {
Matcher m = pattern.matcher(fileEntry.getAbsolutePath());
while (m.find()) {
number = fileMap.get(m.group(1) + m.group(3));
if (number != null) {
//the key/value already exist in the filemap
//check to see if we should use the new number or not
if (Integer.parseInt(m.group(2)) > number) {
fileMap.put(m.group(1) + m.group(3), (Integer.parseInt(m.group(2))));
mapOfMap.put(fileEntry, fileMap);
}
} else if (!m.group(1).equals("")) {
//the map is empty and the file has no number appended to it
if (m.group(3) == null) {
fileMap.put(m.group(1), 0);
mapOfMap.put(fileEntry, fileMap);
} else {
//the map is empty and the file already has a number appended to it
fileMap.put(m.group(1) + m.group(3), (Integer.parseInt(m.group(2))));
mapOfMap.put(fileEntry, fileMap);
}
}
}
}
else {
for (Map.Entry<File, Map<String, Integer>> entry : getFilesForFolder(fileEntry).entrySet()) {
mapOfMap.put(entry.getKey(), entry.getValue());
}
}
}
return mapOfMap;
}
}