当我试图在android中将数据写入文件时

当我试图在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

我试图将模型类数据写入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_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"/>