当我试图在android中将数据写入文件时
我试图将模型类数据写入json文件,下面是我的代码 activity_main.xml当我试图在android中将数据写入文件时,android,Android,我试图将模型类数据写入json文件,下面是我的代码 activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_par
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:padding="5dp"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Name:"
android:textSize="21dp"
android:id="@+id/txtName" />
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/editName"
android:hint="Name"
android:paddingLeft="10dp"
android:textColorHint="@color/colorAccent"/>
<View
android:layout_width="wrap_content"
android:layout_height="25dp"></View>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="City:"
android:textSize="21dp"
android:id="@+id/txtCity" />
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/editCity"
android:hint="City"
android:paddingLeft="10dp"
android:textColorHint="@color/colorAccent"/>
<View
android:layout_width="wrap_content"
android:layout_height="25dp"></View>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Mobile:"
android:textSize="21dp"
android:id="@+id/txtMobile" />
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="phone"
android:ems="10"
android:paddingLeft="10dp"
android:id="@+id/editMobile"
android:hint="Mobile"
android:textColorHint="@color/colorAccent"/>
<View
android:layout_width="wrap_content"
android:layout_height="25dp"></View>
<Button
android:id="@+id/btnInsert"
android:layout_width="match_parent"
android:layout_height="50dp"
android:textAlignment="center"
android:text="Insert"
android:textSize="21dp"
android:textColor="#FFFFFF"
android:background="@color/colorAccent"/>
</LinearLayout>
这是我的mainActivity.java
package com.domore.jsonserialization;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import com.google.gson.Gson;
import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import model.Student;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
EditText name,city,mobile;
Button insert;
int id=1;
FileOutputStream fos=null;
BufferedOutputStream bos=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
name=(EditText)findViewById(R.id.editName);
city=(EditText)findViewById(R.id.editCity);
mobile=(EditText)findViewById(R.id.editMobile);
insert=(Button)findViewById(R.id.btnInsert);
insert.setOnClickListener(this);
}
@Override
public void onClick(View v) {
Student std=new Student();
std.setId(id);
std.setName(name.getText().toString());
std.setCity(city.getText().toString());
std.setPhno(mobile.getText().toString());
Gson gson=new Gson();
String json=gson.toJson(std);
Log.e("name:",std.getName());
Log.e("json Data",""+json);
try{
fos=new FileOutputStream("D:\\Student.json");
byte b[]=json.getBytes();
fos.write(b);
fos.close();
}
catch (FileNotFoundException ffe){
ffe.printStackTrace();
}
catch(IOException e){
e.printStackTrace();
}
finally {
try{
fos.close();
}
catch (IOException e){
e.printStackTrace();
}
}
}
}
我得到了如下2个错误
第一个错误
11-26 11:18:08.680 2608-2608/? W/System.err: java.io.FileNotFoundException: D:\Student.json: open failed: EROFS (Read-only file system)
11-26 11:18:08.680 2608-2608/? W/System.err: at libcore.io.IoBridge.open(IoBridge.java:456)
11-26 11:18:08.680 2608-2608/? W/System.err: at java.io.FileOutputStream.<init>(FileOutputStream.java:87)
11-26 11:18:08.680 2608-2608/? W/System.err: at java.io.FileOutputStream.<init>(FileOutputStream.java:127)
11-26 11:18:08.680 2608-2608/? W/System.err: at java.io.FileOutputStream.<init>(FileOutputStream.java:116)
11-26 11:18:08.681 2608-2608/? W/System.err: at com.domore.jsonserialization.MainActivity.onClick(MainActivity.java:63)
FATAL EXCEPTION: main
11-26 11:18:08.682 2608-2608/? E/AndroidRuntime: Process: com.domore.jsonserialization, PID: 2608
11-26 11:18:08.682 2608-2608/? E/AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'void java.io.FileOutputStream.close()' on a null object reference
11-26 11:18:08.682 2608-2608/? E/AndroidRuntime: at com.domore.jsonserialization.MainActivity.onClick(MainActivity.java:76)
11-26 11:18:08.682 2608-2608/? E/AndroidRuntime: at android.view.View.performClick(View.java:4756)
11-26 11:18:08.682 2608-2608/? E/AndroidRuntime: at android.view.View$PerformClick.run(View.java:19749)
11-26 11:18:08.682 2608-2608/? E/AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:739)
11-26 11:18:08.682 2608-2608/? E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95)
11-26 11:18:08.682 2608-2608/? E/AndroidRuntime: at android.os.Looper.loop(Looper.java:135)
11-26 11:18:08.682 2608-2608/? E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5221)
11-26 11:18:08.682 2608-2608/? E/AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
11-26 11:18:08.682 2608-2608/? E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:372)
11-26 11:18:08.682 2608-2608/? E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
11-26 11:18:08.682 2608-2608/? E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
11-26 11:18:08.695 1238-1252/? W/ActivityManager: Force finishing activity com.domore.jsonserialization/.MainActivity
请告诉我该怎么做,建议我解决这个错误这是您读取和写入文件的方式 首先,获取文件对象 您需要存储路径。对于内部存储,请使用:
File path = context.getFilesDir();
对于外部存储器(SD卡),请使用:
然后创建文件对象:
File file = new File(path, "my-file-name.txt");
将字符串写入文件
FileOutputStream stream = new FileOutputStream(file);
try {
stream.write("text-to-write".getBytes());
} finally {
stream.close();
}
还是谷歌番石榴
Files.write("text-to-write", file, "UTF-8");
String contents = Files.toString(file,"UTF-8");
将文件读取为字符串
int length = (int) file.length();
byte[] bytes = new byte[length];
FileInputStream in = new FileInputStream(file);
try {
in.read(bytes);
} finally {
in.close();
}
String contents = new String(bytes);
或者如果你正在使用谷歌番石榴
Files.write("text-to-write", file, "UTF-8");
String contents = Files.toString(file,"UTF-8");
为了完整起见,我要提到
String contents = new Scanner(file).useDelimiter("\\A").next();
它不需要库,但基准测试比其他选项慢50%-400%(在我的Nexus5的各种测试中)
注释
对于这些策略中的每一种,都会要求您捕获一个IOException
Android上的默认字符编码是UTF-8
如果您使用的是外部存储,则需要在清单中添加以下内容之一:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
或
“写入”权限意味着“读取”权限,所以您不需要两者兼有。问题标题可能更好。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>