zoukankan      html  css  js  c++  java
  • android之文件存储和读取

    一、权限问题


     

      手机中存储空间分为ROM和SDcard,ROM中放着操作系统以及我们安装的APP,而sdcard中一般放置着我们APP产生的数据。当然,Android也为每个APP在ROM中创建一个数据存储空间,具体目录是/data/data下。在真机中调试中,该目录对于其他用户是没有开启任何权限,所以在DDMS中我们是打不开该目录的。

      解决方案就是我们通过adb登录到我们手机上,然后直接切换到root用户,这时后手机可能会询问是否授权,我们则选择允许。这样我们就成为root用户了。然后我们在更改/data目录的权限,这样就能在DDMS上看到/data下的内容了。具体操纵如下:

    二、布局设置


     

    <?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="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:orientation="vertical"
        tools:context="xidian.dy.com.chujia.MainActivity">
        <EditText
            android:id="@+id/username"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="请输入用户名"/>
        <EditText
            android:id="@+id/password"
            android:inputType="textPassword"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="请输入密码"/>
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
            <CheckBox
                android:id="@+id/remember"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="记住用户名和密码"
                android:layout_centerVertical="true"/>
            <Button
                android:id="@+id/login"
                android:layout_alignParentRight="true"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="登录"/>
        </RelativeLayout>
    </LinearLayout>

    三、java代码


     

    package xidian.dy.com.chujia;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.telephony.SmsManager;
    import android.util.Log;
    import android.util.PrintWriterPrinter;
    import android.view.View;
    import android.widget.Button;
    import android.widget.CheckBox;
    import android.widget.EditText;
    import android.widget.Toast;
    
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    import java.util.List;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Button bt = (Button) findViewById(R.id.login);
            bt.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    EditText etUsername = (EditText) findViewById(R.id.username);
                    String username = etUsername.getText().toString();
                    EditText etPassword = (EditText) findViewById(R.id.password);
                    String password = etPassword.getText().toString();
                    Log.e("Login", "登录成功");
                    CheckBox cb = (CheckBox) findViewById(R.id.remember);
                    if(cb.isChecked()){
                        String path = "/data/data/xidian.dy.com.chujia/info.txt";
                        File file = new File(path);
                        PrintWriter pw = null;
                        try {
                            pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file))));
                        } catch (FileNotFoundException e) {
                            Log.e("MainActivity","file not found");
                        }
                        pw.println(username);
                        pw.println(password);
                        pw.close();
                    }
    
                }
            });
        }
    }

      Android为每个app在/data/data下创建一个文件夹,文件夹的名字就是APP的包名。我们的APP报名为xidian.dy.com.chujia,所以为了保存用户数据,我在/data/data/xidian.dy.com.chujia/创建一个infro.txt文件夹,然后将用户名和密码包存到该文件夹下。对用户名和密码的保存就使用普通的java IO流即可。

    三、文件之读操作


     使用普通的IO流将info.txt文件中的数据读取出来,这里不牵扯读写权限问题,因为该线程的所属用户是对自己的目录进行操作的。

    package xidian.dy.com.chujia;
    
    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.CheckBox;
    import android.widget.EditText;
    
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    
    public class MainActivity extends AppCompatActivity {
    
        private EditText etUsername;
        private EditText etPassword;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Button bt = (Button) findViewById(R.id.login);
            etUsername = (EditText) findViewById(R.id.username);
            etPassword = (EditText) findViewById(R.id.password);
            if (bt != null)
                bt.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        String username = null;
                        String password = null;
                        if (etUsername != null)
                            username = etUsername.getText().toString();
                        if (etPassword != null)
                            password = etPassword.getText().toString();
                        Log.e("Login", "登录成功");
                        CheckBox cb = (CheckBox) findViewById(R.id.remember);
                        if (cb != null && cb.isChecked()) {
                            File file = new File(getFilesDir(), "info.txt");
                            PrintWriter pw;
                            try {
                                pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file))));
                                pw.println(username);
                                pw.println(password);
                                pw.close();
                            } catch (FileNotFoundException e) {
                                Log.e("MainActivity", "file not found");
                            }
                        }
                    }
                });
            this.readAccount();
        }
    
        public void readAccount() {
            File file = new File(getFilesDir(), "info.txt");
            if (file.exists()) {
                try {
                    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
                    String str = br.readLine();
                    if (etUsername != null)
                        etUsername.setText(str);
                    str = br.readLine();
                    if (etPassword != null)
                        etPassword.setText(str);
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
  • 相关阅读:
    轻量级分布式任务调度框架(二、LTS编译、打包、部署)
    轻量级分布式任务调度框架(一、LTS简介、特点、工作流程)
    MySQL数据库学习一
    Navicat 连接 SQL Server 数据库,报错 08001
    noVNC 遇到一个错误: Uncaught TypeError: Cannot read property 'forEach' of undefined
    加强自己VPS服务器安全的一次经历
    Python 编码错误的本质和解决方案
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'data' at line 1
    requests爬虫请求报错:UnicodeEncodeError: 'latin-1' codec can't encode character 'u2026' in position 30
    docker无法删除镜像,Error: No such container,附docker常用命令
  • 原文地址:https://www.cnblogs.com/xidongyu/p/5558305.html
Copyright © 2011-2022 走看看