魔乐科技安卓开发教程----李兴华----01文件存储

1.查看模拟器data文件夹

到…sdk\platform-tools文件夹下Shift+鼠标右键打开命令窗口(win7),输入adb root回车然后输入adb remount回车,
出现remount succeeded说明成功

实际上只需要 dbd root之后再as中的file explorer就可以查看,不再显示权限问题

2.FileOutputStream,openFileoutput输出普通文件
public class MainActivity extends AppCompatActivity {
    private static final String FILENAME="shareTxt.txt";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        FileOutputStream out=null;
        try {
            out=openFileOutput(FILENAME,MODE_PRIVATE);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        PrintStream printStream=new PrintStream(out);
        printStream.println("新型冠装肺炎");
        printStream.println("火神山医院");
        printStream.println("什么时候才能解封");
        printStream.close();
        try {
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
2.FileOutput,openFileinput,Scanner读取普通文件并显示

布局

<TextView
        android:id="@+id/showText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=""
        android:textSize="18sp"/>

activity

public class MainActivity extends AppCompatActivity {
    private static final String FILENAME="shareTxt.txt";
    private TextView showText;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        FileInputStream input=null;
        showText=findViewById(R.id.showText);
        try {
            input=openFileInput(FILENAME);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        Scanner scanner=new Scanner(input);//扫描流
        while (scanner.hasNext()){
            showText.append(scanner.next()+"\n");
        }
        scanner.close();

    }
}
3.动态获取sd卡读写权限

Android6.0以上读写sd卡权限需动态赋权

另一例见:
android 6.0及以上动态权限的获取
例如:

 private String permssionRequestCode []={Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.RECORD_AUDIO,Manifest.permission.MODIFY_AUDIO_SETTINGS};

//动态请求各种权限
        ActivityCompat.requestPermissions(this,permssionRequestCode, 0);
        ActivityCompat.requestPermissions(this,permssionRequestCode, 1);
        ActivityCompat.requestPermissions(this,permssionRequestCode,2);

具体如下:
新建公共类如下:

import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.support.v4.app.ActivityCompat;
 
import static com.cosber.wse.atf.utils.LogUtils.myLog;
 
public class PermisionUtils {
    // Storage Permissions
    private static final int REQUEST_EXTERNAL_STORAGE = 1;
    private static String[] PERMISSIONS_STORAGE = {
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE};
    public static void verifyStoragePermissions(Activity activity) {//检查权限
        int permission = ActivityCompat.checkSelfPermission(activity,
                Manifest.permission.WRITE_EXTERNAL_STORAGE);
 
        if (permission != PackageManager.PERMISSION_GRANTED) {//无权限
            ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,
                    REQUEST_EXTERNAL_STORAGE);//动态赋权
        }
    }
}

然后直接在需要授权的地方调用:

verifyStoragePermissions(this);

4.在sd卡上创建文件
public class MainActivity extends AppCompatActivity {
    private static final String FILENAME="mystore.txt";
    private static final String DIR="fengray";
    private TextView showText;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        verifyStoragePermissions(this);//动态请求sd读取权限
        

        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){//获取存储卡状态,判断是否拥有存储卡
            File file=new File(Environment.getExternalStorageDirectory()+File.separator+DIR+File.separator+FILENAME);
            if (!file.getParentFile().exists()){
                file.getParentFile().mkdirs();//在父级上创建目录
            }
            PrintStream out=null;
            try {
                out=new PrintStream(new FileOutputStream(file));
                out.println("andorid开发");
                out.println("IOS开发");
                out.println("JAVA开发");
                out.println("JAVA-EE开发");
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }finally {
                if (out!=null){
                    out.close();
                }
            }

        }else{
            Toast.makeText(this, "保存失败,sd卡不存在", Toast.LENGTH_SHORT).show();
        }
    }
}
4.在sd卡上读取文件
public class MainActivity extends AppCompatActivity {
    private static final String FILENAME="mystore.txt";
    private static final String DIR="fengray";
    private TextView showText;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        showText=findViewById(R.id.showText);
        verifyStoragePermissions(this);//动态请求sd读取权限


        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){//获取存储卡状态,判断是否拥有存储卡
            File file=new File(Environment.getExternalStorageDirectory()+File.separator+DIR+File.separator+FILENAME);
            if (!file.getParentFile().exists()){
                file.getParentFile().mkdirs();//在父级上创建目录
            }
            Scanner scanner=null;
            try {
                scanner=new Scanner(new FileInputStream(file));
                while (scanner.hasNext()){
                    showText.append(scanner.next()+"\n");
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }finally {
                if (scanner!=null){
                    scanner.close();

                }
            }

        }else{
            Toast.makeText(this, "保存失败,sd卡不存在", Toast.LENGTH_SHORT).show();
        }

    }

}
5.使用getResource及输入流InputStream操作资源文件
public class MainActivity extends AppCompatActivity {
    private TextView showText;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        showText=findViewById(R.id.showText);

        Resources resource=getResources();
        InputStream input=resource.openRawResource(R.raw.poem);//从资源文件中读到输入流
        Scanner scanner=new Scanner(input);//scanner从input流中读取文件
        while (scanner.hasNext()){
            showText.append(scanner.next()+"\n");
        }
        scanner.close();
        try {
            input.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
5.DOM操作XML文件

基本思路:
1、判断文件目录是否存在,不存在则创建文件父目录
2、使用DocumentFactory的newinstance方法创建工厂对象
3、使用DocumentFactory工厂对象的newDocumentBuilder方法创建DoucmentBuilder对象
4、使用DocumentBuilder对象创造Document对象
5、在dom类中通过Document的createElement方法创建Element的dom元素
6、在dom元素下使用元素的Document的createTextNode方法创建node节点
7、逐级添加节点node–element–document–documentbuilder–documentFactory
………………
8、使用TransformerFactory的newinstance()方法创建工厂对象
9、使用TransformerFactory工厂对象的newTransformer方法创建Transformer对象
10、使用Transformer对象的setOutputProperty方法设置解码方式
11、创建DOMSource对象,将包含节点的对象打包压如DOMSource对象中
12、使用物理文件对象File对象来创建SreamResult对象,用于存放生成的DOM文件(xml文件)
13、使用transformer对象将DOMSource对象转换到物理文件(StreamResult)上去
在这里插入图片描述

布局文件

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TableRow>
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="20sp"
            android:text="姓名"/>
        <EditText
            android:id="@+id/name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="请输入姓名"/>
    </TableRow>
    <TableRow>
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="20sp"
            android:text="邮箱"/>
        <EditText
            android:id="@+id/mail"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="请输入邮箱"/>
    </TableRow>
    <TableRow>
        <Button
            android:id="@+id/submit"
            android:text="提交"
            android:textSize="20sp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
    </TableRow>
</TableLayout>

Manifest文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myex002filestore">
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

动态获取外部存储器读写权限

public class PermisionUtils {
    // Storage Permissions
    private static final int REQUEST_EXTERNAL_STORAGE = 1;
    private static String[] PERMISSIONS_STORAGE = {
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE};
    public static void verifyStoragePermissions(Activity activity) {//检查权限
        int permission = ActivityCompat.checkSelfPermission(activity,
                Manifest.permission.WRITE_EXTERNAL_STORAGE);

        if (permission != PackageManager.PERMISSION_GRANTED) {//无权限
            ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,
                    REQUEST_EXTERNAL_STORAGE);//动态赋权
        }
    }

}

activity文件

public class MainActivity extends AppCompatActivity {
    private static final String FILENAME="info.xml";
    private static final String DIR="fengray";
    private EditText name,mail;
    private Button submit;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        verifyStoragePermissions(this);

        name=findViewById(R.id.name);
        mail=findViewById(R.id.mail);
        submit=findViewById(R.id.submit);

        submit.setOnClickListener(new OnclickListenerImpl());
    }

    private class OnclickListenerImpl implements View.OnClickListener{

        @Override
        public void onClick(View v) {
            //如果sd卡不存在,则返回调用处
            if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//获取存储卡状态,判断是否拥有存储卡
               return;
            }
            File file = new File(Environment.getExternalStorageDirectory() + File.separator + DIR + File.separator + FILENAME);
            if (!file.getParentFile().exists()) {//如果父目录不存在
                file.getParentFile().mkdirs();//在父级上创建目录
            }
            DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();//使用工厂方法创建一个工厂
            DocumentBuilder builder=null;//创建一个文档对象实例
            try {
                builder=factory.newDocumentBuilder();//使用工厂创建一个新的文档对象
            } catch (ParserConfigurationException e) {
                e.printStackTrace();
            }
            //DocumentBuilderFactory==>DocumentBuilder==>Document(Document里面有dom操作方法)
            Document document=null;
            document=builder.newDocument();//使用文档对象创建给一个文档

            Element addresslist=document.createElement("addresslist");//创建一个dom节点
            Element linkman=document.createElement("linkman");//创建一个dom节点
            Element name=document.createElement("name");//创建一个dom节点
            Element email=document.createElement("email");//创建一个dom节点

            name.appendChild(document.createTextNode(MainActivity.this.name.getText().toString()));//将name节点上追加从布局文件控件上获取的文本
            email.appendChild(document.createTextNode(MainActivity.this.name.getText().toString()));

            linkman.appendChild(name);//逐级添加节点
            linkman.appendChild(email);

            addresslist.appendChild(linkman);//逐级添加节点
            document.appendChild(addresslist);//最高级添加节点

            TransformerFactory transformerFactory=TransformerFactory.newInstance();//获取一个TransformFactory工厂对象
            Transformer transformer=null;
            try {
                transformer=transformerFactory.newTransformer();//获取到了transformer对象
            } catch (TransformerConfigurationException e) {
                e.printStackTrace();
            }

            transformer.setOutputProperty(OutputKeys.ENCODING,"UTF-8");

            DOMSource source=new DOMSource(document);//将包含节点的文档对象创建成一个DOMSource对象,这几个都是javax.xml包中的类

            StreamResult result=new StreamResult(file);//将结果集设置到文件上
            try {
                transformer.transform(source,result);//将文档对象设置到文件上
            } catch (TransformerException e) {
                e.printStackTrace();
            }

        }
    }
}

结果:
在这里插入图片描述
在这里插入图片描述

6.DOM读取XML文件
public class MainActivity extends AppCompatActivity {
    private static final String FILENAME="info.xml";
    private static final String DIR="fengray";
    private EditText name,mail;
    private Button submit,read;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        verifyStoragePermissions(this);

        name=findViewById(R.id.name);
        mail=findViewById(R.id.mail);
        submit=findViewById(R.id.submit);
        read=findViewById(R.id.read);

        submit.setOnClickListener(new OnclickListenerImpl());
        read.setOnClickListener(new OnclickListenerImpl2());

    }

    private class OnclickListenerImpl2 implements View.OnClickListener{

        @Override
        public void onClick(View v) {

            //如果sd卡不存在,则返回调用处
            if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//获取存储卡状态,判断是否拥有存储卡
                Log.d("jian", "sd card missed");
                return;
            }

            File file = new File(Environment.getExternalStorageDirectory() + File.separator + DIR + File.separator + FILENAME);
            if (!file.exists()) {//如果文件不存在
                Log.d("jian", "file missed");
                return;
            }

            DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();//使用工厂方法创建一个工厂
            DocumentBuilder builder=null;//创建一个文档对象实例
            try {
                builder=factory.newDocumentBuilder();//使用工厂创建一个新的文档对象
            } catch (ParserConfigurationException e) {
                e.printStackTrace();
            }

            //DocumentBuilderFactory==>DocumentBuilder==>Document(Document里面有dom操作方法)
            Document document=null;
            try {
                document=builder.parse(file);//通过文件转化file文档
            } catch (IOException e) {
                e.printStackTrace();
            } catch (SAXException e) {
                e.printStackTrace();
            }


            NodeList nodeList=document.getElementsByTagName("linkman");
            for (int i=0; i<nodeList.getLength();i++){
                Element element= (Element) nodeList.item(i);
                name.setText(element.getElementsByTagName("name").item(0).getFirstChild().getNodeValue());
                mail.setText(element.getElementsByTagName("email").item(0).getFirstChild().getNodeValue());
            }


        }
    }



    private class OnclickListenerImpl implements View.OnClickListener{

        @Override
        public void onClick(View v) {
            //如果sd卡不存在,则返回调用处
            if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//获取存储卡状态,判断是否拥有存储卡
               return;
            }
            File file = new File(Environment.getExternalStorageDirectory() + File.separator + DIR + File.separator + FILENAME);
            if (!file.getParentFile().exists()) {//如果父目录不存在
                file.getParentFile().mkdirs();//在父级上创建目录
            }
            DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();//使用工厂方法创建一个工厂
            DocumentBuilder builder=null;//创建一个文档对象实例
            try {
                builder=factory.newDocumentBuilder();//使用工厂创建一个新的文档对象
            } catch (ParserConfigurationException e) {
                e.printStackTrace();
            }
            //DocumentBuilderFactory==>DocumentBuilder==>Document(Document里面有dom操作方法)
            Document document=null;
            document=builder.newDocument();//使用文档对象创建给一个文档

            Element addresslist=document.createElement("addresslist");//创建一个dom节点
            Element linkman=document.createElement("linkman");//创建一个dom节点
            Element name=document.createElement("name");//创建一个dom节点
            Element email=document.createElement("email");//创建一个dom节点

            name.appendChild(document.createTextNode(MainActivity.this.name.getText().toString()));//将name节点上追加从布局文件控件上获取的文本
            email.appendChild(document.createTextNode(MainActivity.this.mail.getText().toString()));

            linkman.appendChild(name);//逐级添加节点
            linkman.appendChild(email);
            addresslist.appendChild(linkman);//逐级添加节点
            document.appendChild(addresslist);//最高级添加节点

            TransformerFactory transformerFactory=TransformerFactory.newInstance();//获取一个TransformFactory工厂对象
            Transformer transformer=null;
            try {
                transformer=transformerFactory.newTransformer();//获取到了transformer对象
            } catch (TransformerConfigurationException e) {
                e.printStackTrace();
            }

            transformer.setOutputProperty(OutputKeys.ENCODING,"UTF-8");

            DOMSource source=new DOMSource(document);//将包含节点的文档对象创建成一个DOMSource对象,这几个都是javax.xml包中的类

            StreamResult result=new StreamResult(file);//将结果集设置到文件上
            try {
                transformer.transform(source,result);//将文档对象设置到文件上
            } catch (TransformerException e) {
                e.printStackTrace();
            }

        }
    }
}
6.使用SAX解析XML文件

前置文件inof.xml的内容
在这里插入图片描述
1、设置一个LinkMan对象,对应一个xml内容节点

public class LinkMan {

    //每个Linkman对象都表示一个xml节点的内容
    private String name;
    private String email;

    public String getName() {
        return name;
    }

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

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

}

2、设置一个sax解析器类

public class MySAX extends DefaultHandler {//继承DefaultHadler类

    private List<LinkMan> all=null;//保存多条数据
    private LinkMan man = null;
    private String elementName=null;//保存当前节点名称

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        if (this.elementName!=null){
            String data=new String(ch,start,length);
            if ("name".equals(this.elementName)){
                this.man.setName(data);//把节点的name节点设置到man对象的name属性中
            }else if("email".equals(this.elementName)){
                this.man.setEmail(data);
            }
        }
    }

    @Override
    public void startDocument() throws SAXException {
        all=new ArrayList<LinkMan>();//开始解析文档,因此要设置集合
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if ("linkman".equals(localName)){
            all.add(this.man);
            this.man=null;
        }
        this.elementName=null;
    }



    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        if ("linkman".equals(localName)){//是一个linkman节点
            this.man=new LinkMan();
        }
        this.elementName=localName;

    }
    public List<LinkMan> getAll() {//取得全部节点内容
        return all;
    }

}

activity文件

public class MainActivity extends AppCompatActivity {
    private static final String FILENAME="info.xml";
    private static final String DIR="fengray";
    private EditText name,mail;
    private Button submit,read;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        verifyStoragePermissions(this);

        name=findViewById(R.id.name);
        mail=findViewById(R.id.mail);
        submit=findViewById(R.id.submit);
        read=findViewById(R.id.read);

        submit.setOnClickListener(new OnclickListenerImpl());
        read.setOnClickListener(new OnclickListenerImpl2());

    }

    private class OnclickListenerImpl2 implements View.OnClickListener{

        @Override
        public void onClick(View v) {

            //如果sd卡不存在,则返回调用处
            if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//获取存储卡状态,判断是否拥有存储卡
                return;
            }

            File file = new File(Environment.getExternalStorageDirectory() + File.separator + DIR + File.separator + FILENAME);
            if (!file.exists()) {//如果文件不存在
                return;
            }

            SAXParserFactory saxParserFactory=SAXParserFactory.newInstance();

            SAXParser saxParser=null;
            MySAX mySAX=new MySAX();

            try {
                saxParser=saxParserFactory.newSAXParser();
                saxParser.parse(file,mySAX);
            } catch (ParserConfigurationException e) {
                e.printStackTrace();
            } catch (SAXException | IOException e) {
                e.printStackTrace();
            }
            List<LinkMan> all=mySAX.getAll();

            //由于linkman此刻只有一个节点,所以直接使用了all.get(0)的形式读取数据
            MainActivity.this.name.setText(all.get(0).getName());
            Log.d("jian", all.get(0).getName());

            MainActivity.this.mail.setText(all.get(0).getEmail());

        }
    }



    private class OnclickListenerImpl implements View.OnClickListener{

        @Override
        public void onClick(View v) {
            //如果sd卡不存在,则返回调用处
            if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//获取存储卡状态,判断是否拥有存储卡
               return;
            }
            File file = new File(Environment.getExternalStorageDirectory() + File.separator + DIR + File.separator + FILENAME);
            if (!file.getParentFile().exists()) {//如果父目录不存在
                file.getParentFile().mkdirs();//在父级上创建目录
            }
            DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();//使用工厂方法创建一个工厂
            DocumentBuilder builder=null;//创建一个文档对象实例
            try {
                builder=factory.newDocumentBuilder();//使用工厂创建一个新的文档对象
            } catch (ParserConfigurationException e) {
                e.printStackTrace();
            }
            //DocumentBuilderFactory==>DocumentBuilder==>Document(Document里面有dom操作方法)
            Document document=null;
            document=builder.newDocument();//使用文档对象创建给一个文档

            Element addresslist=document.createElement("addresslist");//创建一个dom节点
            Element linkman=document.createElement("linkman");//创建一个dom节点
            Element name=document.createElement("name");//创建一个dom节点
            Element email=document.createElement("email");//创建一个dom节点

            name.appendChild(document.createTextNode(MainActivity.this.name.getText().toString()));//将name节点上追加从布局文件控件上获取的文本
            email.appendChild(document.createTextNode(MainActivity.this.mail.getText().toString()));

            linkman.appendChild(name);//逐级添加节点
            linkman.appendChild(email);
            addresslist.appendChild(linkman);//逐级添加节点
            document.appendChild(addresslist);//最高级添加节点

            TransformerFactory transformerFactory=TransformerFactory.newInstance();//获取一个TransformFactory工厂对象
            Transformer transformer=null;
            try {
                transformer=transformerFactory.newTransformer();//获取到了transformer对象
            } catch (TransformerConfigurationException e) {
                e.printStackTrace();
            }

            transformer.setOutputProperty(OutputKeys.ENCODING,"UTF-8");

            DOMSource source=new DOMSource(document);//将包含节点的文档对象创建成一个DOMSource对象,这几个都是javax.xml包中的类

            StreamResult result=new StreamResult(file);//将结果集设置到文件上
            try {
                transformer.transform(source,result);//将文档对象设置到文件上
            } catch (TransformerException e) {
                e.printStackTrace();
            }

        }
    }
}
7.使用XMLPull解析XML文件

上例基础上创建一个工具类MyXMLPullUtil

public class MyXMLPullUtil {
    private InputStream inputStream=null;

    public MyXMLPullUtil(InputStream inputStream) {
        this.inputStream = inputStream;
    }

    public List<LinkMan> getAllLinkMan() throws Exception{
        List<LinkMan> all=null;
        LinkMan man=null;
        String elementName=null;//保存节点的名称
        XmlPullParserFactory factory=XmlPullParserFactory.newInstance();
        XmlPullParser xmlPullParser=factory.newPullParser();
        xmlPullParser.setInput(this.inputStream,"UTF-8");//为解析器设置输入流
        int evenType=xmlPullParser.getEventType();//取得事件码
        while(evenType!=XmlPullParser.END_DOCUMENT){//当到达文件尾部
            if (evenType==XmlPullParser.START_DOCUMENT){
                all=new ArrayList<LinkMan>();
            }else if (evenType==xmlPullParser.START_TAG){//元素标记开始
                elementName=xmlPullParser.getName();
                if ("linkman".equals(elementName)){
                    man=new LinkMan();
                }
            }else if (evenType==xmlPullParser.END_TAG){
                elementName=xmlPullParser.getName();
                if ("linkman".equals(elementName)){
                    all.add(man);
                    man=null;
                }
            }else if(evenType==xmlPullParser.TEXT) {
                if ("name".equals(elementName)){
                    man.setName(xmlPullParser.getText());
                }else if ("email".equals(elementName)){
                    man.setEmail(xmlPullParser.getText());
                }
            }
            evenType=xmlPullParser.next();
        }
        return all;
    }
}

activity文件

public class MainActivity extends AppCompatActivity {
    private static final String FILENAME="info.xml";
    private static final String DIR="fengray";
    private EditText name,mail;
    private Button submit,read;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        verifyStoragePermissions(this);

        name=findViewById(R.id.name);
        mail=findViewById(R.id.mail);
        submit=findViewById(R.id.submit);
        read=findViewById(R.id.read);

        submit.setOnClickListener(new OnclickListenerImpl());
        read.setOnClickListener(new OnclickListenerImpl2());

    }

    private class OnclickListenerImpl2 implements View.OnClickListener{

        @Override
        public void onClick(View v) {

            //如果sd卡不存在,则返回调用处
            if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//获取存储卡状态,判断是否拥有存储卡
                return;
            }

            File file = new File(Environment.getExternalStorageDirectory() + File.separator + DIR + File.separator + FILENAME);
            if (!file.exists()) {//如果文件不存在
                return;
            }

            try {
                InputStream inputStream=new FileInputStream(file);
                MyXMLPullUtil util =new MyXMLPullUtil(inputStream);
                List<LinkMan> all=util.getAllLinkMan();
                MainActivity.this.name.setText(all.get(0).getName());
                MainActivity.this.mail.setText(all.get(0).getEmail());
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }


        }
    }



    private class OnclickListenerImpl implements View.OnClickListener{

        @Override
        public void onClick(View v) {
            //如果sd卡不存在,则返回调用处
            if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//获取存储卡状态,判断是否拥有存储卡
               return;
            }
            File file = new File(Environment.getExternalStorageDirectory() + File.separator + DIR + File.separator + FILENAME);
            if (!file.getParentFile().exists()) {//如果父目录不存在
                file.getParentFile().mkdirs();//在父级上创建目录
            }
            DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();//使用工厂方法创建一个工厂
            DocumentBuilder builder=null;//创建一个文档对象实例
            try {
                builder=factory.newDocumentBuilder();//使用工厂创建一个新的文档对象
            } catch (ParserConfigurationException e) {
                e.printStackTrace();
            }
            //DocumentBuilderFactory==>DocumentBuilder==>Document(Document里面有dom操作方法)
            Document document=null;
            document=builder.newDocument();//使用文档对象创建给一个文档

            Element addresslist=document.createElement("addresslist");//创建一个dom节点
            Element linkman=document.createElement("linkman");//创建一个dom节点
            Element name=document.createElement("name");//创建一个dom节点
            Element email=document.createElement("email");//创建一个dom节点

            name.appendChild(document.createTextNode(MainActivity.this.name.getText().toString()));//将name节点上追加从布局文件控件上获取的文本
            email.appendChild(document.createTextNode(MainActivity.this.mail.getText().toString()));

            linkman.appendChild(name);//逐级添加节点
            linkman.appendChild(email);
            addresslist.appendChild(linkman);//逐级添加节点
            document.appendChild(addresslist);//最高级添加节点

            TransformerFactory transformerFactory=TransformerFactory.newInstance();//获取一个TransformFactory工厂对象
            Transformer transformer=null;
            try {
                transformer=transformerFactory.newTransformer();//获取到了transformer对象
            } catch (TransformerConfigurationException e) {
                e.printStackTrace();
            }

            transformer.setOutputProperty(OutputKeys.ENCODING,"UTF-8");

            DOMSource source=new DOMSource(document);//将包含节点的文档对象创建成一个DOMSource对象,这几个都是javax.xml包中的类

            StreamResult result=new StreamResult(file);//将结果集设置到文件上
            try {
                transformer.transform(source,result);//将文档对象设置到文件上
            } catch (TransformerException e) {
                e.printStackTrace();
            }

        }
    }
}
8.使用XMLSerializer接口解析XML文件

创建工具类

public class MyXMLPullUtil {
    private List<LinkMan> all=null;
    private OutputStream output;
    public MyXMLPullUtil(List<LinkMan> all, OutputStream output ){
        this.output=output;
        this.all = all;
    }

    public void save() throws  Exception{
        XmlPullParserFactory factory=XmlPullParserFactory.newInstance();
        XmlSerializer xmlSerializer=factory.newSerializer();
        xmlSerializer.setOutput(this.output,"UTF-8");

        xmlSerializer.startDocument("UTF-8",true);
        xmlSerializer.startTag(null,"addresslist");
        Iterator<LinkMan> iterator=this.all.iterator();
        while (iterator.hasNext()){
            LinkMan man = iterator.next();
            xmlSerializer.startTag(null,"linkman");
            xmlSerializer.startTag(null,"name");
            xmlSerializer.text(man.getName());
            xmlSerializer.endTag(null,"name");
            xmlSerializer.startTag(null,"email");
            xmlSerializer.text(man.getEmail());
            xmlSerializer.endTag(null,"email");
            xmlSerializer.endTag(null,"linkman");
        }

        xmlSerializer.endTag(null,"addresslist");
        xmlSerializer.endDocument();
        xmlSerializer.flush();

    }
}

activity文件

public class MainActivity extends AppCompatActivity {
    private static final String FILENAME="info.xml";
    private static final String DIR="fengray";
    private EditText name,mail;
    private Button submit,read;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        verifyStoragePermissions(this);

        name=findViewById(R.id.name);
        mail=findViewById(R.id.mail);
        submit=findViewById(R.id.submit);
        read=findViewById(R.id.read);

        submit.setOnClickListener(new OnclickListenerImpl());

    }


    private class OnclickListenerImpl implements View.OnClickListener{

        @Override
        public void onClick(View v) {
            //如果sd卡不存在,则返回调用处
            if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//获取存储卡状态,判断是否拥有存储卡
                return;
            }

            File file = new File(Environment.getExternalStorageDirectory() + File.separator + DIR + File.separator + FILENAME);
            if (!file.getParentFile().exists()) {//如果文件不存在
                file.getParentFile().mkdirs();
            }

            List<LinkMan> all=new ArrayList<LinkMan>();
            for (int i=0;i<3;i++){
                LinkMan man = new LinkMan();
                man.setName("王二码字"+i);
                man.setEmail("wanger@126.com");
                all.add(man);

            }

            OutputStream outputStream=null;
            try {
                outputStream=new FileOutputStream(file);
                new MyXMLPullUtil(all,outputStream).save();

            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (outputStream!=null);
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
9.操作JSON文件

Json已经被集成进去android中了

public class MainActivity extends AppCompatActivity {
    private static final String FILENAME="json.txt";
    private static final String DIR="fengray";
    private EditText name,mail;
    private Button submit,read;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        verifyStoragePermissions(this);

        String data[]=new String[]{"清华大学","北京理工大学","中央民族大学","北京大学","北京航空航天工业大学","人民大学"};//要输出的数据,用json包装
        //使用json包装数据
        JSONObject allData=new JSONObject();//建立最外面的节点对象
        JSONArray university=new JSONArray();
        for (int i=0; i<data.length;i++){//将数组内容配置到相应的节点上
            JSONObject temp=new JSONObject();//每一个包装的数据都是JSONObject
            try {
                temp.put("myUniversity",data[i]);
            } catch (JSONException e) {
                e.printStackTrace();
            }
            university.put(temp);//保存多个jsonObject

        }
        try {
            allData.put("universityData",university);
        } catch (JSONException e) {
            e.printStackTrace();
        }

        //如果sd卡不存在,则返回调用处
        if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//获取存储卡状态,判断是否拥有存储卡
            return;
        }

        File file = new File(Environment.getExternalStorageDirectory() + File.separator + DIR + File.separator + FILENAME);
        if (!file.getParentFile().exists()) {//如果文件不存在
            file.getParentFile().mkdirs();
        }

        PrintStream out=null;
        try {
            out=new PrintStream(new FileOutputStream(file));
            out.print(allData.toString());//将数据变成字符串后保存
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }finally {
            if (out!=null){
                out.close();
            }
        }
    }
}

生成如下json文件
json.txt:
{“universityData”:[{“myUniversity”:“清华大学”},{“myUniversity”:“北京理工大学”},{“myUniversity”:“中央民族大学”},{“myUniversity”:“北京大学”},{“myUniversity”:“北京航空航天工业大学”},{“myUniversity”:“人民大学”}]}

10.一个复杂的json操作

在这里插入图片描述

public class MainActivity extends AppCompatActivity {
    private static final String FILENAME="json.txt";
    private static final String DIR="fengray";
    private String nameData[]=new String[]{"令狐冲","任我行","岳不群","左冷禅","岳灵珊"};
    private int ageData[]=new int[] {30,50,54,43,23};
    private boolean isMarriedData[]=new boolean[]{false,true,true,true,false};
    private double salaryData[]=new double[]{3000.3,7775.5,4000.2,5666.2,2000.3};
    private Date birthdayData[]=new Date[]{new Date(),new Date(),new Date(),new Date(),new Date()};
    private String companyName="笑傲江湖";
    private String companyAddress="有人的地方有江湖,有江湖的地方处处是凶险";
    private String companyTel="010-1545215";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        verifyStoragePermissions(this);

        //使用json包装数据
        JSONObject allData=new JSONObject();//建立最外面的节点对象
        JSONArray jiangHu=new JSONArray();
        for (int i=0; i<nameData.length;i++){//将数组内容配置到相应的节点上
            JSONObject temp=new JSONObject();//每一个包装的数据都是JSONObject
            try {
                temp.put("name",nameData[i]);
                temp.put("age",ageData[i]);
                temp.put("married",isMarriedData[i]);
                temp.put("salary",salaryData[i]);
                temp.put("birthday",birthdayData[i]);

            } catch (JSONException e) {
                e.printStackTrace();
            }
            jiangHu.put(temp);//保存多个jsonObject

        }
        try {
            allData.put("personData",jiangHu);
            allData.put("company",companyName);
            allData.put("address",companyAddress);
            allData.put("telephone",companyTel);
        } catch (JSONException e) {
            e.printStackTrace();
        }

        //如果sd卡不存在,则返回调用处
        if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//获取存储卡状态,判断是否拥有存储卡
            return;
        }

        File file = new File(Environment.getExternalStorageDirectory() + File.separator + DIR + File.separator + FILENAME);
        if (!file.getParentFile().exists()) {//如果文件不存在
            file.getParentFile().mkdirs();
        }

        PrintStream out=null;
        try {
            out=new PrintStream(new FileOutputStream(file));
            out.print(allData.toString());//将数据变成字符串后保存
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }finally {
            if (out!=null){
                out.close();
            }
        }

    }

}

生成的json文件如下:
{“pe 2020”},
{“name”:“任我行”,“age”:50,“married”:true,“salary”:7775.5,“birthday”:“Thu Mar 12 14:26:58 GMT 2020”},
{“name”:“岳不群”,“age”:54,“married”:true,“salary”:4000.2,“birthday”:“Thu Mar 12 14:26:58 GMT 2020”},
{“name”:“左冷禅”,“age”:43,“married”:true,“salary”:5666.2,“birthday”:“Thu Mar 12 14:26:58 GMT 2020”},
{“name”:“岳灵珊”,“age”:23,“married”:false,“salary”:2000.3,“birthday”:“Thu Mar 12 14:26:58 GMT 2020”}],
“company”:“笑傲江湖”,“address”:“有人的地方有江湖,有江湖的地方处处是凶险”,“telephone”:“010-1545215”}
rsonData":[{“name”:“令狐冲”,“age”:30,“married”:false,“salary”:3000.3,“birthday”:"
Thu Mar 12 14:26:58 GMT

11.解析json生成的字符串
public class MainActivity extends AppCompatActivity {
    private static final String FILENAME="json.txt";
    private static final String DIR="fengray";
    private TextView msg=null;
    private String nameData[]=new String[]{"令狐冲","任我行","岳不群","左冷禅","岳灵珊"};
    private int ageData[]=new int[] {30,50,54,43,23};
    private boolean isMarriedData[]=new boolean[]{false,true,true,true,false};
    private double salaryData[]=new double[]{3000.3,7775.5,4000.2,5666.2,2000.3};
    private Date birthdayData[]=new Date[]{new Date(),new Date(),new Date(),new Date(),new Date()};
    private String companyName="笑傲江湖";
    private String companyAddress="有人的地方有江湖,有江湖的地方处处是凶险";
    private String companyTel="010-1545215";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        verifyStoragePermissions(this);
        msg=findViewById(R.id.msg);

        String strings = "[{\"id\":1,\"name\":\"令狐冲\",\"age\":30},{\"id\":2,\"name\":\"风清扬\",\"age\":90},{\"id\":3,\"name\":\"任我行\",\"age\":80}]";
        StringBuffer buffer = new StringBuffer();
        try {
            List<Map<String,Object>> all=this.parseJson(strings);
            Iterator<Map<String,Object>> iterator=all.iterator();
            while (iterator.hasNext()){
                Map<String,Object> map=iterator.next();
                buffer.append("ID:"+map.get("id")+",姓名:"+map.get("name")+",年龄:"+map.get("age")+"\n");
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        msg.setText(buffer);
    }

    private List<Map<String,Object>> parseJson(String data) throws Exception{
        List<Map<String,Object>> all=new ArrayList<Map<String,Object>>();
        JSONArray jsonArray=new JSONArray(data);//数组
        for (int i=0;i<jsonArray.length();i++){
            Map<String,Object> map=new  HashMap<String,Object>();
            JSONObject jsonObject=jsonArray.getJSONObject(i);
            map.put("id",jsonObject.getInt("id"));
            map.put("name",jsonObject.getString("name"));
            map.put("age",jsonObject.getInt("age"));
            all.add(map);

        }
        return all;
    }

}

在这里插入图片描述

11.解析json生成的包含复杂数据类型的字符串
public class MainActivity extends AppCompatActivity {
    private static final String FILENAME="json.txt";
    private static final String DIR="fengray";
    private TextView msg=null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        verifyStoragePermissions(this);
        msg=findViewById(R.id.msg);

        String strings = "{\"memberData\":[{\"id\":1,\"name\":\"令狐冲\",\"age\":30},{\"id\":2,\"name\":\"风清扬\",\"age\":90}," +
                "{\"id\":3,\"name\":\"任我行\",\"age\":80}],\"company\":\"笑傲江湖\"}" ;
        StringBuffer buffer = new StringBuffer();
        try {
            Map<String,Object> result =this.parseJson(strings);//解析文本

            buffer.append("公司名称:"+result.get("company")+"\n");

            List<Map<String ,Object>> all= (List<Map<String, Object>>) result.get("memberData");
            Iterator<Map<String,Object>> iterator=all.iterator();
            while (iterator.hasNext()){
                Map<String,Object> map=iterator.next();
                buffer.append("ID:"+map.get("id")+",姓名:"+map.get("name")+",年龄:"+map.get("age")+"\n");
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        msg.setText(buffer);
    }

    private Map<String,Object> parseJson(String data) throws Exception{
        Map<String,Object> allMap=new HashMap<String,Object>();
        JSONObject allData=new JSONObject(data);
        allMap.put("company",allData.getString("company"));
        JSONArray jsonArray=allData.getJSONArray("memberData");//数组
        List<Map<String,Object>> all=new ArrayList<Map<String,Object>>();

        for (int i=0;i<jsonArray.length();i++){
            Map<String,Object> map=new  HashMap<String,Object>();
            JSONObject jsonObject=jsonArray.getJSONObject(i);
            map.put("id",jsonObject.getInt("id"));
            map.put("name",jsonObject.getString("name"));
            map.put("age",jsonObject.getInt("age"));
            all.add(map);

        }
        allMap.put("memberData", all);
        return allMap;
    }

}

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值