通过全面几期对Android的入门级了解,感知若要想学好Android,不单单需要对Android运行机制和开发技巧融会贯通,Java基础也是必不可少的,由于工作上比较少用到IO流这块,之前接触的一点点也忘记了,所以近期很有必要花点时间复习了一下,下面对其做些总结。
我认为:IO流在整个Java体系中其开发包是比较复杂的,也是一个难点,想要跨过此道门槛,必须要对面向对象的概念非常熟悉,而且要对抽象类非常了解。引用李老师的话,IO流的核心是:根据实例化子类的不同,完成的功能也不同。其实就是多态。
1、File类
File类是与文件操作有关的类,如创建、删除等操作。其构造方法是public File(String pathname),可以看出,若要生成一个File对象,必须指定路径,看下图代码:
需要注意的是:不同操作系统路径之间的斜杠也不同,如windows系统是\\,而liunx是//,为了更好的跨平台,此处最好使用file类提供的API,file.separator,它会自动判断当前机子是属于哪类操作系统,从而动态的返回斜杠。至于还有很多有关file类的操作,我们可以根据文档来合理的使用,如:file.isFile();//判断是否是文件,file.isDirectory();//判断是否是目录等等。
下面来看个有关File操作范例:列出一个指定文件夹中的所有内容。
想要显示其路径则可以使用file.listFiles();
2、字节流和字符流
通过上来的例子可以知道,File只是与文件有关的操作,其并不能对文件的内容进行操作,如果要对文件内容进行操作,就需要通过使用字节流和字符流来完成,但不管是哪一种操作,都有其固定的操作顺序:
·使用File类找到文件
·通过字节流或字符流的子类进行对象的实例化
·进行读、写操作
·关闭字节流或字符流
注意:由于流是属于资源性的操作,所以一定要通过关闭来释放资源。
操作流有以下几个:字节流 InputStream OutputStream 字符流 Writer Reader
2.1、字节输出流(OutputStream)
此类定义如下:public abstract class OutputStream extends Object implements Closeable, Flushable
由于是个抽象类,根据面向对象的概念,必须由子类对其进行实例化操作。其方法如下:
void | close() 关闭此输出流并释放与此流有关的所有系统资源。 |
void | flush() 刷新此输出流并强制写出所有缓冲的输出字节。 |
void | write(byte[] b) 将b.length 个字节从指定的字节数组写入此输出流。 |
void | write(byte[] b, int off, int len) 将指定字节数组中从偏移量off 开始的 len 个字节写入此输出流。 |
abstract void | write(int b) 将指定的字节写入此输出流。 |
下面范例使用OutputStream向路径D:\file\test.txt输出Hello World!!!
此代码每执行一次都会覆盖掉之前的内容,如果不想将其覆盖掉,则在实例化时候可以调用另外一个构造方法
new FileOutputStream(file,true)即可。若要换行则可以在字符串中输入\r\n,形如:“\r\nHello World!!!”,试试看。
2.2、字节输入流(InputStream)
此类定义如下:public abstract class InputStream extendsObject implementsCloseable
显然,它也需要通过子类对其进行实例化操作,其常用操作方法有:
abstract int | read() 从输入流读取下一个数据字节。 |
int | read(byte[] b) 从输入流中读取一定数量的字节并将其存储在缓冲区数组b 中。 |
int | read(byte[] b, int off, int len) 将输入流中最多len 个数据字节读入字节数组。 |
下面使用InputStream从路径D:\file\test.txt读出内容。
3.1、字符输出流(Writer)
此类定义如下:public abstract class Writer extends Object implements Appendable, Closeable, Flushable
显然,它也需要通过子类对其进行实例化操作,其常用操作方法有:
范例:使用Writer向文件输出内容:
由此可以发现,我们无法操作的java的API,非常轻松实现了对文件的操作,所以下面Reader类就不再写,感兴趣的可以自己去练习,下面对字节流和字符流做一个比较:
字节流和字符流在其代码结构上是有很多相似处,但其内部本身是有区别的,其中最大的区别在于字符流在操作的时候会使用到缓冲区,而字节流不会用到。
在使用字节流OutputStream向外输出时,若最后不关闭流,也可以向外输出,但是若采用字符流Writer向外输出时不关闭流,则肯定不会输出消息,因为内容都存放在缓冲区处,显然,当调用了close()时,意味着清空缓存。