簡體   English   中英

Android - 如何逐行將ArrayList寫入文本文件並將其讀回?

[英]Android - How can I write an ArrayList to a text file line by line and read it back?

我對Android / Java編程非常陌生(在VB中有一些經驗並且在很多年前在大學里學過一些C ++課程但是沒有記住任何東西),所以我提前為此頭痛道歉。

我正在使用Android Studio,而且我已經在這里工作了幾天(很多谷歌搜索)並且無法按照我想要的方式運行任何東西。 我可以寫一個文本文件,可以從文本文件中讀取,但不能讓它逐行寫入,逐行讀取,甚至計算開始的行數(我最初的想法是,如果我可以數我可以循環寫入/讀取多少行,但我只是錯過了它。

我知道有些代碼很草率,我正在學習來自網絡上的各種示例。 目前,它將創建ArrayList項,將其顯示在第一個ListView中並將其寫入文本文件,然后我可以將其讀回到第二個ListView中,但它采用單行格式,如下所示:

[Testing - how are you?, I'm good and you?, Great, thanks!]

我在網上找到的逐行寫/讀的示例要么不起作用,要么依賴我不想使用的第三方依賴,並弄清楚如何自己做。 先感謝您!

package com.example.thedoctor.readwritearraylists;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    ArrayList<String> origitems;
    ArrayList<String> newitems;

    ArrayAdapter<String> origitemsAdapter;
    ArrayAdapter<String> newitemsAdapter;

    ListView lvOrigItems;
    ListView lvNewItems;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lvOrigItems = (ListView) findViewById(R.id.lvOriginal);
        lvNewItems = (ListView) findViewById(R.id.lvNew);

        origitems = new ArrayList<String>();
        newitems = new ArrayList<String>();

        origitemsAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, origitems);
        newitemsAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, newitems);

        lvOrigItems.setAdapter(origitemsAdapter);
        lvNewItems.setAdapter(newitemsAdapter);

    }

    public void makeArray(View v) {
        origitemsAdapter.add("Testing - how are you?");
        origitemsAdapter.add("I'm good and you?");
        origitemsAdapter.add("Great, thanks!");
        origitemsAdapter.notifyDataSetChanged();
    }

    public void saveItems(View v) {
        String file = "myfile.txt";
        String huh = String.valueOf(origitems);
        try {
            FileOutputStream fileout = openFileOutput(file, MODE_PRIVATE);
            OutputStreamWriter outputWriter = new OutputStreamWriter(fileout);
            outputWriter.write(String.valueOf(huh) + System.getProperty("line.separator"));
            outputWriter.close();

            //display file saved message
            Toast.makeText(getBaseContext(), "File saved successfully!", Toast.LENGTH_SHORT).show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void readItems(View v) {
        String file = "myfile.txt";
        int READ_BLOCK_SIZE = 100;

        try {
            FileInputStream fileIn = openFileInput(file);
            InputStreamReader InputRead = new InputStreamReader(fileIn);
            char[] inputBuffer = new char[READ_BLOCK_SIZE];
            String s = "";
            int charRead;

            while ((charRead = InputRead.read(inputBuffer)) > 0) {
                // char to string conversion
                String readstring = String.copyValueOf(inputBuffer, 0, charRead);
                s += readstring;
            }
            newitemsAdapter.add(s);
            newitemsAdapter.notifyDataSetChanged();
            InputRead.close();
            Toast.makeText(getBaseContext(), "The file " + file + " has been read from internal storage\n", Toast.LENGTH_SHORT).show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

嘗試使用ObjectInputStream而不是InputStreamReader 由於ArrayList是Serializable,因此您可以將對象本身直接反序列化為ArrayList對象。 我是這樣做的:

private ArrayList<String> getSavedArrayList() {
    ArrayList<String> savedArrayList = null;

    try {
        FileInputStream inputStream = openFileInput("your.filename");
        ObjectInputStream in = new ObjectInputStream(inputStream);
        savedArrayList = (ArrayList<String>) in.readObject();
        in.close();
        inputStream.close();

    } catch (IOException | ClassNotFoundException e) {
        e.printStackTrace();
    }

    return savedArrayList;
}

當然,這意味着您必須通過使用ObjectOutputStream序列化原始對象來保存ArrayList 你可以這樣做:

private void saveArrayList(ArrayList<String> arrayList) {
    try {
        FileOutputStream fileOutputStream = openFileOutput("your.filename", Context.MODE_PRIVATE);
        ObjectOutputStream out = new ObjectOutputStream(fileOutputStream);
        out.writeObject(arrayList);
        out.close();
        fileOutputStream.close();

    } catch (IOException e) {
        e.printStackTrace();
    }
}

用於將ArrayList寫入文件

  private ArrayList<ModelClass> getSavedArrayList() {
    ArrayList<ModelClass> savedArrayList = null;
    File direct = new File(Environment.getExternalStorageDirectory() + "/" + getResources().getString(R.string.app_name));
    if (!direct.exists()) {
        direct.mkdirs();
    }

    try {
        DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(direct + "/girls.html")));
        for (int i = 0; i < params.size(); i++) {
            ModelClass data = params.get(i);
            String links = data.link.toString() + "\n\n";
            dos.writeChars(links);
        }
        dos.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return savedArrayList;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM