Java 将文件保存到arraylist并写回文件;安卓

Java 将文件保存到arraylist并写回文件;安卓,java,android,Java,Android,我一直在尝试打开一个文本文件,并将每一行保存为arraylist的内容。一旦这已经完成,我想把它保存回一个文件。我已经遇到了这么长时间的错误,并尝试了许多技术。我发现由于某些原因,文件本身没有被创建。这可能只是我忽略的一个简单错误,但如果你能提供任何帮助,我将不胜感激 代码如下: public void addToFile(){ File root = new File(Environment.getExternalStorageDirectory().getAbsolutePath() +

我一直在尝试打开一个文本文件,并将每一行保存为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();
    }
}

这是我唯一需要修改的代码。保存回文件的代码正常工作。我希望这对某人有用,并感谢大家的帮助。

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

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

此代码适用于我的项目。您可以使用它将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。

不要发明自己的序列化格式。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(); 
ArrayList文件=…;//无论什么
//将对象写入文件
ObjectOutput out=newObjectOutputStream(newFileOutputStream(“filename.ser”));
out.writeObject(文件);
out.close();
//读回对象
InputStream is=新文件InputStream(“filename.ser”);
ObjectInputStream ois=新ObjectInputStream(is);
ArrayList newFiles==(ArrayList)ois.readObject();
ois.close();

检查您首先使用的设备上是否存在文件目录等

/appName/savedlocations很可能这些不存在。appName或savedLocations的名称错误。使用一些文件资源管理器程序检查这一点。告诉我们它是否存在。打印出的完整路径名

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

看看它是否真的存在。只需下载一个用于查看文件的应用程序,或者我认为您也可以通过eclipse连接到该设备。如果你需要更多关于如何做的信息,请告诉我们。但是,您应该首先检查实际的错误消息,并将其报告。

是的,我有另一个活动,它保存到文本文件中,并且不会出现错误。但出于某种原因,这不起作用。你没有问过同样的问题吗?你能得到发生的错误的堆栈跟踪并发布吗?你应该发布错误或者至少把它们写出来。Do“无法保存回文件:”+error.getMessage()或。它也应该在logview中。事实上,如果你不发布错误消息,人们很有可能会从这个问题中得出结论。所以请现在就这样做,记住这一点。这段代码中最关键的一点是您没有记录错误消息。请记录错误消息。没有理由只告诉自己你有一些错误,而不报告错误消息的细节。我正在手机上运行应用程序,为了使用sd卡,我必须断开sd卡与计算机的连接,这使得登录变得有点困难。但是,我将尝试在emulator上运行它并发布日志文件。我不明白为什么要将对象读入文件类型的arraylist。我将arraylist声明为字符串类型。我不希望文件中的每个对象都保存为另一个文件。你能给我解释一下吗?这样我才能更好地理解你在这里干什么。@Jeffrey Blattman:他不是连载。他正试图逐行写入和读取txt文件。我们不知道他稍后对这些文本文件做了什么,所以我们无法进行概括。另外,他使用的是字符串的数组列表,而不是文件。@babatenor no,除非文章中有具体说明,否则我们可以进行归纳。如果他需要它们作为平面文本文件,psot应该这样说。好的,将文件更改为字符串,您就完成了。@user1478764 1)不管怎样,用字符串替换文件。2) “我不希望每个对象…另存为另一个文件”这并不能做到这一点。它将字符串列表保存到文件中。除非您有其他保留平面文件的要求,否则这是最面向对象的解决方案。您有一个对象(一个列表),希望将其持久化到一个文件中,并在以后还原它。如果你读了他的代码,你就可以很容易地理解他正在写回一个txt文件(但没有这样做)。另外,他试图从txt文件读回数据也证明了这一点……我使用“root.mkdirs();”创建了目录。然后我检查了我的sd卡,目录本身被创建了,但文件没有。此外,我还使用了toast消息来打印字符串文件和文件2,路径似乎是正确的。我很不明白为什么。我将尝试尽快发布日志文件,这样可能更容易找到解决方案。