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卡读写权限
另一例见:
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;
}
}