0

次のコードを使用して、単純なテキスト ファイルに文字列を書き込みます。

編集:

private String fileLocation="/mnt/sdcard/out.txt";

public void saveHisToFile()
{
    if (prefs.getBoolean("saveHis", true) && mWordHis != null && mWordHis.size() >= 1)
    {
        StringBuilder sbHis = new StringBuilder();          
        Set<String> wordSet= new HashSet<String>(mWordHis);
        for (String item : wordSet)
        {
            sbHis.append(item);
            sbHis.append("\n");
        }

        String strHis = sbHis.substring(0, sbHis.length()-1);  
        try {
             BufferedWriter bw = new BufferedWriter(new FileWriter(new File(
                     fileLocation), true));
             bw.write(strHis);
             bw.newLine();
             bw.close();
        } catch (IOException e) {

        }
    }
}

文字列はテキスト ファイルに正常に書き込まれますが、奇妙なことに、次のような一部の文字列が上書きされます。

apple
orange
grapes
grapes
grapes
apple 
kiwi

私の質問は:

  1. 文字列が複数回書き込まれるのを止めるにはどうすればよいですか?
  2. 文字列 (行) がファイルに既に存在する場合、ファイルへの書き込みを停止するにはどうすればよいですか?

この投稿を参照しましたが、自分のケースには適用できませんでした。少し手伝ってくれませんか?よろしくお願いします。

4

4 に答える 4

1

これは、問題を解決する方法の完全な例です。

      import java.io.BufferedReader;
      import java.io.BufferedWriter;
      import java.io.File;
      import java.io.FileReader;
      import java.io.FileWriter;
      import java.io.IOException;
      import java.util.HashSet;

      public class HisSaver {
        private HashSet<String> uniqueTester = new HashSet<String>();

        private String fileLocation="/mnt/sdcard/out.txt";

        private static HisSaver instance = null;


        private HisSaver() {
            readWordsFromFile();
        }

        public static HisSaver getInstance() {
            if(instance == null)
                instance = new HisSaver();
            return instance;
        }

        public void saveWord(String word) {
            if(!uniqueTester.contains(word)) {
                uniqueTester.add(word);
                writeWordToFile(word);
            }
        }

        private void writeWordToFile(String word) {
          try {
               BufferedWriter bw = new BufferedWriter(new FileWriter(new File(
                       fileLocation), true));
               bw.write(word);
               bw.newLine();
               bw.close();
          } catch (IOException e) {

          }
        }

        private void readWordsFromFile() {
          try {
            BufferedReader br = new BufferedReader(new FileReader(new File(
                fileLocation)));
            String line;
            while((line = br.readLine()) != null) {
                if(!uniqueTester.contains(line)) {
                    uniqueTester.add(line);
                }
            }
          } catch (IOException e) {

          }
        }
      }

これを使用するには、コードで次のことを行うだけです。

    HisSaver hs = HisSaver.getInstance();
    hs.saveWord("newWord");

これにより、コード内の他の関数がこのファイルにアクセスしない場合に限り、「newWord」がファイルにまだ存在しない場合にのみ挿入されます。注意: このソリューションはスレッドセーフではありません!!!

編集: コードの動作の説明: シングルトンであるクラス HisSaver を作成します。これは、コンストラクターを非公開にし、初期化された HisSaver を返す静的メソッド getInstance() を提供することによって実現されます。この HisSaver には、ファイル内の既存のすべての単語が既に含まれているため、新しい単語のみがファイルに追加されます。別のクラスから getInstance() メソッドを呼び出すと、このシングルトンのハンドルが得られ、インスタンス化できるインスタンスは 1 つしかないため、適切なオブジェクトを手に持っているかどうかを心配することなく saveWord を呼び出すことができます。

于 2013-05-27T11:45:55.270 に答える