`
trygood
  • 浏览: 79148 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

文件存储 OutputStream/InputStream

阅读更多
 对于游戏中的数据进行保存方式,在Android中常用的有四种保存方式,这里我先给大家统一先简单的介绍下:
1.  SharedPreference
此保存方式试用于简单数据的保存,文如其名属于配置性质的保存,不适合数据比较大的保存方式;
2. 文件存储 (FIleInputStream/FileOutputStream)
此保存方式比较适合游戏的保存和使用,可以保存较大的数据,因为相对于SQLite来说更容易让童鞋们接受,此方式不仅能把数据存储在系统中也能将数据保存到SDcard中;
3.SQLite
此保存方式比较适合游戏的保存和使用,可以保存较大的数据,并且可以将自己的数据存储到文件系统或者数据库当中,也可以将自己的数据存储到SQLite数据库当中,也能将数据保存到SDcard中;
4.ContentProvider (不推荐用于游戏保存)
此保存方式不推荐用于游戏保存,因为此方式不仅能存储较大数据,还支持多个程序之间就的数据进行交换!!! 但是由于游戏中基本就不可能去访问外部应用的数据,所以对于此方式我不予讲解, 有兴趣的可以去自行百度 google 学习;
以上简单的对几种常用的保存方式进行的概述,那么,下面会详细的去分析每个的优缺点以及每种保存的实现和需要注意的地方!


             保存方式之:  《文件存储 OutputStream/InputStream》           
优点: 1.适合游戏存储,能存储较大数据; 
 2.不仅能存储到系统中,也能存储到SD卡中!           
总结:如果童鞋们对SQL不太熟习的话那么选择此种方式最为合适的啦、嘿嘿
1. /**
2. * @author Himi
3. * @保存方式:Stream 数据流方式
4. * @注意1:默认情况下,使用openFileOutput 方法创建的文件只能被其调用的应用使用,
5. *         其他应用无法读取这个文件,如果需要在不同的应用中共享数据;
6. *         
7. * @注意2:因为android  os内部闪存有限,所以适合保存较少的数据,当然我们也有解决的方法,
8. *         就是把数据保存在SD开中,这样就可以了,后面我也会向大家讲解   !
9. *         
10. * @提醒1 调用FileOutputStream 时指定的文件不存在,Android 会自动创建它。
11. *        另外,在默认情况下,写入的时候会覆盖原 文件内容,如果想把新写入的内
12. *        容附加到原文件内容后,则可以指定其mode为Context.MODE_APPEND。
13. *         
14. * @提醒2 启动程序就初始化的时候一定要注意处理!代码中有注释!一定要仔细看!
15. *  
16. * @提醒3 这里我给大家讲两种方式,一种是原生态file流来写入/读入,
17. *        另外一种是用Data流包装file流进行写入/读入 其实用data流来包装进行操作;
18. *        原因是:包装后支持了更多的写入/读入操作,比如:file流写入不支持
19. *        writeUTF(String str); 但是用Data包装后就会支持。
20. *         
21. * @操作模式: Context.MODE_PRIVATE:新内容覆盖原内容
22. *            Context.MODE_APPEND:新内容追加到原内容后
23. *            Context.MODE_WORLD_READABLE:允许其他应用程序读取
24. *            Context.MODE_WORLD_WRITEABLE:允许其他应用程序写入,会覆盖原数据。
25. */  
26. public class MainActivity extends Activity implements OnClickListener {  
27.     private EditText et_login, et_password;  
28.     private Button btn_save;  
29.     private TextView tv_title;  
30.     private FileOutputStream fos;  
31.     private FileInputStream fis;  
32.     private DataOutputStream dos;  
33.     private DataInputStream dis;  
34.     @Override  
35.     public void onCreate(Bundle savedInstanceState) {  
36.         String temp = null;  
37.         super.onCreate(savedInstanceState);  
38.         getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,  
39.                 WindowManager.LayoutParams.FLAG_FULLSCREEN);  
40.         this.requestWindowFeature(Window.FEATURE_NO_TITLE);  
41.         setContentView(R.layout.main);  
42.         btn_save = (Button) findViewById(R.id.button_save);  
43.         btn_save.setOnClickListener(this);  
44.         et_login = (EditText) findViewById(R.id.editText_Login);  
45.         et_password = (EditText) findViewById(R.id.editText_Password);  
46.         tv_title = (TextView) findViewById(R.id.tv_title);  
47.         try {  
48.             // openFileInput 不像 sharedPreference 中  
49.             // getSharedPreferences的方法那样找不到会返回默认值,  
50.             // 这里找不到数据文件就会报异常,所以finally里关闭流尤为重要!!!  
51.             if (this.openFileInput("save.himi") != null) {   
52.                 // --------------单纯用file来读入的方式-----------------  
53.                 // fis = this.openFileInput("save.himi");  
54.                 // ByteArrayOutputStream byteArray = new  
55.                 // ByteArrayOutputStream();  
56.                 // byte[] buffer = new byte[1024];  
57.                 // int len = 0;  
58.                 // while ((len = fis.read(buffer)) > 0) {  
59.                 // byteArray.write(buffer, 0, len);  
60.                 // }  
61.                 // temp = byteArray.toString();  
62.                 // -------------- 用data流包装后的读入的方式------------  
63.                 fis = this.openFileInput("save.himi");//备注1   
64.                 dis = new DataInputStream(fis);  
65.                 et_login.setText(dis.readUTF());  
66.                 et_password.setText(dis.readUTF());  
67.                 // 这里也是在刚启动程序的时候去读入存储的数据  
68.                 // 读的时候要注意顺序; 例如我们写入数据的时候  
69.                 //先写的字符串类型,我们也要先读取字符串类型,一一对应!  
70.             }  
71.         } catch (FileNotFoundException e) {  
72.             // TODO Auto-generated catch block  
73.             e.printStackTrace();  
74.         } catch (IOException e) {  
75.             // TODO Auto-generated catch block  
76.             e.printStackTrace();  
77.         } finally {  
78.             // 在finally中关闭流!因为如果找不到数据就会异常我们也能对其进行关闭操作 ;  
79.             try {  
80.                 if (this.openFileInput("save.himi") != null) {  
81.                     // 这里也要判断,因为找不到的情况下,两种流也不会实例化。  
82.                     // 既然没有实例化,还去调用close关闭它,肯定"空指针"异常!!!  
83.                     fis.close();  
84.                 }  
85.             } catch (FileNotFoundException e) {  
86.                 // TODO Auto-generated catch block  
87.                 e.printStackTrace();  
88.             } catch (IOException e) {  
89.                 // TODO Auto-generated catch block  
90.                 e.printStackTrace();  
91.             }  
92.         }  
93.     }  
94.     @Override  
95.     public void onClick(View v) {  
96.         if (Environment.getExternalStorageState() != null) {  
97.             // 这个方法在试探终端是否有sdcard!  
98.             Log.v("Himi", "有SD卡");  
99.         }  
100.         if (v == btn_save) {  
101.             if (et_login.getText().toString().equals(""))  
102.                 tv_title.setText("请输入帐号!");  
103.             else if (et_password.getText().toString().equals(""))  
104.                 tv_title.setText("请输入密码!");  
105.             else {  
106.                 try {   
107.                     // ------单纯用file来写入的方式--------------  
108.                     //fos = new FileOutputStream(f);  
109.                     // fos.write(et_login.getText().toString().getBytes());  
110.                     // fos.write(et_password.getText().toString().getBytes());  
111.                     // ------data包装后来写入的方式--------------  
112.                     fos = this.openFileOutput("save.himi", MODE_PRIVATE);//备注2  
113.                     dos = new DataOutputStream(fos);  
114.                     dos.writeUTF(et_login.getText().toString());  
115.                     dos.writeUTF(et_password.getText().toString());  
116.                     tv_title.setText("保存成功!可重新打开此程序,测试是" +  
117.                             "否已经保存数据!\n(或者在'File Explorer'" +  
118.                             "窗口下-data-data-com.himi-files路径下" +  
119.                             "是否存在了'save.himi')");  
120.                 } catch (FileNotFoundException e) {  
121.                     // TODO Auto-generated catch block  
122.                     e.printStackTrace();  
123.                 } catch (IOException e) {  
124.                     // TODO Auto-generated catch block  
125.                     e.printStackTrace();  
126.                 } finally {  
127.                     // 在finally中关闭流 这样即使try中有异常我们也能对其进行关闭操作 ;  
128.                     try {  
129.                         dos.close();  
130.                         fos.close();  
131.                     } catch (IOException e) {  
132.                         // TODO Auto-generated catch block  
133.                         e.printStackTrace();  
134.                     }  
135.                 }  
136.             }  
137.         }  
138.     }  
139. }  
以上代码中实现了两种流形式来完成写入和读入,这里我们为什么要使用Data流来包装,其实不光是获得更多的操作方式,最主要的是方便快捷,你比如用file来读入的时候,明显的复杂了一些不说,它还一次性把所有数据都取出来了,不便于对数据的处理!强调的有几点:1: 在一开始对数据的访问再次提醒童鞋们,这个跟sharedPreference的获取方式不一样,sharedPreference 的获取方式可以得到一个默认的值,但是你用咱们获取的是个文件 而且直接就去open这个文件,一旦不存在必定异常,所以这一块的异常处理,以及finally的处理一定要处理得当。2.其实在一开始用data包装的时候发现写入的字符串在读入的时候发现字符乱码了,查了api才发现,api规定当写入字符串的时候必须写入UTF-8格式的编码,但是后来不知道怎么了就没事了。 - -、所以这里如果童鞋们遇到此问题,我给出大家一个解决方法,就是在写入的时候我们不要去DataOutputStream 来包装而是用,OutputStreamWriter ,因为在构造的可以设定编码!                                 OutputStreamWriter osw = new OutputStreamWriter(fis,"UTF-8"); String  content = EncodingUtils.getString(buffer, "UTF-8");  这个也能把字符数组转码制!这样写入的就肯定是UTF-8编码的字符啦、

下面介绍如何把我们的数据通过 OutputStream/InputStream 存入SD卡中!   其实将我们的数据放入SD卡中,无疑就需要对代码进行两处的修改:注意:一定要有SD卡!对于如何创建SD卡在前一篇文章中已经说了两种方式,不会的童鞋可以去看下;第一:检查是否装有SD卡;  第二: 修改读入的地方(备注1)         fis = this.openFileInput("save.himi"); //这里没有路径,路径是默认的 data-data-com.himi-files下       替换成我们的SD卡的路径就可以了:          File path = new File("/sdcard/himi/save.himi");//这里新建一个File目录路径          fis = new FileInputStream(path);传入路径第三 : 修改写入的地方(备注2)        fos = this.openFileOutput("save.himi", MODE_PRIVATE);这里也是默认路径,需要对其修改,       注意:这里修改了,那么在finally中的判定大家也要对应的适当修改;注意:如果是系统路径,当没有此文件的时候,android 会默认创建一个!但是我们放入SD卡的时候要自己创建目录路径和文件!
1. if (Environment.getExternalStorageState() != null) {// 这个方法在试探终端是否有sdcard!  
2.     Log.v("Himi", "有SD卡");  
3.     File path = new File("/sdcard/himi");// 创建目录  
4.     File f = new File("/sdcard/himi/save.himi");// 创建文件  
5.     if (!path.exists()) {// 目录存在返回false  
6.         path.mkdirs();// 创建一个目录  
7.     }  
8.     if (!f.exists()) {// 文件存在返回false  
9.         f.createNewFile();// 创建一个文件  
10.     }  
11.     fos = new FileOutputStream(f);// 将数据存入sd卡中  
12. }  
复制代码
第四: 因为我们要在SD卡中进行写入的操作,所以要在配置文件中声明权限!这一句就是啦~         <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 为了让大家看到所放的位置,所以把整个xml放出来供参考;那么当创建路径和文件的时候,我们对其检查SD卡中是否已经存在exists()方法 ,如果已经存在就不去创建,这样避免下次再次写入数据的时候又新建了文件和路径、其实我们在可以在启动程序的时候判断如果没有此文件,我们可以直接紧接着创建一个文件,这些都属于优化上的了,我主要是让大家引入,学会,那么其他的简化啦,优化啦,其他方式去实现啦都留给各位同学自己了、OK、今天就先介绍到这里,后面会单独剖析SQLite如何存入数据,以及对数据操作的! 希望大家继续关注!(推荐大家订阅本博客,因为咱的更新速度可是很快的~娃哈哈)
新的一年了小明祝福大家新的一年里,事业顺利,身体健康,全家幸福美满!





  • 大小: 32.6 KB
  • 大小: 32.6 KB
分享到:
评论

相关推荐

    将输出流OutputStream转化为输入流InputStream的方法

    总结,将`OutputStream`转换为`InputStream`主要依赖于中间数据存储区,如`ByteArrayOutputStream`,再转换为对应的`InputStream`实例。这在处理临时数据或需要反向读取已写数据的场景中非常有用。了解这个转换技巧...

    java 文件存储 Inputstream outputstream reader writer的用法

    `InputStream`、`OutputStream`、`Reader`和`Writer`是Java IO流的基础类,它们提供了读写文件的基本接口。本篇文章将深入讲解这些类的用法,并提供实际的代码示例,帮助初学者更好地理解和应用。 1. `InputStream`...

    java io InputStream and outputStream

    // 保存文件 File file2 = new File("bbb.txt");// 定位文件 OutputStream os = new FileOutputStream(file2);// 打开文件 os.write(cont); os.close();// 关闭文件 } catch ...

    Java基础核心+InputStream输入流+OutputStream输出流

    文件内容会被存储在Part对象中,然后可以通过Part对象的write方法将其保存到服务器的特定位置。 总的来说,Java基础核心的学习包括对语言语法、面向对象编程、异常处理、集合框架等多个方面的理解。而InputStream和...

    android文件存储

    在Android应用开发中,文件存储是一种常见的数据持久化方法,尤其适用于存储小量的数据,例如...通过理解并熟练运用上述知识,开发者可以在Android应用中有效地实现文件存储功能,为用户提供稳定的数据保存和恢复体验。

    android的assets下的文件保存到sd卡

    这里使用了`FileOutputStream`来写入文件,确保文件被正确地保存到外部存储设备。 值得注意的是,从Android 6.0(API级别23)开始,应用程序需要在运行时请求写入外部存储的权限,即使应用已经在AndroidManifest....

    使用urlconnection下载文件或图片并保存到本地

    * 使用URLConnection下载文件或图片并保存到本地。 * * @author 老紫竹(laozizhu.com) */ public class URLConnectionDownloader { public static void main(String[] args) throws Exception { ...

    android 将assets 下的文件复制到手机内存中

    这段代码首先创建了目标文件,然后通过循环读取`inputStream`的数据并写入`outputStream`,完成文件的复制。 5. **处理异常和权限检查** 在实际操作中,需要注意文件操作可能抛出的各种异常,比如文件已存在、无...

    android 应用 源代码——文件下载

    - **OutputStream/InputStream**:读写文件,通常用于接收网络流并将其写入本地文件。 6. **进度反馈与UI更新**: - 可以通过Handler或者AsyncTask来更新UI,展示下载进度。 - 使用ProgressDialog、ProgressBar...

    文件上传/下载使用输入输出流操作文件

    3. **安全存储**:避免文件名注入,确保文件存储路径的安全性。 总之,文件上传/下载是Web应用中的重要功能,涉及输入输出流的使用。理解并熟练掌握这些概念和技巧,对于开发高效、安全的Java Web应用至关重要。...

    安卓数据存储之文件存储

    在Android系统中,数据存储是应用开发的重要环节,它涵盖了多种方式,如SQLite数据库、SharedPreferences、ContentProvider以及文件存储等。本篇文章将重点探讨“安卓数据存储之文件存储”,包括内部存储和外部存储...

    android读写数据,文件i/o操作

    首先,Android提供了两种主要的文件存储方式:内部存储和外部存储。内部存储适用于应用私有的数据,不会被其他应用访问;外部存储则可以共享,但需要遵循Android的权限管理。 1. **内部存储**: - 使用`...

    Android存储数据之一:文件保存与读取.pdf

    3. Java I/O技术:输入输出流是实现文件读写的核心技术,包括字节流(InputStream/OutputStream)和字符流(Reader/Writer)。字节流用于处理二进制数据,而字符流则用于处理文本数据。 4. 文件读写操作:文件的...

    内部存储

    3. `InputStream` 和 `OutputStream`: 读写文件时,通常会用到`InputStream`和`OutputStream`。例如,使用`openFileInput(String name)`获得`InputStream`,用`openFileOutput(String name, int mode)`获取`...

    Android的文件存储

    要理解Android的文件存储,首先要明白Android是如何用什么方式获取和存入数据的。Android的文件操作都是通过流的方式进行的,即IO。Android的文件操作跟Java是一样的,文件操作分为输入流(InputStream)和输出流...

    Android代码-文件夹的创建将raw中文件放到SD卡中将assets中文件保存到SD卡中压缩包的解压文件的删除功能.rar

    这个压缩包文件"Android代码-文件夹的创建将raw中文件放到SD卡中将assets中文件保存到SD卡中压缩包的解压文件的删除功能.rar"包含了几个关键的Android文件操作知识点。下面我们将详细探讨这些内容。 首先,让我们从...

    文件IO学习笔记

    在IT领域,文件I/O(Input/Output)是程序与外部数据存储设备交互的重要部分,无论是读取配置文件、处理用户输入,还是保存程序运行结果,都离不开文件I/O操作。本篇学习笔记将深入探讨文件I/O的基本概念、常见API、...

    使用java上传MP4文件至mongodb数据库,并下载 源代码

    在IT行业中,数据库存储是关键任务之一,尤其是对于大型或者非结构化数据,如多媒体文件。MongoDB是一个流行的选择,因为它支持BSON文档格式,能够处理各种类型的数据,包括视频文件如MP4。本篇文章将深入讲解如何...

    Struts2文件流方式导出下载excel、Txt、image图片

    Struts2提供了文件流的方式来实现这一需求,这种方式避免了在服务器上生成临时文件,提高了效率并减少了服务器存储空间的占用。下面将详细讲解如何使用Struts2的文件流技术来实现这些功能。 首先,我们需要理解文件...

    java的io流文件读写

    这两类流又分别分为输入流(InputStream/Reader)和输出流(OutputStream/Writer),用于数据的读取和写入。 1. 字节流:InputStream和OutputStream是所有字节输入流和输出流的基类。例如,FileInputStream和...

Global site tag (gtag.js) - Google Analytics