[英]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.