首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络技术 > 网络基础 >

JavaI/0操作输入输出流简介(1)

2013-03-28 
JavaI/0操作输入输出流简介(一)public void writeFile(String pathName, String fileName, InputStream in

JavaI/0操作输入输出流简介(一)
public void writeFile(String pathName, String fileName, InputStream in) {if (in == null) {return;}File file = new File(pathName, fileName);File parentFile = file.getParentFile();if (parentFile != null && !parentFile.exists()) {parentFile.mkdirs();}OutputStream out = null;int len = -1;byte[] buf = new byte[2048];//每次读取2K的字节到内存中try {out = new FileOutputStream(file, false);while ((len = in.read(buf)) != -1) {//每次读取2K的字节到内存中out.write(buf, 0, len);//将内存中的数据写到文件中}out.flush();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {try {if (out != null) {out.close();}} catch (IOException e) {System.out.println(e);}}}public InputStream readFile(String filePath, String fileName) {File file = new File(filePath, fileName);if (!file.exists()) {return null;}InputStream in = null;try {in = new FileInputStream(file);} catch (IOException e) {System.out.println(e);}return in;}

?

?

? ? ? 上面的代码只是最简单,最基本的数输入输出操作,但是呢,我们在I/O操作的时候,可能需要额外的增加一些动作或者控制,如定位输入流中的行号、增加缓存区,防止每次都进行实际的写操作等等,这些额外的功能当然可以通过继承的方式得到,但是继承的方式不好(这个就不用多说了吧,设计模式和effective java都反复的讲到 ),我们知道“装饰者”模式是一种替代继承方式的很好的策略,而在Java的I/O操作中,正式这种思想,其中所有装饰器的基类就是前面讲的FilterInput(Output)Stream咯。

? ? ? 但是呢,装饰者模式也有不好的地方,最显著的地方就是由于及其的灵活,导致产生了大量的对象(但是类的数目不多,我们可以自由的组合这些类,从而实现不同的功能),因此有的时候增加了代码的读复杂度。这也是Java i/o操作让人感觉不好用的原因。

? ? ? ? ? 1)通过FilterInputStream从InputStrem 读取数据?

? ? 主要类型有:

? ? ? ? ? ? ? ? ? DataInputStream ? ? ? ? 与DataOutputStream配合使用,我们可以从流中读取基本的数据类型如int,float,byte等等,对应的方法是reedInt() ?readFloat() readByte() ? ?

? ? ? ? ? ? ? ? ? BufferedInputStream ? 可以防止每次读取都得进行实际的读操作,取而代之的是使用缓冲区,BufferedInputStream对外提供滑动读取的功能实现,通过预先读入一整段原始输入流数据至缓冲区中,而外界对BufferedInputStream的读取操作实际上是在缓冲区上进行,如果读取的数据超过了缓冲区的范围,那么BufferedInputStream负责重新从原始输入流中载入下一截数据填充缓冲区,然后外界继续通过缓冲区进行数据读取。这样的设计的好处是:避免了大量的磁盘IO,因为原始的InputStream类实现的read是即时读取的,即每一次读取都会是一次磁盘IO操作(哪怕只读取了1个字节的数据)。

? ? ? ? ? ? ? ? ? LineNumberInputStream ?可以用于跟踪六种的行号,但是这个其实没太大用处了,因为其他形式的inputstream得到行号的操作还是比较简单的

? ? ? ? ? ? ? ? ? PushbackInputStream ?这个用起来感觉更少了,不说了

? ? ? ? ?2)通过FilterOutStream像OutputStream中写入

? ? ? ? ? ?主要类型有:

? ? ? ? ? ? ? ? DataOutputStream ? ?通过它可以向流中写入基本的数据类型。

? ? ? ? ? ? ? ? PrintStream ?它最初的目的便是为了以可视化格式打印所有的基本数据类型和Sreing对象,有两个重要的方法print()和println() 它与DataOutStream的区别是(都是处理基本数据类型嘛),PrintStream处理数据的显示,而后者处理的是数据的存储。

? ? ? ? ? ? ? ? BufferedOutputStream 避免每次发送数据时都要进行实际的写操作。使用flush()方法可以清空缓冲区。

? ? ? ? ? ? ??

?

?

热点排行