文件(进程间通信)

简单的分析了一下需求,项目中一共两个Activity,其中第一个Activity里面有一个按钮,当点击按钮的时候,跳转到第二个Activity中,并且跳转之前要往文件里面写入数据。

通过文件流的方式来得到具体的数据

第一步,建立两个Activity,并且运行在不同的进程中,所以这里面我们在第二个Activity中声明了第二个进程:

<activity
    android:name=".SecondActivity"
    android:process=":second"></activity>

这里面直接用process的关键字声明了有第二个进程。

我们在建立一个实体类的对象,这个对象是我们用来传递数据的,这里面又一个坑,就是这个实体类必须实现包裹化,否则,会爆出以下的异常

java.io.WriteAbortedException: Read an exception; java.io.NotSerializableException: yjc.com.filejinchng.Person

这里面提示我们数据没有序列化,虽然我也不知道为什么要序列化,,尴尬了,,照做就是了,给她个序列化

public class Person implements  Serializable {
    private String name;
    private int age;

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
可以看到这里面我有复习了toString的方法,这样复写了之后,就不会调用父类的方法了,直接就把字符串打印了出来的
然后在第一个Activity中的将一个对象写入数据流中,如下面所示
public class MainActivity extends AppCompatActivity {
    private Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button= (Button) findViewById(R.id.button1);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent=new Intent(MainActivity.this,SecondActivity.class);
                try {
                    FileOutputStream person = openFileOutput("person", MODE_PRIVATE);
                    ObjectOutputStream objectOutputStream=new ObjectOutputStream(person);
                    Person person1=new Person();
                    person1.setName("fff");
                    person1.setAge(11);
                    objectOutputStream.writeObject(person1);
                    objectOutputStream.flush();
                    objectOutputStream.close();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }


                startActivity(intent);
            }
        });
    }
}
这里是发送数据的一方,这里面通过onpenFileOutput的方法打开了一个输出流,并在这个输出流里面写入了数据的名字和访问数据的权限,这里面数据的访问的权限是私有的
然后通过开启ObjectOutPutStream这个方法将数据流写入了,然后新建立一个对象,将这个对象放入流中。发送出去
 
最后在接受的地方,也需要相同的步骤,只是这个步骤不是FileOutPutStream了是FileInPutStream流,如下面所示:
public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        setContentView(R.layout.second);
        super.onCreate(savedInstanceState);
        try {
            FileInputStream person = openFileInput("person");
            ObjectInputStream objectInputStream=new ObjectInputStream(person);
            Object o = objectInputStream.readObject();
            objectInputStream.close();
            Log.d("SecondActivity", "o:" + o);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
这样就实现了文件的通讯的方式了。

 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值