Итак, недавно мне было поручено заменить повторяющуюся фразу в ряде документов другой фразой. Я ожидал, что один документ, который я мог бы расчесывать, но это куча огромных каталогов с тоннами этих файлов.Java - Замените содержимое файлов в каталоге
Мой мозг разработчиков взлетел, и поэтому я, хотя и из функции replaceAll()
, создал этот небольшой метод найти все файлы в каталоге и все его подкаталоги, и он работал нормально.
private static ArrayList<File> getAllFilesInDirectory(File directory) {
ArrayList<File> filesInDirectory = new ArrayList<File>();
if(!directory.isDirectory()) {
filesInDirectory.add(directory);
return filesInDirectory;
} else {
for(File fileInDirectory : directory.listFiles()) {
if(!fileInDirectory.isDirectory())
filesInDirectory.add(fileInDirectory);
else
filesInDirectory.addAll(getAllFilesInDirectory(fileInDirectory));
}
return filesInDirectory;
}
}
Так после немного поработав, я разработал программу, чтобы заменить все фразы в директории с другой фразой:
package xyz.ammartarajia.programs.rasid;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
public class RASID {
public static void main(String[] args) {
JFileChooser chooser = new JFileChooser();
chooser.setCurrentDirectory(new File("."));
chooser.setDialogTitle("Open Directory...");
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
chooser.setAcceptAllFileFilterUsed(false);
chooser.showOpenDialog(null);
String toReplace = JOptionPane.showInputDialog(null, "Please enter what you'd like to replace.", "To Replace", JOptionPane.QUESTION_MESSAGE),
replaceWith = JOptionPane.showInputDialog(null, "Please enter what you'd like to replace the previous string with.", "Replace With", JOptionPane.QUESTION_MESSAGE);
ArrayList<File> files = getAllFilesInDirectory(chooser.getSelectedFile());
for(File file : files) {
try(BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
String newString = new String(Files.readAllBytes(Paths.get(file.getPath())), Charset.defaultCharset()).replaceAll(toReplace, replaceWith);
System.out.println("New String: " + newString);
writer.write(newString);
writer.close();
} catch(IOException e) {
JOptionPane.showMessageDialog(null, "An error ocurred whilst editing the file!", "Error", JOptionPane.ERROR_MESSAGE);
e.printStackTrace();
}
}
}
private static ArrayList<File> getAllFilesInDirectory(File directory) {
ArrayList<File> filesInDirectory = new ArrayList<File>();
if(!directory.isDirectory()) {
filesInDirectory.add(directory);
return filesInDirectory;
} else {
for(File fileInDirectory : directory.listFiles()) {
if(!fileInDirectory.isDirectory())
filesInDirectory.add(fileInDirectory);
else
filesInDirectory.addAll(getAllFilesInDirectory(fileInDirectory));
}
return filesInDirectory;
}
}
}
Проблема с программой является то, что при чтении файла в файле как String
, он решает провалиться и вместо этого дать мне пустой String
. Я не уверен, почему, но я думаю, что это имеет какое-то отношение к путям.
EDIT: Я изменил код, это не казалось, сделал никакой разницы с использованием метода readAllLines(Path, Charset)
. Вот новый код:
package xyz.ammartarajia.programs.rasid;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
public class RASID {
public static void main(String[] args) {
JFileChooser chooser = new JFileChooser();
chooser.setCurrentDirectory(new File("."));
chooser.setDialogTitle("Open Directory...");
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
chooser.setAcceptAllFileFilterUsed(false);
chooser.showOpenDialog(null);
String toReplace = JOptionPane.showInputDialog(null, "Please enter what you'd like to replace.", "To Replace", JOptionPane.QUESTION_MESSAGE),
replaceWith = JOptionPane.showInputDialog(null, "Please enter what you'd like to replace the previous string with.", "Replace With", JOptionPane.QUESTION_MESSAGE);
ArrayList<File> files = getAllFilesInDirectory(chooser.getSelectedFile());
for(File file : files) {
try(BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
String newString = new String(combineLines(Files.readAllLines(Paths.get(file.getPath()), Charset.defaultCharset()))).replaceAll(toReplace, replaceWith);
System.out.println("New String: " + newString);
writer.write(newString);
writer.close();
} catch(IOException e) {
JOptionPane.showMessageDialog(null, "An error ocurred whilst editing the file!", "Error", JOptionPane.ERROR_MESSAGE);
e.printStackTrace();
}
}
}
private static String combineLines(List<String> lines) {
String linesAsString = "";
for(String line : lines)
linesAsString += line + '\n';
return linesAsString;
}
private static ArrayList<File> getAllFilesInDirectory(File directory) {
ArrayList<File> filesInDirectory = new ArrayList<File>();
if(!directory.isDirectory()) {
filesInDirectory.add(directory);
return filesInDirectory;
} else {
for(File fileInDirectory : directory.listFiles()) {
if(!fileInDirectory.isDirectory())
filesInDirectory.add(fileInDirectory);
else
filesInDirectory.addAll(getAllFilesInDirectory(fileInDirectory));
}
return filesInDirectory;
}
}
}
Какие файлы вы пытаетесь прочитать/написать? .текст? .doc? что-то другое? – lucasvw
@lucasvw Действительно любой тип файла в виде обычного текста, поэтому в основном текстовые файлы и файлы кода. –
Есть ли причина, почему вы не используете свой идеал для замены этих строк? –