activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" android:orientation="vertical"> <TextView android:layout_width="240dp" android:layout_height="240dp" android:background="#FF0000" android:layout_gravity="center" /> <TextView android:layout_width="200dp" android:layout_height="200dp" android:background="#00FF00" android:layout_gravity="center" /> <TextView android:layout_width="160dp" android:layout_height="160dp" android:background="#0000FF" android:layout_gravity="center" /> <TextView android:layout_width="120dp" android:layout_height="120dp" android:background="#FFFF00" android:layout_gravity="center" /> <TextView android:layout_width="80dp" android:layout_height="80dp" android:background="#FF00FF" android:layout_gravity="center" /> <TextView android:layout_width="40dp" android:layout_height="40dp" android:background="@android:color/white" android:layout_gravity="center" /> </FrameLayout>绝对布局少有用武之地,在屏幕分辩率固定的场合下使用
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" android:orientation="vertical" > <EditText android:id="@+id/et_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入用户名" /> <EditText android:id="@+id/et_pass" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textPassword" android:hint="请输入密码" /> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <CheckBox android:id="@+id/cb" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="记住用户名和密码" android:layout_centerVertical="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right" android:text="登录" android:layout_alignParentRight="true" android:onClick="login" /> </RelativeLayout> </LinearLayout>MainActivity
package com.example.administrator.myapplication; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.CheckBox; import android.widget.EditText; import android.widget.Toast; import java.io.*; public class MainActivity extends AppCompatActivity { private EditText et_name; private EditText et_pass; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); et_name = (EditText) findViewById(R.id.et_name); et_pass = (EditText) findViewById(R.id.et_pass); readAccount(); } public void readAccount(){ File file = new File("data/data/com.example.administrator.myapplication/info.txt"); if(file.exists()){ try { FileInputStream fis = new FileInputStream(file); //把字节流转换成字符流 BufferedReader br = new BufferedReader(new InputStreamReader(fis)); //读取txt文件里的用户名和密码 String text = br.readLine(); String[] s = text.split("##"); et_name.setText(s[0]); et_pass.setText(s[1]); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public void login(View v){ String name = et_name.getText().toString(); String pass = et_pass.getText().toString(); CheckBox cb = (CheckBox) findViewById(R.id.cb); //判断选框是否被勾选 if(cb.isChecked()){ //data/data/com.example.administrator.myapplication:这就是内部存储空间的路径 File file = new File("data/data/com.example.administrator.myapplication/info.txt"); FileOutputStream fos; try { fos = new FileOutputStream(file); fos.write((name + "##" + pass).getBytes()); fos.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } //创建并显示吐司对话框 Toast.makeText(this, "登录成功", Toast.LENGTH_SHORT).show(); } }//用API获取内部存储文件路径// MainActivity.java
package com.itheima.rwinrom; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.InputStreamReader; import org.apache.http.entity.InputStreamEntity; import com.itheima.apirwinrom.R; import android.os.Bundle; import android.annotation.SuppressLint; import android.app.Activity; import android.view.Menu; import android.view.View; import android.widget.CheckBox; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity { private EditText et_name; private EditText et_pass; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); et_name = (EditText) findViewById(R.id.et_name); et_pass = (EditText) findViewById(R.id.et_pass); readAccount(); } public void readAccount(){ // File file = new File(getFilesDir(), "info.txt"); File file = new File(getCacheDir(), "info.txt"); if(file.exists()){ try { FileInputStream fis = new FileInputStream(file); //把字节流转换成字符流 BufferedReader br = new BufferedReader(new InputStreamReader(fis)); //读取txt文件里的用户名和密码 String text = br.readLine(); String[] s = text.split("##"); et_name.setText(s[0]); et_pass.setText(s[1]); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public void login(View v){ String name = et_name.getText().toString(); String pass = et_pass.getText().toString(); CheckBox cb = (CheckBox) findViewById(R.id.cb); //判断选框是否被勾选 if(cb.isChecked()){ //返回一个File对象,其路径是data/data/com.example.administrator.myapplication/files // File file = new File(getFilesDir(), "info.txt"); //返回值也是一个File对象,其路径是data/data/com.example.administrator.myapplication/cache File file = new File(getCacheDir(), "info.txt"); FileOutputStream fos; try { fos = new FileOutputStream(file); fos.write((name + "##" + pass).getBytes()); fos.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } //创建并显示吐司对话框 Toast.makeText(this, "登录成功", 0).show(); } }SD卡:相当于电脑的移动硬盘
2.2之前,sd卡路径:sdcard4.3之前,sd卡路径:mnt/sdcard4.3开始,sd卡路径:storage/sdcard所有存储设备,都会被划分成若干个区块,每个区块有固定的大小
存储设备的总大小 = 区块大小 * 区块数量
在外部存储空间中读取文件
package com.itheima.rwinrom; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.InputStreamReader; import org.apache.http.entity.InputStreamEntity; import com.itheima.rwinsd.R; import android.os.Bundle; import android.os.Environment; import android.annotation.SuppressLint; import android.app.Activity; import android.view.Menu; import android.view.View; import android.widget.CheckBox; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity { private EditText et_name; private EditText et_pass; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); et_name = (EditText) findViewById(R.id.et_name); et_pass = (EditText) findViewById(R.id.et_pass); readAccount(); } public void readAccount(){ if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ File file = new File("sdcard/info.txt"); if(file.exists()){ try { FileInputStream fis = new FileInputStream(file); //把字节流转换成字符流 BufferedReader br = new BufferedReader(new InputStreamReader(fis)); //读取txt文件里的用户名和密码 String text = br.readLine(); String[] s = text.split("##"); et_name.setText(s[0]); et_pass.setText(s[1]); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } public void login(View v){ String name = et_name.getText().toString(); String pass = et_pass.getText().toString(); CheckBox cb = (CheckBox) findViewById(R.id.cb); //判断选框是否被勾选 if(cb.isChecked()){ //MEDIA_UNKNOWN:不能识别sd卡 //MEDIA_REMOVED:没有sd卡 //MEDIA_UNMOUNTED:sd卡存在但是没有挂载 //MEDIA_CHECKING:sd卡正在准备 //MEDIA_MOUNTED:sd卡已经挂载,可用 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ //返回一个File对象,其路径是sd卡的真实路径 File file = new File(Environment.getExternalStorageDirectory(), "info.txt"); // File file = new File("sdcard/info.txt"); FileOutputStream fos; try { fos = new FileOutputStream(file); fos.write((name + "##" + pass).getBytes()); fos.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } else{ Toast.makeText(this, "sd卡不可用哟亲么么哒", 0).show(); } } //创建并显示吐司对话框 Toast.makeText(this, "登录成功", 0).show(); } }获取SD卡剩余容量 MainActivity.java
package com.itheima.getsdavail; import java.io.File; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.os.StatFs; import android.app.Activity; import android.text.format.Formatter; import android.view.Menu; import android.widget.TextView; public class MainActivity extends Activity { @SuppressWarnings("deprecation") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); File path = Environment.getExternalStorageDirectory(); StatFs stat = new StatFs(path.getPath()); long blockSize; long totalBlocks; long availableBlocks; //获取当前系统版本的等级 if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2){ blockSize = stat.getBlockSizeLong(); totalBlocks = stat.getBlockCountLong(); availableBlocks = stat.getAvailableBlocksLong(); } else{ blockSize = stat.getBlockSize(); totalBlocks = stat.getBlockCount(); availableBlocks = stat.getAvailableBlocks(); } TextView tv = (TextView) findViewById(R.id.tv); tv.setText(formatSize(availableBlocks * blockSize)); } private String formatSize(long size) { return Formatter.formatFileSize(this, size); } }代码示例 MainActivity.java
package com.itheima.permission; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import android.os.Bundle; import android.annotation.SuppressLint; import android.app.Activity; import android.view.Menu; import android.view.View; @SuppressLint("WorldReadableFiles") public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void click1(View v){ //路径已经默认为data/data/com.itheima.permission/files try { FileOutputStream fos = openFileOutput("info1.txt", MODE_PRIVATE); fos.write("哈哈哈".getBytes()); fos.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void click2(View v){ //路径已经默认为data/data/com.itheima.permission/files try { @SuppressWarnings("deprecation") FileOutputStream fos = openFileOutput("info2.txt", MODE_WORLD_READABLE | MODE_WORLD_WRITEABLE); fos.write("ohohoho".getBytes()); fos.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void click3(View v){ //路径已经默认为data/data/com.itheima.permission/files try { @SuppressWarnings("deprecation") FileOutputStream fos = openFileOutput("info3.txt", MODE_WORLD_READABLE | MODE_WORLD_WRITEABLE); fos.write("德玛西亚".getBytes()); fos.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }备份短信,说白了就是将短信放到一个xml文件中 MainActivity.java
package com.itheima.createxml; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; import com.itheima.createxml.domain.Message; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.View; public class MainActivity extends Activity { List<Message> smsList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //虚拟10条短信 smsList = new ArrayList<Message>(); for(int i = 0; i < 10; i++){ Message sms = new Message("小志好棒" + i, System.currentTimeMillis() + "", "138"+i+i, "1"); smsList.add(sms); } } public void click(View v){ //在内存中把xml备份短信的格式拼接出来 StringBuffer sb = new StringBuffer(); sb.append("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>"); sb.append("<messages>"); for (Message sms : smsList) { sb.append("<sms>"); sb.append("<body>"); sb.append(sms.getBody()); sb.append("</body>"); sb.append("<date>"); sb.append(sms.getDate()); sb.append("</date>"); sb.append("<type>"); sb.append(sms.getType()); sb.append("</type>"); sb.append("<address>"); sb.append(sms.getAddress()); sb.append("</address>"); sb.append("</sms>"); } sb.append("</messages>"); File file = new File("sdcard/sms.xml"); try { FileOutputStream fos = new FileOutputStream(file); fos.write(sb.toString().getBytes()); fos.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }Message.java
package com.itheima.createxml.domain; public class Message { private String body; private String date; private String address; private String type; public String getBody() { return body; } public void setBody(String body) { this.body = body; } public String getDate() { return date; } public void setDate(String date) { this.date = date; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getType() { return type; } public void setType(String type) { this.type = type; } public Message(String body, String date, String address, String type) { super(); this.body = body; this.date = date; this.address = address; this.type = type; } }MainActivity.java
package com.itheima.xmlserializer; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.xmlpull.v1.XmlSerializer; import com.itheima.createxml.domain.Message; import android.os.Bundle; import android.app.Activity; import android.util.Xml; import android.view.Menu; import android.view.View; public class MainActivity extends Activity { List<Message> smsList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 虚拟10条短信 smsList = new ArrayList<Message>(); for (int i = 0; i < 10; i++) { Message sms = new Message("小志好棒" + i, System.currentTimeMillis() + "", "138" + i + i, "1"); smsList.add(sms); } } public void click(View v){ //使用xml序列化器生成xml文件 //1.拿到序列化器对象 XmlSerializer xs = Xml.newSerializer(); //2.初始化 File file = new File("sdcard/sms2.xml"); try { FileOutputStream fos = new FileOutputStream(file); //enconding:指定用什么编码生成xml文件 xs.setOutput(fos, "utf-8"); //3.开始生成xml文件 //enconding:指定头结点中的enconding属性的值 xs.startDocument("utf-8", true); xs.startTag(null, "message"); for (Message sms : smsList) { xs.startTag(null, "sms"); xs.startTag(null, "body"); xs.text(sms.getBody() + "<body>"); xs.endTag(null, "body"); xs.startTag(null, "date"); xs.text(sms.getDate()); xs.endTag(null, "date"); xs.startTag(null, "type"); xs.text(sms.getType()); xs.endTag(null, "type"); xs.startTag(null, "address"); xs.text(sms.getAddress()); xs.endTag(null, "address"); xs.endTag(null, "sms"); } xs.endTag(null, "message"); //告诉序列化器,文件生成完毕 xs.endDocument(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }weather.xml
<?xml version='1.0' encoding='utf-8' standalone='yes' ?> <weather> <city> <name>上海</name> <temp>5°</temp> <pm>80</pm> </city> <city> <name>北京</name> <temp>-5°</temp> <pm>800</pm> </city> <city> <name>西安</name> <temp>12°</temp> <pm>60</pm> </city> </weather>City.java
package com.itheima.pullparser.domain; public class City { private String name; private String temp; private String pm; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getTemp() { return temp; } public void setTemp(String temp) { this.temp = temp; } public String getPm() { return pm; } public void setPm(String pm) { this.pm = pm; } @Override public String toString() { return "City [name=" + name + ", temp=" + temp + ", pm=" + pm + "]"; } }MainActivity.java
package com.itheima.pullparser; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import com.itheima.pullparser.domain.City; import android.os.Bundle; import android.app.Activity; import android.util.Xml; import android.view.Menu; import android.view.View; public class MainActivity extends Activity { List<City> cityList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void click(View v){ //获取到src文件夹下的资源文件 InputStream is = getClassLoader().getResourceAsStream("weather.xml"); //拿到pull解析器对象 XmlPullParser xp = Xml.newPullParser(); //初始化 try { xp.setInput(is, "gbk"); //获取当前节点的事件类型,通过事件类型的判断,我们可以知道当前节点是什么节点,从而确定我们应该做什么操作 int type = xp.getEventType(); City city = null; while(type != XmlPullParser.END_DOCUMENT){ //根据节点的类型,要做不同的操作 switch (type) { case XmlPullParser.START_TAG: // 获取当前节点的名字 if("weather".equals(xp.getName())){ //创建city集合对象,用于存放city的javabean cityList = new ArrayList<City>(); } else if("city".equals(xp.getName())){ //创建city的javabean对象 city = new City(); } else if("name".equals(xp.getName())){ // 获取当前节点的下一个节点的文本 String name = xp.nextText(); city.setName(name); } else if("temp".equals(xp.getName())){ // 获取当前节点的下一个节点的文本 String temp = xp.nextText(); city.setTemp(temp); } else if("pm".equals(xp.getName())){ // 获取当前节点的下一个节点的文本 String pm = xp.nextText(); city.setPm(pm); } break; case XmlPullParser.END_TAG: if("city".equals(xp.getName())){ //把city的javabean放入集合中 cityList.add(city); } break; } //把指针移动到下一个节点,并返回该节点的事件类型 type = xp.next(); } for (City c : cityList) { System.out.println(c.toString()); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }