Android 학습 09 --- Android 의 데이터 저장 및 접근 (2) By 파일
Activity 클래스 의 파일 작업 지원:
No.
방법.
유형
묘사 하 다.
1
Public FileInputStream openFileInput(String name)
수수 하 다
열 파일 입력 흐름 설정
2
Public FileOutputStream openFileOutput(String name,int mode)
수수 하 다
파일 을 열 출력 흐름 을 설정 합 니 다. 작업 모드 를 지정 하면 0, MODE 일 수 있 습 니 다.APPEND 、 MODE_PRIVATE 、 MODE_WORLD_READABLE 、 MODE_WORLD_WRITEABLE
3
Public Resources getResources()
수수 하 다
리 소스 대상 되 돌리 기
IO 스 트림 입 출력 파일 의 절 차 를 돌 이 켜 보 세 요:
· File 류 를 사용 하여 조작 할 파일 을 정의 합 니 다.
· 바이트 흐름 이나 문자 흐름 을 사용 하 는 하위 클래스 를 부모 클래스 로 예화 합 니 다. 네 개의 IO 흐름 의 조작 류 는 모두 추상 류 이기 때 문 입 니 다.
· 입 출력 기능 완료;
· 흐름 닫 기;
텍스트 파일
1. FileOutputStream 출력 일반 파일 과 FileInputStream 읽 기 파일
DataBakProject_File01_Activity.java
package com.iflytek.demo;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.util.Scanner;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class DataBakProject_File01_Activity extends Activity {
private static final String FILENAME = "xdwang.txt";//
private TextView msg = null; //
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
save();
read();
}
private void save() {
FileOutputStream outStream = null;//
try {
outStream = super.openFileOutput(FILENAME, Activity.MODE_PRIVATE);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
PrintStream out = new PrintStream(outStream);//
out.println(" : ");
out.println(" :23");
out.close();//
}
private void read() {
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);
while (scan.hasNext()) {
this.msg.append(scan.next() + "
");
}
scan.close();
}
}
상기 프로그램 은 사용자 가 디 렉 터 리 를 사용자 정의 로 저장 하고 'sdcard' 에서 조작 해 야 하기 때문에 이 프로그램 은 Activity 류 가 제공 하 는 파일 작업 을 직접 사용 하 는 방법 에 적합 하지 않 습 니 다. 사용 자 는 가장 전통 적 인 IO 흐름 을 직접 사용 하여 완성 할 수 있 습 니 다.
2. sdcard 에 파일 저장 및 읽 기
파일 의 경 로 를 하 드 인 코딩 으로 설정 할 수 없습니다. sdcard 가 존재 하지 않 아서 오류 가 발생 할 수 있 습 니 다. 즉, 가장 좋 은 방법 은 sdcard 가 존재 하 는 지 판단 하 는 것 입 니 다. 존재 하면 저장 하고 존재 하지 않 으 면 사용자 에 게 'sdcard' 가 존재 하지 않 고 저장 할 수 없습니다.이 판단 기능 을 완성 하려 면 android. os. Environment 류 를 통 해 디 렉 터 리 정 보 를 얻어 야 합 니 다.
그리고 Environment 류 를 사용 하여 판단 하면 이 종 류 는 사용자 에 게 직접 경 로 를 주 고 메모리 카드 의 경 로 를 제공 합 니 다.
DataBakProject_File02_Activity.java
package com.iflytek.demo;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.util.Scanner;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.widget.TextView;
import android.widget.Toast;
public class DataBakProject_File02_Activity extends Activity {
private static final String FILENAME = "xdwang.txt";//
private static final String DIR = "xdwang";//
private TextView msg = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.msg = (TextView) super.findViewById(R.id.msg);
// sdcard ,
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
String path = Environment.getExternalStorageDirectory()
+ File.separator + DIR + File.separator + FILENAME;
saveToSdcard(path);
readFromSdcard(path);
} else {
Toast.makeText(this, " ,SD ", Toast.LENGTH_LONG).show();
}
}
private void saveToSdcard(String path) {
File file = new File(path);//
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();//
}
PrintStream out = null;
try {
out = new PrintStream(new FileOutputStream(file));
out.println("hello,android");
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (out != null) {
out.close();
}
}
}
private void readFromSdcard(String path) {
File file = new File(path);//
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();//
}
Scanner scan = null;
try {
scan = new Scanner(new FileInputStream(file));
while (scan.hasNext()) {
this.msg.append(scan.next() + "
");
}
} catch (Exception e) {
e.printStackTrace();
} finally { //
if (scan != null) {
scan.close();
}
}
}
}
SDCard 작업 에 대한 권한 을 설정 해 야 합 니 다.
3. 자원 파일 읽 기
이상 은 텍스트 파일 을 저장 하 는 것 입 니 다. 다음은 자원 파일 에 대한 저장 을 말씀 드 리 겠 습 니 다. 안 드 로 이 드 운영 체제 에서 도 일부 자원 파일 을 읽 을 수 있 습 니 다. 이 자원 파일 의 ID 는 R. java 클래스 를 통 해 자동 으로 생 성 됩 니 다. 이 파일 을 읽 으 려 면 android. content. res. Resources 클래스 를 사용 하면 완 료 됩 니 다.
Resources 클래스 의 방법: Public InputStream openRawResource (int id);
현재 우리 가 자원 파일 을 res / raw 폴 더 에 저장한다 고 가정 하면, 이 자원 파일 의 인 코딩 형식 을 UTF - 8 로 설정 합 니 다
DataBakProject_File03_ResourcesActivity.java
package com.iflytek.demo;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;
import android.app.Activity;
import android.content.res.Resources;
import android.os.Bundle;
import android.widget.TextView;
public class DataBakProject_File03_ResourcesActivity extends Activity {
private TextView msg = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.msg = (TextView) super.findViewById(R.id.msg);
Resources res = super.getResources(); //
InputStream input = res.openRawResource(R.raw.resources); //
Scanner scan = new Scanner(input);
StringBuffer buf = new StringBuffer();
while (scan.hasNext()) {
buf.append(scan.next()).append("
");
}
scan.close();
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
this.msg.setText(buf);
}
}
XML 파일
파일 로 데 이 터 를 저장 하 는 것 도 편리 하지만 지금 데이터 가 많 으 면 관리 하기 가 불편 하기 때문에 파일 로 저장 할 때 도 XML 파일 로 데 이 터 를 저장 하 는 경우 가 많 습 니 다. XML 작업 을 하면 XML 파일 을 분석 해 야 합 니 다. DOM 해석 은 가장 흔 한 것 입 니 다.
1, DOM 조작 XML 파일
DataBakProject_XML01_DOMActivity.java
package com.iflytek.demo;
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class DataBakProject_XML01_DOMActivity extends Activity {
private EditText name = null;
private EditText email = null;
private Button but_save = null;
private Button but_read = null;
private TextView result = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.name = (EditText) super.findViewById(R.id.name);
this.email = (EditText) super.findViewById(R.id.email);
this.but_save = (Button) super.findViewById(R.id.but_save);
this.but_read = (Button) super.findViewById(R.id.but_read);
this.result = (TextView) super.findViewById(R.id.result);
this.but_save.setOnClickListener(new OnClickSaveListenerImpl());
this.but_read.setOnClickListener(new OnClickReadListenerImpl());
}
private class OnClickSaveListenerImpl implements OnClickListener {
@Override
public void onClick(View v) {
if (!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) { //
return; //
}
File file = new File(Environment.getExternalStorageDirectory()
+ File.separator + "xdwang" + File.separator + "test.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 addresslist = doc.createElement("addresslist");
Element linkman = doc.createElement("linkman");
Element name = doc.createElement("name");
Element email = doc.createElement("email");
name.appendChild(doc
.createTextNode(DataBakProject_XML01_DOMActivity.this.name
.getText().toString()));
email.appendChild(doc
.createTextNode(DataBakProject_XML01_DOMActivity.this.email
.getText().toString()));
linkman.appendChild(name);
linkman.appendChild(email);
addresslist.appendChild(linkman);
doc.appendChild(addresslist);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = null;
try {
transformer = tf.newTransformer();
} catch (TransformerConfigurationException e) {
e.printStackTrace();
}
transformer.setOutputProperty(OutputKeys.ENCODING, "GBK");
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(file);
try {
transformer.transform(source, result);
} catch (TransformerException e) {
e.printStackTrace();
}
}
}
private class OnClickReadListenerImpl implements OnClickListener {
@Override
public void onClick(View v) {
if (!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) { //
return; //
}
File file = new File(Environment.getExternalStorageDirectory()
+ File.separator + "xdwang" + File.separator + "test.xml"); //
if (!file.exists()) { //
return;
}
DocumentBuilderFactory factory = DocumentBuilderFactory
.newInstance();
DocumentBuilder builder = null;
try {
builder = factory.newDocumentBuilder();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
Document doc = null;
try {
doc = builder.parse(file); //
} catch (SAXException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
NodeList nl = doc.getElementsByTagName("linkman");
for (int x = 0; x < nl.getLength(); x++) {
Element e = (Element) nl.item(x); //
DataBakProject_XML01_DOMActivity.this.result.setText(e
.getElementsByTagName("name").item(0).getFirstChild()
.getNodeValue()
+ e.getElementsByTagName("email").item(0)
.getFirstChild().getNodeValue());
}
}
}
}
main.xml
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TableRow >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=" :"
android:textSize="20px" />
<EditText
android:id="@+id/name"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=" " />
</TableRow>
<TableRow >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=" :"
android:textSize="20px" />
<EditText
android:id="@+id/email"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="[email protected]" />
</TableRow>
<TableRow >
<Button
android:id="@+id/but_save"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=" " />
<Button
android:id="@+id/but_read"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=" " />
</TableRow>
<TableRow >
<TextView
android:id="@+id/result"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="20px" />
</TableRow>
</TableLayout>
2. SAX 해석
DOM 분석 자 체 는 파일 의 읽 기와 수정 을 지원 할 수 있 지만 DOM 자체 의 가장 큰 문 제 는 DOM 작업 중의 모든 내용 을 한꺼번에 읽 어야 한 다 는 것 이다. 만약 파일 의 내용 이 비교적 크다 면 이런 읽 기 는 바람 직 하지 않다.그래서 이 건 하 나 를 사용 하면 SAX 로 해석 할 수 있 습 니 다.
SAX 를 사용 하여 이전 파일 을 분석 하려 면 먼저 데 이 터 를 저장 하 는 클래스 를 정의 해 야 합 니 다.
LinkMan.java
package com.iflytek.demo;
public class LinkMan {
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;
}
}
모든 링크 맨 클래스 의 대상 은 링크 맨 노드 의 내용 을 표시 합 니 다.
SAX 해석 은 DefaultHandler 에서 계승 하 는 해상도 가 먼저 필요 할 것 입 니 다.
MySAX.java
package com.iflytek.demo;
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
*
* @author xdwang
*
* @create 2012-10-6 9:25:54
*
* @email:[email protected]
*
* @description SAX
*
*/
public class MySAX extends DefaultHandler {
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);
} else if ("email".equals(this.elementName)) {
this.man.setEmail(data);
}
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if ("linkman".equals(localName)) {
this.all.add(this.man);
this.man = null; //
}
this.elementName = null;//
}
@Override
public void startDocument() throws SAXException {
this.all = new ArrayList<LinkMan>(); // ,
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if ("linkman".equals(localName)) { // linkman
this.man = new LinkMan(); // LinkMan
}
this.elementName = localName; //
}
public List<LinkMan> getAll() {
return all;
}
}
DataBakProject_XML02_SAXActivity.java
package com.iflytek.demo;
import java.io.File;
import java.io.IOException;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class DataBakProject_XML02_SAXActivity extends Activity {
private TextView name = null;
private TextView email = null;
private Button but = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.name = (TextView) super.findViewById(R.id.name);
this.email = (TextView) super.findViewById(R.id.email);
this.but = (Button) super.findViewById(R.id.but);
this.but.setOnClickListener(new OnClickListenerImpl());
}
private class OnClickListenerImpl implements OnClickListener {
@Override
public void onClick(View v) {
if (!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) { //
return; //
}
File file = new File(Environment.getExternalStorageDirectory()
+ File.separator + "xdwang" + File.separator + "test.xml"); //
if (!file.exists()) { //
return;
}
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = null;
MySAX sax = new MySAX();
try {
parser = factory.newSAXParser();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
try {
parser.parse(file, sax);
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
List<LinkMan> all = sax.getAll();
System.out.println(all.size());
if (all.size() > 0) {
DataBakProject_XML02_SAXActivity.this.name.setText(all.get(0)
.getName());
DataBakProject_XML02_SAXActivity.this.email.setText(all.get(0)
.getEmail());
} else {
DataBakProject_XML02_SAXActivity.this.name.setText(" ");
DataBakProject_XML02_SAXActivity.this.email.setText(" ");
}
}
}
}
이 xml 파일 에 중국어 가 나 오지 않도록 주의 하 십시오. 또한 UTF - 8 형식 입 니 다.
3. XML Pull 해석
자바 이 를 사용 하여 프로젝트 개발 을 진행 하 는 과정 에서 DOM 과 SAX 의 사용 은 각각 특징 이 있 고 그 자체 도 각자 의 응용 범주 가 있 기 때문에 자바 에 서 는 JDOM 이나 DOM4J 구성 요 소 를 사용자 가 사용 할 수 있 도록 제공 하지만 이 구성 요 소 는 안 드 로 이 드 에 들 어가 면 없다.
Android 에 서 는 사용자 의 XML 조작 을 편리 하 게 하기 위해 XML pull 해석 방식 을 전문 적 으로 제공 합 니 다.XMLPull 분석 처 리 를 완료 하려 면 org. xmlpull. v1. XmlPullParserFactory 류 와 org. xmlpull. v1. XmlPullParser 인터페이스 지원 XmlPullParserFactory 류 의 주요 기능 은 그 안에 제 공 된 new PullParser () 방법 을 통 해 XmlPullParser 인터페이스의 대상 을 얻 을 수 있 습 니 다.
XMLpull 의 해석 방식 을 사용 하려 면 전문 적 인 도구 류 가 필요 합 니 다.
MyXMLPullUtil.java
package com.iflytek.demo;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import org.xmlpull.v1.XmlSerializer;
/**
*
* @author xdwang
*
* @create 2012-10-9 10:37:14
*
* @email:[email protected]
*
* @description XMLPull
*
*/
public class MyXMLPullUtil {
private List<LinkMan> all = null;
private OutputStream output = null;
private InputStream input = null;
public MyXMLPullUtil(OutputStream output, List<LinkMan> all) {
this.output = output;
this.all = all;
}
public MyXMLPullUtil(InputStream input) {
this.input = input;
}
/**
* @descrption
* @author xdwang
* @create 2012-10-9 10:27:36
* @throws Exception
*/
public void writeByXMLPull() throws Exception {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlSerializer xs = factory.newSerializer();
xs.setOutput(this.output, "UTF-8");
xs.startDocument("UTF-8", true);
xs.startTag(null, "addresslist");//
Iterator<LinkMan> iter = this.all.iterator();
while (iter.hasNext()) {
LinkMan man = iter.next();
xs.startTag(null, "linkman");
xs.startTag(null, "name");
xs.text(man.getName());
xs.endTag(null, "name");
xs.startTag(null, "email");
xs.text(man.getEmail());
xs.endTag(null, "email");
xs.endTag(null, "linkman");
}
xs.endTag(null, "addresslist");
xs.endDocument();
xs.flush();
}
/**
* @descrption
* @author xdwang
* @create 2012-10-9 10:34:27
* @return
* @throws Exception
*/
public List<LinkMan> readByXMLPull() throws Exception {
List<LinkMan> all = null;
LinkMan man = null;
String elementName = null; //
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();// XmlPullParserFactory
XmlPullParser xmlPullParser = factory.newPullParser();// XmlPullParser
xmlPullParser.setInput(this.input, "UTF-8");
int eventType = xmlPullParser.getEventType(); //
while (eventType != XmlPullParser.END_DOCUMENT) { //
if (eventType == XmlPullParser.START_DOCUMENT) { //
all = new ArrayList<LinkMan>();
} else if (eventType == XmlPullParser.START_TAG) { //
elementName = xmlPullParser.getName(); //
if ("linkman".equals(elementName)) {
man = new LinkMan();
}
} else if (eventType == XmlPullParser.END_TAG) { //
elementName = xmlPullParser.getName(); //
if ("linkman".equals(elementName)) {
all.add(man);
man = null;
}
} else if (eventType == XmlPullParser.TEXT) { //
if ("name".equals(elementName)) {
man.setName(xmlPullParser.getText());
} else if ("email".equals(elementName)) {
man.setEmail(xmlPullParser.getText());
}
}
eventType = xmlPullParser.next(); //
}
return all;
}
}
도구 류 가 완 료 된 후에 도 이후 프로그램 에 대해 서 는 List 를 사용 하여 분석 한 결 과 를 얻 을 수 있 습 니 다.
XMLPullActivity.java
package com.iflytek.demo;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class XMLPullActivity extends Activity {
private TextView name = null;
private TextView email = null;
private Button but_read = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
writeByXMLPull();
readByXMLPull();
}
/**
* @descrption
* @author xdwang
* @create 2012-10-9 10:32:46
*/
private void writeByXMLPull() {
if (!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) { //
return; //
}
File file = new File(Environment.getExternalStorageDirectory()
+ File.separator + "xdwang" + File.separator + "test.xml"); //
if (!file.getParentFile().exists()) { //
file.getParentFile().mkdirs(); //
}
List<LinkMan> all = new ArrayList<LinkMan>();
for (int x = 0; x < 3; x++) {
LinkMan man = new LinkMan();
man.setName("xdwang - " + x);
man.setEmail("[email protected]");
all.add(man);
}
OutputStream output = null;
try {
output = new FileOutputStream(file);
new MyXMLPullUtil(output, all).writeByXMLPull();
} catch (Exception e) {
} finally {
if (output != null) {
try {
output.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
/**
* @descrption
* @author xdwang
* @create 2012-10-9 10:32:23
*/
private void readByXMLPull() {
this.name = (TextView) super.findViewById(R.id.name);
this.email = (TextView) super.findViewById(R.id.email);
this.but_read = (Button) super.findViewById(R.id.but);
this.but_read.setOnClickListener(new OnClickListenerImpl());
}
private class OnClickListenerImpl implements OnClickListener {
@Override
public void onClick(View v) {
if (!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) { //
return; //
}
File file = new File(Environment.getExternalStorageDirectory()
+ File.separator + "xdwang" + File.separator + "test.xml"); //
if (!file.exists()) { //
return;
}
try {
InputStream input = new FileInputStream(file);
MyXMLPullUtil util = new MyXMLPullUtil(input);
List<LinkMan> all = util.readByXMLPull();
XMLPullActivity.this.name.setText(all.get(0).getName());
XMLPullActivity.this.email.setText(all.get(0).getEmail());
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
4. JSON 해석
이전 에는 XML 스타일 의 파일 을 사용 하여 조작 데 이 터 를 저 장 했 지만 XML 파일 을 통 해 완 성 된 데이터 저장 자체 에 문제 가 있 었 습 니 다.예 를 들 어 똑 같은 라벨 이 많이 존재 한다. 즉, 진정한 데 이 터 를 제외 하고 일련의 비 주요 데 이 터 를 전달 해 야 한다.
JSON 은 언어 플랫폼 에 완전히 독립 된 텍스트 형식 (이 점 은 XML 과 유사) 을 사용 합 니 다. JSON 을 사용 하면 대상 에 표 시 된 데 이 터 를 문자열 로 변환 한 다음 에 각 프로그램 간 에 이 문자열 을 전달 하거나 비동기 시스템 에서 서버 와 클 라 이언 트 간 의 데 이 터 를 전달 할 수 있 습 니 다.
JSON 작업 자 체 는 자체 데이터 형식 이 있 습 니 다. 이러한 데이터 형식 은 사용자 가 문자열 로 맞 출 수도 있 고 JSON 이 제시 한 조작 류 를 직접 이용 하여 완성 할 수도 있 습 니 다. 안 드 로 이 드 시스템 에 서 는 JSON 작업 에 필요 한 패 킷 이 기본적으로 통합 되 었 기 때문에 사용 자 는 추가 패 킷 을 개발 할 필요 가 없습니다.
package com.iflytek.demo;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.widget.TextView;
public class JSONActivity extends Activity {
private String nameData[] = new String[] { " ", " ", " " };
private int ageData[] = new int[] { 23, 25, 27 };
private boolean isMarraiedData[] = new boolean[] { false, true, false };
private double salaryData[] = new double[] { 7000.0, 5000.0, 3000.0 };
private Date birthdayData[] = new Date[] { new Date(), new Date(),
new Date() };
private String companyName = " ";
private String companyAddr = " ";
private String companyTel = "010-52354396";
private TextView msg = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
writeByJSON();
readByJSON();
}
/**
* @descrption
* @author xdwang
* @create 2012-10-9 11:00:04
*/
private void writeByJSON() {
JSONObject jsonObject = new JSONObject(); //
JSONArray jsonArray = new JSONArray(); //
for (int x = 0; x < nameData.length; x++) { //
JSONObject temp = new JSONObject(); // JSONObject
try {
temp.put("name", this.nameData[x]);
temp.put("age", this.ageData[x]);
temp.put("married", this.isMarraiedData[x]);
temp.put("salary", this.salaryData[x]);
temp.put("birthday", this.birthdayData[x]);
} catch (JSONException e) {
e.printStackTrace();
}
jsonArray.put(temp); // JSONObject
}
try {
jsonObject.put("persondata", jsonArray);
jsonObject.put("company", this.companyName);
jsonObject.put("address", this.companyAddr);
jsonObject.put("telephone", this.companyTel);
} catch (JSONException e) {
e.printStackTrace();
}
if (!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) { //
return; //
}
File file = new File(Environment.getExternalStorageDirectory()
+ File.separator + "xdwang" + File.separator + "json.txt"); //
if (!file.getParentFile().exists()) { //
file.getParentFile().mkdirs(); //
}
PrintStream out = null;
try {
out = new PrintStream(new FileOutputStream(file));
out.print(jsonObject.toString()); //
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (out != null) {
out.close(); //
}
}
}
/**
* @descrption
* @author xdwang
* @create 2012-10-9 10:20:23
*/
private void readByJSON() {
this.msg = (TextView) super.findViewById(R.id.msg);
if (!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) { //
return; //
}
File file = new File(Environment.getExternalStorageDirectory()
+ File.separator + "xdwang" + File.separator + "json.txt"); //
if (!file.exists()) { //
return;
}
BufferedReader reader = null;
String str = "";
try {
reader = new BufferedReader(new FileReader(file));
String tempString = null;
while ((tempString = reader.readLine()) != null) {
str = str + tempString;
}
reader.close();
} catch (Exception e) {
} finally {
if (reader != null) {
try {
reader.close();
} catch (Exception e) {
}
}
}
StringBuffer buf = new StringBuffer();
try {
Map<String, Object> result = this.parseJson(str); //
buf.append(" :" + result.get("company") + "
");
buf.append(" :" + result.get("telephone") + "
");
buf.append(" :" + result.get("address") + "
");
List<Map<String, Object>> all = (List<Map<String, Object>>) result
.get("persondata");
Iterator<Map<String, Object>> iter = all.iterator();
while (iter.hasNext()) {
Map<String, Object> map = iter.next();
buf.append(" :" + map.get("name") + ", :" + map.get("age")
+ "
" + " :" + map.get("salary") + ", :"
+ map.get("married") + "
" + " :"
+ map.get("birthday") + "
");
}
} catch (Exception e) {
e.printStackTrace();
}
this.msg.setText(buf);
}
private Map<String, Object> parseJson(String data) throws Exception {
Map<String, Object> maps = new HashMap<String, Object>();
JSONObject jsonObject = new JSONObject(data); //
maps.put("company", jsonObject.getString("company")); //
maps.put("telephone", jsonObject.getString("telephone")); //
maps.put("address", jsonObject.getString("address")); //
JSONArray jsonArray = jsonObject.getJSONArray("persondata"); //
List<Map<String, Object>> lists = new ArrayList<Map<String, Object>>();
for (int x = 0; x < jsonArray.length(); x++) {
Map<String, Object> map = new HashMap<String, Object>();
JSONObject jsonObj = jsonArray.getJSONObject(x);
map.put("name", jsonObj.getString("name"));
map.put("age", jsonObj.getInt("age"));
map.put("salary", jsonObj.getDouble("salary"));
map.put("married", jsonObj.getBoolean("married"));
map.put("birthday", jsonObj.getString("birthday"));
lists.add(map);
}
maps.put("persondata", lists);
return maps;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.