У меня есть (текстовый) файл на диске, который мне нужно прочитать в библиотеку, которая принимает объект Reader.
При чтении этого файла я хочу выполнить регулярную замену строки в данных.
Мое текущее решение - прочитать весь файл в память как одну строку, выполнить замену строки, а затем создать StringReader для этой строки и передать ее обратно в библиотеку в качестве читателя.
Это работает, однако с большими файлами (особенно работающими в нескольких потоках) производительность является проблемой.
Что я хотел бы сделать - это прочитать каждую строку из файла за раз, заменить в этой подстрокеи затем молча вернулся к потребителю Читателя - но я не могу придумать, как это сделать.
Есть ли лучший способ решить эту задачу?
Я использую Java7
Ниже приведен пример моего текущего решения - чтение из «файла», замена всех «а» на «б» и последующая передача потока потребителю.
public void loadFile(final File file) throws Exception
{
final Pattern regexPattern = Pattern.compile("a");
final String replacementString = "b";
try (BufferedReader cleanedBufferedReader = new BufferedReader(new StringReader(replaceInBufferedReader(new BufferedReader(new FileReader(file)),
regexPattern, replacementString))))
{
new StreamSource(cleanedBufferedReader).doSomething();
}
}
private static String replaceInBufferedReader(final BufferedReader reader, final Pattern pattern, final String replacement) throws IOException
{
final StringBuilder builder = new StringBuilder();
String str;
while ((str = reader.readLine()) != null)
{
builder.append(str).append(System.lineSeparator());
}
return pattern.matcher(builder.toString()).replaceAll(replacement);
}