2016-06-16 7 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を与えます。なぜ私はそれがパスとは何かを持っていると思います。

編集:私は、コードを変更した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

どのような種類のファイルを読み書きしようとしていますか? 。TXT? .doc?何か? – lucasvw

+0

@lucasvw本当にすべてのタイプのファイルはプレーンテキストなので、基本的にテキストファイルとコードファイルです。 –

+0

ideを使用して文字列を置き換えない理由はありますか? –

答えて

0

回答者のコメントで@Daniel Oが提案したように、java.util.Scannerクラスを使用すると効果があるようです。

ヒットワード:少なくともこの質問で投稿したコードでは、ファイルを読むために非常に複雑な表現を使用します。その式を複数の行に分割して途中で途中の値を印刷して、特定の部分が失敗していることを確認できましたか?それ以外の場合は、java.util.Scannerのように別の方法でファイルを読むことができます。

2

テキスト操作のためにファイルをバイトとして読み込まないでください。試してFiles.readAllLines()とし、各ファイルの行を繰り返します。

プログラムがテキスト以外のファイルを読み取っているようです。 String(bytes []、Charset)のドキュメントから:

このメソッドは、不正な入力文字列およびマップ不可能文字列を、この文字セットのデフォルト置換文字列で置き換えます。 CharsetDecoderクラスは、デコード処理をさらに制御する必要がある場合に使用する必要があります。

この方法を使用すると、テキスト以外のファイルの「一致」も変更されることにご注意ください。

+0

私はこれについてのテストを持っています:) –

+0

試してみましたが、うまくいきません:\。 –

+1

訂正された文字列がまだ空であることを意味しますか?または、変更がディスクに書き込まれていないことを意味しますか? –

関連する問題