Android---数据读取、存储、删除(内存储/SD卡存储/网络数据读取存储)
2016-08-15 23:00
716 查看
数据读取存储之内存储
首先搞清几个概念:1.数据的存储是以数据流(IO流)的形式进行数据的传递,类似于JAVA中的IO流。
2.存储: openFileOutput 返回一个输出字节流
指向的路径为data/data/包名、files/
参数1:文件名称(如果不存在则自动创建)
参数2:模式:MODE_APPEND文件内容可追加
模式:MODE_PRIVAT文件内容被覆盖
3.读取:为有缓存的读取
sbd.append(getFilesDir().getCanonicalPath()); //输出规范路径
4.删除:deleteFile(“text.txt”);删除文件deleteFile()方法用于内存储
下面我们来看一下具体实现的代码
首先是InnerIoctivity.java
5.读取raw文件夹、读取assets目录的不同点,一般来将raw建在res下,assets和raw同级,所以raw会生成R文件,而assets不会。
public class InnerIoctivity extends AppCompatActivity { private EditText content; private TextView show; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_inner_ioctivity); Button save= (Button) findViewById(R.id.save); Button read= (Button) findViewById(R.id.read); Button delete= (Button) findViewById(R.id.delete); content= (EditText) findViewById(R.id.content); show= (TextView) findViewById(R.id.show); save.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { saveFile(); } }); read.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { show.setText(readFile()); } }); delete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { deleteFile(); } }); } //删除文件 private void deleteFile(){ //返回fileList() 文件下的所有文件 String[] files = fileList(); for(String str:files){ Log.d("====", str); if(str.equals("text.txt")){ deleteFile("text.txt"); break; } } } //读取文件 public String readFile(){ //带缓存的读 BufferedReader reader=null; FileInputStream fis=null; StringBuffer sbd=new StringBuffer(); try { fis=openFileInput("text.txt"); reader=new BufferedReader(new InputStreamReader(fis)); try { //输出规范路径 sbd.append(getFilesDir().getCanonicalPath()); } catch (IOException e) { e.printStackTrace(); } String row = ""; //readLine行读取 try { while ((row = reader.readLine())!=null){ sbd.append(row); } } catch (IOException e) { e.printStackTrace(); } } catch (FileNotFoundException e) { Toast.makeText(getBaseContext(), "文件不存在", Toast.LENGTH_SHORT).show(); e.printStackTrace(); }finally { if(reader!=null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } return sbd.toString(); } //save文件到内存储 public void saveFile(){ FileOutputStream fos=null; //1.名字 2.程序私有的 (覆盖)MODE_PRIVATE, MODE_APPEND(不覆盖) try { fos=openFileOutput("text.txt",MODE_APPEND); String str =content.getText().toString(); try { /* * openFileOutput 返回一个输出字节流 * 指向的路径为data/data/包名、files/ * 参数1:文件名称(如果不存在则自动创建) * 参数2:模式:MODE_APPEND文件内容可追加 * 模式:MODE_PRIVAT文件内容被覆盖 * */ fos.write(str.getBytes()); Toast.makeText(InnerIoctivity.this, "保存成功", Toast.LENGTH_SHORT).show(); } catch (IOException e) { e.printStackTrace(); } } catch (FileNotFoundException e) { e.printStackTrace(); }finally { if(fos!=null){ try { fos.close(); fos.flush(); } catch (IOException e) { e.printStackTrace(); } } } } }
然后是它的布局文件activity_inner_ioctivity.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.edu.jereh.android10.InnerIoctivity"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入内容" android:id="@+id/content" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="保存" android:id="@+id/save" android:layout_below="@+id/content" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_marginLeft="37dp" android:layout_marginStart="37dp" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="删除" android:id="@+id/delete" android:layout_below="@+id/content" android:layout_toRightOf="@+id/save" android:layout_toEndOf="@+id/save" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/read" android:text="读取" android:layout_marginRight="45dp" android:layout_marginEnd="45dp" android:layout_below="@+id/content" android:layout_alignRight="@+id/content" android:layout_alignEnd="@+id/content" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/show" android:layout_below="@+id/save" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> </RelativeLayout>
下面是效果图
为了方便理解,我让它输出了规范路径
下面是raw文件夹、读取assets目录的不同点
ReadRawAndAssetsActivity.java
public class ReadRawAndAssetsActivity extends AppCompatActivity { private Button raw,assets; private TextView show; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_read_raw_and_assets); raw= (Button) findViewById(R.id.raw); assets= (Button) findViewById(R.id.assets); show= (TextView) findViewById(R.id.show); raw.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { show.setText(readRaw()); } }); assets.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { show.setText(readAssets()); } }); } //读取assets目录 public String readAssets(){ StringBuilder sbd=new StringBuilder(); BufferedReader reader=null; // InputStream is=null; try { InputStream is= getResources().getAssets().open("city"); reader =new BufferedReader(new InputStreamReader(is)); String row=""; while ((row=reader.readLine())!=null){ sbd.append(row); sbd.append("\n"); } } catch (IOException e) { e.printStackTrace(); }finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } return sbd.toString(); } //读取raw文件夹 public String readRaw(){ StringBuilder sbd=new StringBuilder(); BufferedReader reader=null; InputStream is=null; is = getResources().openRawResource(R.raw.settings); reader = new BufferedReader(new InputStreamReader(is)); String row=""; try { while ((row=reader.readLine())!=null){ sbd.append(row); } } catch (IOException e) { e.printStackTrace(); }finally { if(reader!=null){ try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } return sbd.toString(); } }
activity_read_raw_and_assets.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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="com.edu.jereh.android10.ReadRawAndAssetsActivity"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/raw" android:text="读取raw" android:layout_below="@+id/show" android:layout_toRightOf="@+id/assets" android:layout_toEndOf="@+id/assets" android:layout_marginTop="35dp" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/assets" android:text="读取assets" android:layout_alignTop="@+id/raw" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/show" android:text="显示" /> </RelativeLayout>
SD卡的存储、读取、删除
实现步骤:加入读写SD卡权限判断SD卡是否存在
读写文件
一定要写呀(必须有)和内存储的不同:
//获取SD卡状态 String state= Environment.getExternalStorageState(); //判断SD卡是否就绪 if(!state.equals(Environment.MEDIA_MOUNTED)){ Toast.makeText(this,"请检查SD卡",Toast.LENGTH_SHORT).show(); return; } //取得SD卡根目录 File file= Environment.getExternalStorageDirectory();
下面是读取、存储、删除的具体操作
SaveToSdCardActivity.java
public class SaveToSdCardActivity extends AppCompatActivity {
private Button save,read,delete;
private EditText content;
private TextView show;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_inner_ioctivity);
save= (Button) findViewById(R.id.save);
read= (Button) findViewById(R.id.read);
delete= (Button) findViewById(R.id.delete);
content= (EditText) findViewById(R.id.content);
show= (TextView) findViewById(R.id.show);
save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
saveFile();
}
});
read.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
show.setText(readFile());
}
});
delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
deleteF();
}
});
}
private void deleteF(){
//返回fileList() 文件下的所有文件
// File file= Environment.getExternalStorageDirectory();
// File fl=new File(file+"/sd.txt");
// if(fl!=null){
// fl.delete();
// }
String statu=Environment.getExternalStorageState();
if (!statu.equals(Environment.MEDIA_MOUNTED)){
Toast.makeText(this,"SD卡未就绪",Toast.LENGTH_SHORT).show();
}
File file= Environment.getExternalStorageDirectory();
File fl=new File(file ,"sd.txt");
if(fl.exists()){
fl.delete();
Toast.makeText(this, "文件已删除", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(this, "文件不存在", Toast.LENGTH_SHORT).show();
}
}
//保存文件到SD卡
public void saveFile(){
FileOutputStream fos=null;
//获取SD卡状态 String state= Environment.getExternalStorageState(); //判断SD卡是否就绪 if(!state.equals(Environment.MEDIA_MOUNTED)){ Toast.makeText(this,"请检查SD卡",Toast.LENGTH_SHORT).show(); return; } //取得SD卡根目录 File file= Environment.getExternalStorageDirectory();
try {
Log.d("=====SD卡根目录:",file.getCanonicalPath().toString());
//输出流的构造参数1:可以是File对象,也可以是文件路径
//输出流的构造参数2:默认为fasle=>覆盖内容:true=>追加内容
// File myFile=new File(file.getCanonicalPath()+"/sd.txt");
// fos=new FileOutputStream(myFile);
//加true追加模式
fos=new FileOutputStream(file.getCanonicalPath()+"/sd.txt",true);
String str=content.getText().toString();
fos.write(str.getBytes());
Toast.makeText(this,"保存成功",Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (fos!=null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//从SD卡读取文件
public String readFile(){
BufferedReader reader=null;
FileInputStream fis=null;
StringBuilder sbd=new StringBuilder();
String statu=Environment.getExternalStorageState();
if (!statu.equals(Environment.MEDIA_MOUNTED)){
Toast.makeText(this,"SD卡未就绪",Toast.LENGTH_SHORT).show();
return "";
}
File root=Environment.getExternalStorageDirectory();
try {
fis=new FileInputStream(root+"/sd.txt");
reader= new BufferedReader(new InputStreamReader(fis));
String row="";
try {
while ((row=reader.readLine())!=null){
sbd.append(row);
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
Toast.makeText(this,"文件不存在",Toast.LENGTH_SHORT).show();
e.printStackTrace();
}finally {
if (reader!=null){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return sbd.toString();
}
}
activity_inner_ioctivity.xml和之前的用的是同一个布局,在这里就不再重复一遍了
读取网络图片、保存网络图片
运用Bitmap:通过Bitmap(位图)压缩的方法(compress)保存图片到SD卡
参数一:图片格式(PNG,JPRG,WEBP)
参数二:图片质量(0-100)
参数三:输出流
运用Http传输,因为是耗时操作,所以需要异步任务类
以下为从网络读取图片,保存图片的代码
SDImgctivity.java
public class SDImgctivity extends AppCompatActivity { private ImageView img,showImg; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sdimgctivity); img=(ImageView)findViewById(R.id.img); showImg= (ImageView) findViewById(R.id.showImg); } //从SD卡读取图片 public void readImg(View view){ String path = Environment.getExternalStorageDirectory()+"/1.png"; //方法一:根据URI 加载图片 //showImg.setImageURI(Uri.parse(path)); //方法二:通过BitmapFactory 的静态方法 decodeFile() 参数为图片路径 Bitmap bitmap = BitmapFactory.decodeFile(path); showImg.setImageBitmap(bitmap); //方法三:通过BitmapFactory 的静态方法 decodeStream 参数为输入流InputStream // try { // BitmapFactory.decodeStream(new FileInputStream(path)); // } catch (FileNotFoundException e) { // e.printStackTrace(); // } } public void HtSD(View view){ String url = "http://pic3.nipic.com/20090622/2605630_113023052_2.jpg"; new SaveHttpImg().execute(url); } public class SaveHttpImg extends AsyncTask<String,Void,String> { @Override protected String doInBackground(String... params) { HttpURLConnection con = null; InputStream is = null; try { URL url = new URL(params[0]); con = (HttpURLConnection) url.openConnection(); con.setConnectTimeout(5 * 1000); con.setReadTimeout(5 * 1000); File root = Environment.getExternalStorageDirectory(); FileOutputStream fos = new FileOutputStream(root + "/http.jpg"); //http响应码200成功 404未找到 500发生错误 if (con.getResponseCode() == 200) { is = con.getInputStream(); int next = 0; byte[] bytes = new byte[1024]; while ((next = is.read(bytes)) > 0) { fos.write(bytes, 0, next); } fos.flush(); fos.close(); return root + "/http.jpg"; } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (is != null) { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } if (con != null) { con.disconnect(); } } return ""; } @Override protected void onPostExecute(String s) { super.onPostExecute(s); if(!s.equals("")){ Toast.makeText(SDImgctivity.this, "保存路径:" + s, Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(SDImgctivity.this,"保存失败:",Toast.LENGTH_SHORT).show(); } } } public void HttpImg(View view) { String url = "http://pic3.nipic.com/20090622/2605630_113023052_2.jpg"; new MyGetJob().execute(url); } public class MyGetJob extends AsyncTask<String, Void, Bitmap> { // onPostExecute在主线程中执行命令 //doInBackground在子线程中执行命令 //doInBackground执行之后会到onPostExecute中 @Override protected Bitmap doInBackground(String... params) { HttpURLConnection con = null;//为了抛异常 InputStream is = null; Bitmap bitmap = null; try { URL url = new URL(params[0]); con = (HttpURLConnection) url.openConnection(); con.setConnectTimeout(5 * 1000); con.setReadTimeout(5 * 1000); //http响应码200成功 404未找到 500发生错误 if (con.getResponseCode() == 200) { is = con.getInputStream(); bitmap = BitmapFactory.decodeStream(is); return bitmap; } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (is != null) { try { is.close(); } catch (IOException e) { Log.d("==j==", "509"); e.printStackTrace(); } } if (con != null) { con.disconnect(); } } return null; } @Override protected void onPostExecute(Bitmap bitmap) { super.onPostExecute(bitmap); showImg.setImageBitmap(bitmap); } } public void saveImg(View view) { //读取ImageView中的图片 BitmapDrawable bitmapDrawable = (BitmapDrawable) img.getDrawable(); Bitmap bitmap = bitmapDrawable.getBitmap(); //获取根目录 File root = Environment.getExternalStorageDirectory(); //定义输出流 FileOutputStream fos = null; try { fos = new FileOutputStream(root + "/1.png"); /*通过Bitmap(位图)压缩的方法(compress)保存图片到SD卡 参数一:图片格式(PNG,JPRG,WEBP) 参数二:图片质量(0-100) 参数三:输出流 */ bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); } catch (FileNotFoundException e) { e.printStackTrace(); } finally { if (fos != null) { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
布局文件activity_sdimgctivity.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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="com.edu.jereh.android10.SDImgctivity"> <ImageView android:layout_width="match_parent" android:layout_height="150dp" android:id="@+id/img" android:scaleType="center" android:src="@mipmap/b" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/save" android:layout_below="@id/img" android:onClick="saveImg" android:text="保存" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/read" android:onClick="readImg" android:text="读取图片" android:layout_below="@+id/save" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/HtImg" android:onClick="HttpImg" android:text="读取网络图片" android:layout_below="@+id/read" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/HtSDImg" android:onClick="HtSD" android:text="保存网络图片" android:layout_below="@+id/HtImg" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> <ImageView android:layout_width="match_parent" android:layout_height="150dp" android:id="@+id/showImg" android:scaleType="center" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> </RelativeLayout>
下面是效果图:
相关文章推荐
- Android手机数据读写方法(内部存储、SD卡,网络加载,包内文件读取)
- Android数据存储:获取网络图片把图片保存到SD卡中并从SDk卡中读取(通过Bitmap方法)
- 我的Android之旅(十八)---数据存储--向SD卡保存网络上的图片
- 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)
- 我的Android之旅(十五)---数据存储---SD卡数据的读取
- 【Android 开发】:数据存储之File文件存储 [即SD卡的写入与读取]
- Android25闹钟项目——ArrayAdapter动态添加数据,显示数据,删除数据SharedPreferences存储数据,读取数据
- Android三级存储——将网络数据存储到内存和缓存
- 我的Android之旅(十四)---数据存储2---手机内存数据的读取
- Android数据读取 写入操作(SD卡文件存储、SharedPreferences存储)
- 【Android 开发】:数据存储之File文件存储 [即SD卡的写入与读取]
- 理解 Android 本地数据存储 API--利用首选项、SQLite 和内部及外部内存 API
- 【android学习之九】——数据存储1:SharedPreferences,Files,网络
- 【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式,并把SQLite的数据库文件存储在SD卡中!!!
- android 数据存储和访问方式五:网络详解
- android 读取网络在传输数据时的状态
- 【Android游戏开发十二】(保存游戏数据 [上文])详解SharedPreference 与 FIleInputStream/FileOutputStream将数据存储到SD卡中!
- Android 软件开发之数据的 新建 储存 读取 删除 详解(七)
- 【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式,并把SQLite的数据库文件存储在SD卡中!!!
- Android 网络数据读取及解析