0

是的,我一直在努力寻找解决方案,但由于某种原因它无法正常工作。

简而言之,我想做的是将用户输入的每个输入字符串保存到文件中。每次再次创建活动时,我都想将这些字符串重新输入到对象的新实例中。

这段代码是我用来创建文件并从中读取信息的代码,用于活动的 onCreate() 方法

    try {

        String brain = "brain";
        File file = new File(this.getFilesDir(), brain);
        if (!file.exists()) {
            file.createNewFile();
        }      

        BufferedReader in = new BufferedReader(new FileReader(file));
        String s; // This feeds the object MegaAndroid with the strings, sequentially 
        while ((s = in.readLine()) != null) {
            MegaAndroid.add(s);
        }
        in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

之后,每次用户输入一些文本时,字符串都会保存到文件中:

    try {

        String brain = "brain";
        File file = new File(this.getFilesDir(), brain);
        if (!file.exists()) {
            file.createNewFile();
        }

    BufferedWriter out = new BufferedWriter(new FileWriter(file));
    out.write(message); // message is a string that holds the user input
    out.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

然而,由于某种原因,每次应用程序被终止时,数据都会丢失。我究竟做错了什么?

编辑:另外,如果我要从另一个班级访问这个文件,我该怎么办?

4

2 回答 2

1

正如我们在推荐部分中讨论的那样,代码的主要问题是您的执行FileWriter发生在您的FileReader操作之前,同时截断了文件。为了维护文件内容,您要将写入操作设置为append

BufferedWriter out = new BufferedWriter(new FileWriter(file,true));
out.write(message);
out.newLine();
out.close();

但是,如果接收到 EditText 上的每个条目,然后将其发送到文件中,您将只是在它旁边一个字节一个字节地写入数据。很容易得到类似的内容

这是第 1 行这是第 2 行

而不是想要的

这是第 1 行
这是第 2 行

这可以通过让 BufferedWriter 在每次写入文件后传递一个换行符来纠正。

于 2013-02-06T17:20:57.490 回答
1

这就是我为文件读取所做的。

try{

        File sdCard = Environment.getExternalStorageDirectory();
        File dir = new File (sdCard.getAbsolutePath() + "/whereyouwantfile");
        dir.mkdirs();

        Log.d(TAG,"path: "+dir.getAbsolutePath());
        File file = new File(dir, "VERSION_FILENAME");

        FileInputStream f = new FileInputStream(file);

        //FileInputStream fis = context.openFileInput(VERSION_FILENAME);
        BufferedReader reader = new BufferedReader(new InputStreamReader(f));

        String line = reader.readLine();
        Log.d(TAG,"first line versions: "+line);
        while(line != null){
            Log.d(TAG,"line: "+line);
            //Process line how you need 
            line = reader.readLine();
        }

        reader.close();
        f.close();
    }
    catch(Exception e){
        Log.e(TAG,"Error retrieving cached data.");

    }

以下是写作

try{

        File sdCard = Environment.getExternalStorageDirectory();
        File dir = new File (sdCard.getAbsolutePath() + "/whereyouwantfile");
        dir.mkdirs();
        File file = new File(dir, "CONTENT_FILENAME");

        FileOutputStream f = new FileOutputStream(file);

        //FileOutputStream fos = context.openFileOutput(CONTENT_FILENAME, Context.MODE_PRIVATE);
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(f));

        Set<String> keys = Content.keySet();

        for(String key : keys){

            String data = Content.get(key);
            Log.d(TAG,"Writing: "+key+","+data);

            writer.write(data);
            writer.newLine();
        }

        writer.close();
        f.close();

    }
    catch(Exception e){
        e.printStackTrace();
        Log.e(TAG,"Error writing cached data.");

    }

如果您不希望世界其他地方能够看到您的文件,则可以使用私有模式,但在调试时查看它们通常很有用。

于 2013-02-06T16:46:05.783 回答