`

Android开发之I/O流下篇

阅读更多
原帖地址:http://www.cnblogs.com/idayln/archive/2013/05/29/3106487.html

  在上篇中,已经写下了IO流概念以及对File类操作,如果想查阅上篇的内容,请点击这里: http://www.cnblogs.com/idayln/archive/2013/05/27/3102810.html . 此文是它的姊妹篇!本文以Demo为主,不会涉及太多概念!!!



  • 输入流: InputStream/Reader 拥有一系列read方法

    • InputStream 是字节输入流的超类

    • Reader是字符输入流的超类



  • 输出流: OutputStream/Writer 拥有一系列write方法

    • OutputStream 字节输出类的超类

    • Writer 字符输出流的超类




输出流代码:



1 static void demo0() throws Exception {
2 try (OutputStream outputStream = new FileOutputStream("demo1.txt")) {
3 outputStream.write("First 'demo' for how to use 'OutputStream' !"
4 .getBytes());
5 }
6 System.out.println("Over");
7 }


看到这段代码,是不是感觉有点奇怪?别紧张.



  1. 上段代码是Java 7中异常新特性:try-with-resources: 它可以自行进行资源管理,例如上例就不需要手动close;需要注意的是:try(/* 此处可以是代码块 */),这种语法节省的好多代码。

  2. OutputStream是个抽象类,它必须通过子类来进行实例化。

  3. OutputStream主要分为二种功能

    1. 字入数据的write系列方法

      1. 参数为byte: 单一字节

      2. 参数为byte数组

      3. 参数为byte数组和数组中的起始位置与长度


    2. 流的控制

      1. 关闭:close

      2. 刷新保存:flush: 其实不必手动flush。第一:当内部缓冲期满过,它会自动自动执行flush;第二:当invoke close方法时,会自动执行flush。




输入流代码:



 1 static void demo1() throws IOException{
2 InputStream inputStream =null;
3 try {
4 inputStream = new FileInputStream("demo0.txt");
5 byte[] bb = new byte[1024]; //缓冲区
6 int temp;
7 while((temp=inputStream.read(bb))!=-1){
8 System.out.println(new String(bb, 0, temp));
9 }
10 } catch (FileNotFoundException e) {
11 // TODO Auto-generated catch block
12 e.printStackTrace();
13 }finally{
14 if(inputStream!=null){
15 inputStream.close();
16 }
17 }
18 }


 InputStream:



  1. 上段采用Java 6的语法,是不是明显感觉到代码量增多:从7行增加到18行。

  2. 与OutputStream一样是个抽象类。因为它们都是比较早设计的类,因此并没有采用流行的面向接口编程思想。

  3. 与OutputStream一样也主要有二个功能:read系列方法,但是它的流的控制没有flush而是添加了skip,mark这二个方法,平时用得少,感兴趣的同学可以自行去查API。


Reader,Writer与InputStream,OutputStream基本功能相,这里就不在解释。深入理解了InputStream与OutputStream之后,学其它就很快;对于不同的处理流,查API就行!!


附上IO流体系结构表:


IO流体系结构








































































分类 字节输入流 字节输出流 字符输入流 字符输出流
抽象基类 InputStream OutputSteam Reader Writer
文件 FileInputStream FileOutputSteam FileReader FileWriter
数组 ByteArrayInputStream ByteArrayOutputStream CharArrayReader CharArrayWriter
缓冲 BufferedInputStream  BufferedOutputStream BufferdReader

BufferWriter  


对象 ObjectInputStream ObjectOutputStream    
转换     InputStreamReader OutputStreamWriter
打印   PrintStream   PrintWriter
字符串     StringReader StringWriter
管道 PipedInputStream PipedOutputStream PipedReader PipedWriter

 


这多类,该如何记忆,理解呢? 我是这么理解的。


首先把它们大致划分为:节点流与处理流。节点流就是直接与物理节点,进行交互;而处理流通常直接处理的对象是节点流,是再上一层的包装。


比如:如果想对read操作进行同步缓冲,可以使用BufferedInputStream:



 1 static void demo2() throws Exception{
2 InputStream inputStream =null;
3 BufferedInputStream bufferedInputStream =null;
4 try {
5 inputStream = new FileInputStream("demo0.txt");
6 bufferedInputStream = new BufferedInputStream(inputStream);
7 byte[] bb = new byte[1024];
8 int temp=-1;
9 while((temp=bufferedInputStream.read(bb))!=-1){
10 System.out.println(new String(bb,0,temp));
11 }
12 } catch (FileNotFoundException e) {
13 // TODO Auto-generated catch block
14 e.printStackTrace();
15 }finally{
16 if(inputStream!=null){
17 inputStream.close();
18 }
19 }
20 }


RandomAccessFile: 任意访问内容类:既可以读取文件内容,也可以向文件输出数据,可以自由访问文件的任意位置,它可以自由定位文件记录指针。


二个重要方法:



  1. long getFilePointer(): 获取文件记录的当前指针位置

  2. void seek(long position): 将文件的记录指针特定position的位置。


使用RandomAccessFile 必须要设置模式:



  1. r: 只读

  2. rw: 读写,如果不存在,则自动创建。

  3. rws: 读写,读文件内容与元数据改动都会同步更新到Target Device上;

  4. rwd:与rws类似,差别在于,当元数据改动后,不会同步更新到Target Device



 1 static void demo3() throws Exception{
2 RandomAccessFile file = new RandomAccessFile("demo0.txt", "rw");
3 System.out.println("Before invoke write:"+file.getFilePointer());
4 file.seek(file.length());
5 file.write("\nUsing RandomAccessFile Class".getBytes());
6
7 System.out.println("After invoke write:"+file.getFilePointer());
8 file.seek(0);
9 byte[] bb = new byte[1024];
10 int temp=-1;
11 while ((temp=file.read(bb))>0) {
12 System.out.println(new String(bb,0,temp));
13 }
14
15 file.close();
16 }


如果要在指定的位置进行插入内容,那必须得把指定位置的内容进行缓存,不然会被替代。



 1 static void demo4(String fileName,long position,String content) throws Exception{
2 RandomAccessFile file = new RandomAccessFile(fileName, "rws");
3 File tempFile = File.createTempFile("temp", null);
4
5 long currentLength = file.length();
6 if(position>currentLength){
7 return;
8 //Maybe you can setup position=currentLenght; Also you can setup anything what you want !!!
9 }
10 FileOutputStream fileOutputStream = new FileOutputStream(tempFile); // write data to "temp" file
11 FileInputStream fileInputStream = new FileInputStream(tempFile); // read data
12 byte[] bb = new byte[512];
13 int tempNum=-1;
14
15 file.seek(position);
16
17 while((tempNum=file.read(bb))>0){
18 fileOutputStream.write(bb, 0, tempNum);
19 }
20
21 file.seek(position); // Go back to position
22 file.write(content.getBytes());
23
24 while((tempNum=fileInputStream.read(bb))>0){
25 file.write(bb, 0, tempNum);
26 }
27
28 tempFile.deleteOnExit();
29 if(fileInputStream!=null){
30 fileInputStream.close();
31 }
32 if(fileOutputStream!=null){
33 fileOutputStream.close();
34 }
35
36 file.close();
37 }


 

本文链接

分享到:
评论

相关推荐

    android 查找程序根目录下所有文件 java i/o与ListActivity的结合

    在Android开发中,有时我们需要遍历应用程序的根目录,查找并处理其中的所有文件。这个过程通常涉及到Java的I/O操作和Android的ListActivity组件。本文将深入探讨如何将这两个技术结合,实现查找并显示程序根目录下...

    Android IO

    Android提供了多种I/O机制,使得开发者能够有效地读写文件、处理流数据以及与网络通信。以下将详细介绍Android I/O操作的相关知识点。 1. 文件操作: - `File`类:用于创建、读取、写入、删除文件和目录。通过构造...

    Android经典设计源码-IOStreamSample.rar

    在Android开发中,I/O流是处理数据输入输出的基础工具,对于任何涉及文件读写、网络通信的应用来说都至关重要。本项目通过具体的源码示例,帮助开发者理解和掌握如何在Android环境中高效、灵活地运用I/O流。 首先,...

    android开发笔试题及答案

    这些问题涵盖了Android开发的不同知识点,如Java I/O流、编程基本概念、字符串处理、内存管理、条件判断、Activity生命周期、Intent使用、XML解析技术、自定义样式的定义、SQL Server数据库操作等。这些知识点对...

    korio,Korio:Kotlin Coroutines I/O:流+异步TCP客户机/服务器+WebSockets+异步注入器+异步路由器+虚拟文件系统+序列化(XML/JSON/yaml)+Redis+Cassandra+ElasticSearch+Amazon Dynamodb&S3;+OAuth(Google&Facebook;),适用于JVM、Android、node.js和浏览器.zip

    通过利用协程的挂起机制,可以在非阻塞的方式下执行 I/O 密集型操作。 2. **异步 TCP 客户端/服务器**:Korio 提供了构建高性能、非阻塞的 TCP 通信的能力,支持客户端连接和服务器监听,这在处理大量并发连接时...

    成为Android数据流大师

    在Android开发中,输入/输出(I/O)操作是非常重要的一个环节,它涉及到设备与外部世界的数据交换,包括通过网络、存储设备等多种途径进行数据的读取与写入。深入理解Android的I/O概念对于开发者来说至关重要,这有...

    Android C/S结构代码

    通过学习这个项目,开发者可以掌握如何在Android环境下进行网络编程,以及如何高效地处理二进制数据,这对于开发涉及网络通信的Android应用非常有价值。在实际应用中,还可以根据需求扩展到其他类型的数据传输,如...

    安卓Android源码——IOStreamSample.rar

    在Android开发中,理解并熟练掌握I/O流(InputStream和OutputStream)的使用至关重要。IOStreamSample项目旨在深入解析Android平台下的输入输出流操作,帮助开发者更好地理解和应用这些核心概念。本文将详细探讨...

    Android示例

    在Android开发中,I/O(Input/Output)操作是至关重要的,特别是在处理数据存储、文件读写、网络通信等方面。本示例“Android示例”着重于“io测试”,意在展示如何在Android环境中有效利用Java的I/O流进行各种操作...

    android 字符串输入输出流

    首先,Android系统基于Java,因此它的I/O流库与Java的标准I/O库相似。在Java中,`java.io`包提供了处理输入输出的基本类,如`InputStream`和`OutputStream`。这些类是所有输入和输出操作的基础,但它们处理的是原始...

    android Socket(TCP /UDP)

    这可能导致性能问题,因此在高并发场景下,可以考虑使用非阻塞I/O或异步I/O。 HTTP与Socket的区别在于,HTTP是基于TCP的应用层协议,它提供了更高级别的请求/响应模型,包括方法(GET, POST等)、状态码、头部信息...

    Android大作业.zip

    【Android大作业.zip】是一个包含了两个重要项目的压缩文件,这些项目是针对Android开发的学习与实践。根据提供的描述,我们可以深入探讨这两个项目所涉及的关键知识点。 ### 第1题:网络通信程序 这个项目要求在...

    Android开发最佳学习路线图

    - **文件与I/O流**:掌握文件操作及输入输出流的基本用法。 - **多线程**:了解多线程编程的基本原理和常见问题。 - **网络编程**:学习如何在网络环境下进行数据传输和通信。 - **图形用户界面**:利用Java AWT和...

    OpenGL如何处理YUV数据(Android开发)(格式:I420、NV12、NV21)

    OpenGL在Android开发中被广泛用于实现高性能的图形渲染,其中包括处理视频帧的YUV数据。YUV是一种常见的视频编码格式,常用于节省带宽和存储空间,因为它是为彩色视频设计的一种分量编码方式,不同于RGB这样的像素...

    新版Android开发教程.rar

    Android Android Android Android 开发背景 � 计算技术、无线接入技术的发展,使嵌入式系统逐渐有能力对桌面系统常规业务进行支持。 � 谷歌长期以来奉行的移动发展战略:通过与全球各地的手机制造商和移动运营商...

    Android应用源码之(游戏保存之Stream).zip

    在游戏保存的上下文中,Stream可能被用来读取或写入文件,但请注意,这里的“Stream”更可能指的是I/O流,而不是Java的Stream API。 3. **I/O流**:在Java中,输入/输出流(Input/Output Stream)是处理数据传输的...

    Android开发书籍

    5. **输入/输出(I/O)**:理解Java I/O流系统,如何读写文件和网络通信。 6. **Java与Android API的接口**:介绍如何将Java代码与Android SDK中的特定类和接口结合,以实现Android特有的功能。 另一方面,...

    文件流IO,android文件流

    在Java和Android开发中,文件流(IO,Input/Output)是进行数据读写的核心机制。文件流IO允许程序从磁盘、网络或其他输入源读取数据,或将数据写入到输出目标,如磁盘、网络或打印机。下面将详细探讨文件流IO的基本...

    Android开发问题集锦 情人节特刊

    根据提供的文件信息,我们可以梳理出关于Android开发的一系列知识点。首先,文件中提到“Android...希望这些知识点能够帮助开发者在Android开发之路上更进一步,同时在面试和笔试中有所准备,为求职和职业发展加分。

    android系统mp3播放器开发源码

    在Android平台上开发一个MP3播放器涉及...通过这个源码,你可以学习到如何将以上知识点有效地整合到一个实际项目中,这对于提升Android开发技能非常有帮助。同时,分析和调试源码也能加深对Android系统底层机制的理解。

Global site tag (gtag.js) - Google Analytics