我正在尝试用Java创建一个模块化程序,它将搜索共享驱动器并返回所有文件名,然后过滤掉并重命名名称中包含非法字符的文件(例如/:*?“<> |')
我意识到Windows几乎每个字符都不允许作为文件名的一部分,但是它们都是作为列表的一部分给出的。到目前为止,我所拥有的代码有点混乱,是一种协作努力。我能够成功地将文件从一个目录复制到另一个目录,但生成的文件是空白的。如何正确获取文件并将其中包含的所有数据复制到新目录中,并从文件名中删除所有违规字符实例?
如果此问题的任何部分代表了常见问题解答中的重复,我们深表歉意。
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.nio.file.Files;
import java.util.Scanner;
import static java.nio.file.StandardCopyOption.*;
public class FileIO {
public static void main(String[] args) throws IOException {
String location = "C:\\Users\\000000000\\Desktop\\TestFiles";
File[] files = new File(location).listFiles();
new File(location + "/Altered/").mkdir();
String fileName;
for (File file : files) {
file.toString();
fileName = file.toString();
String[] array = fileName.split("\\\\");
fileName = array[array.length - 1];
fileName = fileName.replaceAll("\\\\", "");
fileName = fileName.replaceAll("/", "");
fileName = fileName.replaceAll(":", "");
fileName = fileName.replaceAll("\\*", "");
fileName = fileName.replaceAll("\\?", "");
fileName = fileName.replaceAll("\"", "");
fileName = fileName.replaceAll("<", "");
fileName = fileName.replaceAll(">", "");
fileName = fileName.replaceAll("|", "");
fileName = fileName.replaceAll("'", "");
System.out.println(fileName);
File outfile = new File(location + "/altered/" + fileName);
if (!outfile.exists()) {
try {
outfile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
PrintWriter outFile = new PrintWriter(new BufferedWriter(
new FileWriter(outfile, true)));
Scanner inFile = new Scanner(file);
while (inFile.hasNext()) {
String line = inFile.nextLine();
System.out.println(line);
if (line != null) {
outFile.println(line);
}
continue;
}
}
}
}
答案 0 :(得分:0)
您的代码看起来对我很好 - 您应该解释为什么它在您的问题中无效。
使用Java 8方法Files.walk()和Files.walkFileTree()(后者可能在早期的java版本中可用),而不是for循环,您会发现这种任务更容易。
答案 1 :(得分:0)
我看到一些问题:
File#renameTo(File)
方法。如果您要复制文件,则应按块而不是行进行。 Java 8 NIO中有一些新的Files#copy(Path,Path,CopyOption...)
。 (https://docs.oracle.com/javase/tutorial/essential/io/copy.html)