2016-06-16 4 views
1

Итак, недавно мне было поручено заменить повторяющуюся фразу в ряде документов другой фразой. Я ожидал, что один документ, который я мог бы расчесывать, но это куча огромных каталогов с тоннами этих файлов.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; 
     } 
    } 
} 
+0

Какие файлы вы пытаетесь прочитать/написать? .текст? .doc? что-то другое? – lucasvw

+0

@lucasvw Действительно любой тип файла в виде обычного текста, поэтому в основном текстовые файлы и файлы кода. –

+0

Есть ли причина, почему вы не используете свой идеал для замены этих строк? –

ответ

0

Как @Daniel O предложил в комментарии своего ответа, используя класс java.util.Scanner, похоже, сработал!

Его слова: По крайней мере, в коде, который вы отправили с этим вопросом, вы используете очень сложное выражение для чтения файла. Вы пытались сломать это выражение на нескольких строках, распечатывая промежуточные значения вдоль пути, чтобы вы могли видеть, какая конкретная часть не работает? Если все остальное не удается, вы можете просто прочитать файл по-другому, например, с помощью java.util.Scanner.

2

Вы не должны читать файл в виде байтов для обработки текста. Попробуйте Files.readAllLines() и выполните итерацию по строкам каждого файла.

Ваша программа, кажется, читает нетекстовый файл. Из документации для String (байты [], Charset):

Этот метод всегда заменяет последовательности символов с неправильным вводом и неизменяемым символом с этой заменяющей строкой этого набора символов. Класс CharsetDecoder следует использовать, когда требуется больше контроля процесса декодирования.

Следует иметь в виду, что использование этой стратегии также изменит «соответствия» в нетекстовых файлах.

+0

У меня будет тест на это :) –

+0

Пробовал, кажется, не работает: \. –

+1

Вы имеете в виду, что строка с исправлениями по-прежнему пуста? Или вы имеете в виду, что изменения не записываются на диск? –

Смежные вопросы