0

我一直在尝试打开一个文本文件并将每一行保存为数组列表的内容。完成后,我想将其保存回文件。我已经遇到错误很长时间了,并且尝试了许多技术。我发现由于某种原因,文件本身没有被创建。这可能只是我忽略的一个简单错误,但如果您能提供任何帮助,我将不胜感激。

这是代码:

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

您是否在 AndroidManifest.xml 中添加了以下权限?

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
于 2012-07-17T00:10:15.237 回答
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 回答
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 回答