android - 如何从文件中检索 MPAndroidChart ArrayList
android - How to retrieve MPAndroidChart ArrayList from file
我在我的应用程序中使用 MPAndroidChart,我想将 ArrayList
保存在一个文件中,供以后使用。
这是我将其保存到内部存储文件中的位置:
ArrayList<Entry> entries = getIntent().getParcelableArrayListExtra(getString(R.string.entries_key));
// Save chart data
FileOutputStream out;
try {
out = openFileOutput("listFile", MODE_PRIVATE);
ObjectOutputStream outputStream = new ObjectOutputStream(out);
outputStream.writeObject(entries);
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
这里是我尝试检索它的地方,但返回的 ArrayList
不包含任何数据和我的 LineChart
中的默认文本 ("No chart data available"):
File listFile = new File(getFilesDir(), "listFile");
if(listFile.exists()) {
FileInputStream inputStream = null;
try {
inputStream = openFileInput("listFile");
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
// This line is evil
ArrayList <Entry> entries = (ArrayList<Entry>) objectInputStream.readObject();
// Set chart properties
chart = ChartUtils.setChartProperties(chart);
LineDataSet lineDataSet = ChartUtils.createSet(ChartViewer.this, entries);
LineData data = new LineData(lineDataSet);
chart.setData(data);
// Let the chart knows data has changed
chart.notifyDataSetChanged();
chart.invalidate();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
我仔细检查了一下,我确定我正在读取正确的文件,所以问题一定出在这一行
ArrayList <Entry> entries = (ArrayList<Entry>) objectInputStream.readObject();
我在这里找到了这种从文件中读取 ArrayList 的方法 How to write an ArrayList to file and retrieve it?
我该怎么做才能解决这个问题?
谢谢
ObjectOutputStream 的文档说:
Only objects that support the java.io.Serializable interface can be
written to streams
ArrayList
实现了 Serializable
接口,但它引用了 Entry
class 而没有实现。因此,Entry
对象未序列化(即未保存或恢复)。
我以一种笨拙的方式解决了它。我创建了一个实现 Serializable
的自定义 MyEntry
class
public class MyEntry implements Serializable {
private float x;
private float y;
public MyEntry(float x, float y) {
this.x = x;
this.y = y;
}
public MyEntry(){
}
public float getX() {
return x;
}
public float getY() {
return y;
}
public void setX(float x) {
this.x = x;
}
public void setY(float y) {
this.y = y;
}
}
然后,当我需要保存数据时,我从 ArrayList<Entry>
中获取它们并将它们存储在 ArrayList<MyEntry>
中
// Save chart data
FileOutputStream out = null;
out = openFileOutput(recordName, MODE_PRIVATE);
ObjectOutputStream outputStream = new ObjectOutputStream(out);
ArrayList<MyEntry> myEntries = new ArrayList<>();
for (int k = 0; k < entries.size(); k++) {
Entry currentEntry = entries.get(k);
MyEntry currentMyEntry = new MyEntry();
currentMyEntry.setX(currentEntry.getX());
currentMyEntry.setY(currentEntry.getY());
myEntries.add(currentMyEntry);
}
outputStream.writeObject(myEntries);
outputStream.close();
当我需要读回值时,我从 MyEntry
对象中取出它们并放入 Entry
对象
FileInputStream inputStream;
inputStream = openFileInput(fileListName);
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
ArrayList <MyEntry> myEntries = (ArrayList<MyEntry>) objectInputStream.readObject();
ArrayList<Entry> entries = new ArrayList<>();
for (int i = 0; i < myEntries.size(); i++) {
MyEntry currentMyEntry = myEntries.get(i);
Entry currentEntry = new Entry();
currentEntry.setX(currentMyEntry.getX());
currentEntry.setY(currentMyEntry.getY());
entries.add(currentEntry);
}
// Set chart properties
chart = ChartUtils.setChartProperties(chart);
LineDataSet lineDataSet = ChartUtils.createSet(ChartViewer.this, entries);
LineData data = new LineData(lineDataSet);
chart.setData(data);
我在我的应用程序中使用 MPAndroidChart,我想将 ArrayList
保存在一个文件中,供以后使用。
这是我将其保存到内部存储文件中的位置:
ArrayList<Entry> entries = getIntent().getParcelableArrayListExtra(getString(R.string.entries_key));
// Save chart data
FileOutputStream out;
try {
out = openFileOutput("listFile", MODE_PRIVATE);
ObjectOutputStream outputStream = new ObjectOutputStream(out);
outputStream.writeObject(entries);
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
这里是我尝试检索它的地方,但返回的 ArrayList
不包含任何数据和我的 LineChart
中的默认文本 ("No chart data available"):
File listFile = new File(getFilesDir(), "listFile");
if(listFile.exists()) {
FileInputStream inputStream = null;
try {
inputStream = openFileInput("listFile");
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
// This line is evil
ArrayList <Entry> entries = (ArrayList<Entry>) objectInputStream.readObject();
// Set chart properties
chart = ChartUtils.setChartProperties(chart);
LineDataSet lineDataSet = ChartUtils.createSet(ChartViewer.this, entries);
LineData data = new LineData(lineDataSet);
chart.setData(data);
// Let the chart knows data has changed
chart.notifyDataSetChanged();
chart.invalidate();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
我仔细检查了一下,我确定我正在读取正确的文件,所以问题一定出在这一行
ArrayList <Entry> entries = (ArrayList<Entry>) objectInputStream.readObject();
我在这里找到了这种从文件中读取 ArrayList 的方法 How to write an ArrayList to file and retrieve it?
我该怎么做才能解决这个问题? 谢谢
ObjectOutputStream 的文档说:
Only objects that support the java.io.Serializable interface can be written to streams
ArrayList
实现了 Serializable
接口,但它引用了 Entry
class 而没有实现。因此,Entry
对象未序列化(即未保存或恢复)。
我以一种笨拙的方式解决了它。我创建了一个实现 Serializable
MyEntry
class
public class MyEntry implements Serializable {
private float x;
private float y;
public MyEntry(float x, float y) {
this.x = x;
this.y = y;
}
public MyEntry(){
}
public float getX() {
return x;
}
public float getY() {
return y;
}
public void setX(float x) {
this.x = x;
}
public void setY(float y) {
this.y = y;
}
}
然后,当我需要保存数据时,我从 ArrayList<Entry>
中获取它们并将它们存储在 ArrayList<MyEntry>
// Save chart data
FileOutputStream out = null;
out = openFileOutput(recordName, MODE_PRIVATE);
ObjectOutputStream outputStream = new ObjectOutputStream(out);
ArrayList<MyEntry> myEntries = new ArrayList<>();
for (int k = 0; k < entries.size(); k++) {
Entry currentEntry = entries.get(k);
MyEntry currentMyEntry = new MyEntry();
currentMyEntry.setX(currentEntry.getX());
currentMyEntry.setY(currentEntry.getY());
myEntries.add(currentMyEntry);
}
outputStream.writeObject(myEntries);
outputStream.close();
当我需要读回值时,我从 MyEntry
对象中取出它们并放入 Entry
对象
FileInputStream inputStream;
inputStream = openFileInput(fileListName);
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
ArrayList <MyEntry> myEntries = (ArrayList<MyEntry>) objectInputStream.readObject();
ArrayList<Entry> entries = new ArrayList<>();
for (int i = 0; i < myEntries.size(); i++) {
MyEntry currentMyEntry = myEntries.get(i);
Entry currentEntry = new Entry();
currentEntry.setX(currentMyEntry.getX());
currentEntry.setY(currentMyEntry.getY());
entries.add(currentEntry);
}
// Set chart properties
chart = ChartUtils.setChartProperties(chart);
LineDataSet lineDataSet = ChartUtils.createSet(ChartViewer.this, entries);
LineData data = new LineData(lineDataSet);
chart.setData(data);