Android 학습 09 --- Android 의 데이터 저장 및 접근 (2) By 파일

앞에서 저 희 는 Shared Perferences 를 정 리 했 습 니 다. Shared Perferences 에 대해 저 희 는 데이터 저장 기능 을 편리 하 게 완성 할 수 있 지만 간단 한 데이터 만 저장 할 수 있 습 니 다. 더 많은 유형의 데 이 터 를 저장 하려 면 파일 저장 작업 을 사용 할 수 있 습 니 다. 파일 을 조작 하려 면 Activity 류 의 지원 이 필요 합 니 다.
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; } }

 

좋은 웹페이지 즐겨찾기