@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main); // 调用布局文件
this.msg = (TextView) super.findViewById(R.id.msg) ;
FileInputStream input = null; // 文件输入流
try { // 找到指定文件的输入流对象
input = super.openFileInput(FILENAME);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Scanner scan = new Scanner(input) ; // 定义Scanner
while(scan.hasNext()){ // 循环读取
this.msg.append(scan.next() + “\n”) ; // 设置文本
}
scan.close() ; // 关闭输入流
}
这样就可以实现一些基本的文件操作,目前还没有写关于文件操作比较复杂的Demo,想深入了解的朋友可以看一下GitHub上小米的“ MIUI文件管理器社区开源版“。
今天就先这样,去学习了。
3.JSON数据的解析与封装
今天早早的下班了,写了一个简单的JSON Demo,这里总结一下。
首先是效果图:
简单起见,解析部分并没有采用解析URL的方式,直接把JSON写到String里,逻辑比较简单,这里就不啰嗦了,上代码:
package com.example.jsondemo;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class Main extends Activity {
// private static final String BASE_URL =
// “http://zhoumushui.sinaapp.com/json/”;
private TextView tvMsg;
private TextView tvJson;
private EditText etName;
private EditText etAge;
private String strJson = “”;
private String staffInfo = “”;
private String strJsonRes = “”;
private String strMsg;
private Button btnAdd;
private Button btnJson;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tvMsg = (TextView) findViewById(R.id.tvMsg);
tvJson = (TextView) findViewById(R.id.tvJson);
etName = (EditText) findViewById(R.id.etName);
etAge = (EditText) findViewById(R.id.etAge);
btnAdd = (Button) findViewById(R.id.btnAdd);
btnJson = (Button) findViewById(R.id.btnJson);
MsgToJson(); // 封装Json
JsonToMsg(); // 解析Json
}
class onClickListenerImp implements OnClickListener {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (v == btnAdd) {
if (strMsg != null && strJson.trim().length() != 0) {
strMsg = strMsg + “,{name:'” + etName.getText().toString()
- “',age:” + etAge.getText().toString() + “}”;
} else {
strMsg = “{staff:[{name:'” + etName.getText().toString()
- “',age:” + etAge.getText().toString() + “}”;
}
Toast.makeText(Main.this, “Add Succcess!”, Toast.LENGTH_SHORT)
.show();
etAge.setText(“”);
etName.setText(“”);
} else if (v == btnJson) {
strJsonRes = “”;
strJsonRes = strMsg + “]}”;
tvJson.setText(strJsonRes);
}
}
}
private void MsgToJson() {
btnAdd.setOnClickListener(new onClickListenerImp());
btnJson.setOnClickListener(new onClickListenerImp());
}
private void JsonToMsg() {
strJson = “{staff:[{name:‘Alex’,age:21},{name:‘Zhou’,age:22},{name:‘Anne’,age:23}],company:‘T-Chip’}”;
staffInfo = “原始数据:\n” + strJson + “\n\n解析之后:\n”;
try {
JSONObject mJsonObject = new JSONObject(strJson);
JSONArray mJsonArray = mJsonObject.getJSONArray(“staff”);
String company = mJsonObject.getString(“company”);
staffInfo = staffInfo + company + "共有 " + mJsonArray.length()
- " 个员工,信息如下:\n";
for (int staffCount = 0; staffCount < mJsonArray.length(); staffCount++) {
// 获取员工
JSONObject staff = mJsonArray.getJSONObject(staffCount);
int staffNo = staffCount + 1;
staffInfo = staffInfo + “序号:” + staffNo + " 姓名: "
-
staff.getString(“name”) + " 年龄: "
-
staff.getInt(“age”) + “\n”;
}
tvMsg.setText(staffInfo);
} catch (JSONException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
布局有点拖沓,其实数据封装部分还可以利用一下解析部分的逻辑。
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”
android:layout_width=“fill_parent”
android:layout_height=“fill_parent”
android:orientation=“vertical” >
<TextView
android:id=“@+id/tvMsg”
android:layout_width=“fill_parent”
android:layout_height=“wrap_content” />
<TextView
android:layout_width=“fill_parent”
android:layout_height=“wrap_content”
android:text=“==========================” />
<LinearLayout
android:layout_width=“fill_parent”
android:layout_height=“wrap_content”
android:orientation=“horizontal” >
<EditText
android:id=“@+id/etName”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:hint=“姓名” />
<EditText
android:id=“@+id/etAge”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:hint=“年龄” />
<Button
android:id=“@+id/btnAdd”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:text=“增加” />
<Button
android:id=“@+id/btnJson”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:text=“JSON” />
<TextView
android:id=“@+id/tvJson”
android:layout_width=“fill_parent”
android:layout_height=“wrap_content” />
4.DOM,SAX解析XML
分别通过DOM和SAX解析XML实现存储和读取XML信息。
首先是DOM存储信息到XML文件:
// 判断是否存在SDCard
if(!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)){
return ;
}
// 路径:/sdcard/zhoumushui/android.xml
File file = new File(Environment
.getExternalStorageDirectory().toString()
-
File.separator
-
“zhoumushui” + File.separator + “android.xml”) ;
// 若目录不存在则创建
if (! file.getParentFile().exists()) {
file.getParentFile().mkdirs() ;
}
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = null;
try {
builder = factory.newDocumentBuilder();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
Document doc = null;
doc = builder.newDocument();
// 根标签
Element roottag = doc.createElement(“roottag”) ;
// 次标签
Element infotag = doc.createElement(“infotag”) ;
Element name = doc.createElement(“name”) ;
Element url = doc.createElement(“url”) ;
name.appendChild(doc.createTextNode(MyDOMDemo.this.name.getText()
.toString()));
url.appendChild(doc.createTextNode(MyDOMDemo.this.url.getText()
.toString())) ;
// 次标签有两个子元素name和url
infotag.appendChild(name) ;
infotag.appendChild(url) ;
// 主标签有一个子元素infotag
roottag.appendChild(infotag) ;
doc.appendChild(roottag) ;
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = null;
try {
transformer = transformerFactory.newTransformer();
} catch (TransformerConfigurationException e1) {
e1.printStackTrace();
}
transformer.setOutputProperty(OutputKeys.ENCODING, “UTF-8”) ;
// 定义source和result,从source变形为result:
DOMSource source = new DOMSource(doc);
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-F5XNM7ao-1710915790862)]
[外链图片转存中…(img-PL4A8b33-1710915790863)]
[外链图片转存中…(img-cpNo8s3H-1710915790863)]
[外链图片转存中…(img-vipvA4bQ-1710915790864)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
[外链图片转存中…(img-Zmv9wCER-1710915790864)]