0

テキスト ファイルを開いて、各行を arraylist の内容として保存しようとしています。これが完了したら、ファイルに保存したいと思います。私は長い間エラーに遭遇しており、数多くのテクニックを試してきました。何らかの理由で、ファイル自体が作成されていないことがわかりました。見落としている単純なエラーかもしれませんが、何か助けていただければ幸いです。

コードは次のとおりです。

public void addToFile(){

File root = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/appName/savedlocations");
root.mkdirs();
File fileName = new File(root, "locationslatitude.txt");
File fileName2 = new File(root, "locationslongitude.txt");

String file = fileName.toString();
String file2 = fileName2.toString();

String theContent = Double.toString(currLatitude);
String theContent2 = Double.toString(currLongitude);

s = new Scanner(file);
    while (s.hasNext()){
        fileList.add(s.next());
    }
    s.close();
    fileList.add(theContent);



    s2 = new Scanner(file2);
    while (s2.hasNext()){
        fileList2.add(s2.next());
    }
    s2.close();
    fileList2.add(theContent2);


try {//works for latitude file
        FileWriter writer = new FileWriter(file); 
        for(String str: fileList) { 
          writer.write(str);
          writer.write("\r\n");
        }
        writer.close();
        } catch (java.io.IOException error) {
          //do something if an IOException occurs.
            Toast.makeText(this, "Cannot Save Back To A File", Toast.LENGTH_LONG).show();
    }
//save the arraylist back to its appropriate file
    try {//works for longitude file
        FileWriter writer = new FileWriter(file2); 
        for(String str2: fileList2) { 
          writer.write(str2);
          writer.write("\r\n");
        }
        writer.close();
    } catch (java.io.IOException error) {
      //do something if an IOException occurs.
        Toast.makeText(this, "Cannot Save Back To A File", Toast.LENGTH_LONG).show();
    }
}

私は問題に対する答えを見つけたと信じており、ここに投稿したかったので、他の誰かが同じ問題に直面している場合、これは彼らを助けるかもしれません.

問題は、ファイルを作成していなかったことです。ディレクトリは「root.mkdirs();」を使用して作成されました。ただし、ファイルは作成されず、存在しないファイルから読み取ろうとしていました。これがエラーの原因だと思います。したがって、この問題を修正するために、コードを次のように変更しました。

  try{

        s = new Scanner(fileName);
        while (s.hasNext()){
            fileList.add(s.next());
        }
        s.close();
                fileList.add(theContent);

}catch (FileNotFoundException ex){
    ex.printStackTrace();
    try{
        fileName.createNewFile();
    }catch (IOException e){
        e.printStackTrace();
        Toast.makeText(this, "Hit IOException for file one", Toast.LENGTH_SHORT).show();
    }
}

try{  
        s2 = new Scanner(fileName2);
        while (s2.hasNext()){
            fileList2.add(s2.next());
        }
        s2.close();
                fileList2.add(theContent2);
}catch (FileNotFoundException ex){
    ex.printStackTrace();
    try{
        fileName2.createNewFile();
    }catch (IOException e){
        e.printStackTrace();
        Toast.makeText(this, "Hit IOException for file two", Toast.LENGTH_SHORT).show();
    }
}

これは、私が変更しなければならなかった唯一のコードでした。ファイルに保存したコードは機能しました。これが誰かに役立つことを願っています。皆さんの助けに感謝します。

4

4 に答える 4

1

このコードは私のプロジェクトで機能します。これを使用して、ArrayList の内容をテキスト ファイルに保存できます。事前にディレクトリが作成されていることを確認してください。リストを反復処理し、println メソッドを使用して txt ファイルに書き込みます。

FileWriter outFile = new FileWriter(Environment.getExternalStorageDirectory().getAbsolutePath() + "/appName/savedlocations/nameoftextfile.txt");
PrintWriter out = new PrintWriter(outFile);
out.println("PRINT LINES WITH ME");
out.print("NOT NECCESSARILY A NEW LINE");
out.close(); // at the very end

IOException をキャッチすることを忘れないでください。

于 2012-07-17T00:34:01.163 に答える
1

AndroidManifest.xml に次の権限を追加しましたか?

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
于 2012-07-17T00:10:15.237 に答える
0

最初に使用しているデバイスにファイルディレクトリなどが存在するかどうかを確認します

/appName/savedlocations これらは存在しない可能性が高いです。appName または savedLocations の名前が間違っています。ファイルエクスプローラープログラムを使用してこれを確認してください。存在するかどうか教えてください。のフルパス名を出力します

      Environment.getExternalStorageDirectory().getAbsolutePath() + "/appName/savedlocations

そして、それが本当に存在するかどうかを確認してください。ファイル表示用のアプリをダウンロードするか、Eclipse 経由でデバイスに接続することもできると思います。その方法についてさらに詳しい情報が必要な場合は、お知らせください。ただし、最初に実際のエラー メッセージを確認し、これを報告する必要があります。

于 2012-07-17T01:30:41.000 に答える
-3

独自のシリアル化形式を発明しないでください。Javaにはすでにそれがあります。

ArrayList<String> files = ...; // whatever

// write the object to a file

ObjectOutput out = new ObjectOutputStream(new FileOutputStream("filename.ser"));
out.writeObject(files);
out.close();

// read the object back

InputStream is = new FileInputStream("filename.ser"); 
ObjectInputStream ois = new ObjectInputStream(is); 
ArrayList<String> newFiles = = (ArrayList)ois.readObject(); 
ois.close(); 
于 2012-07-17T00:52:16.493 に答える