您的位置:首页 > 编程语言 > Java开发

Thinking in Java——第十八章-Java I/O系统

2016-08-09 10:58 369 查看
Java I/O的类有很多。我们要去学习I/O类库演化的过程。因为,如果缺少历史的眼光,我们很快就会对什么时候该使用哪些类,以及什么时候不该使用它们而感到困惑。

首先,如何去看javaI/O库中的源码呢,比如我想看BufferedInputStream的。

import java.io.BufferedInputStream;


然后按住ctrl加左键点击就可以了

18.1 File类

这个称作FilePath类更好一些

package com.sdkd.JavaIO;

import java.io.File;
import java.io.FilenameFilter;
import java.util.Arrays;
import java.util.regex.Pattern;

public class DirList {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
File path = new File(".");
String[] list;
if(args.length == 0){
System.out.println("args。length == 0");
list = path.list();
}else{
list = path.list(new DirFilter(args[0]));
}
Arrays.sort(list, String.CASE_INSENSITIVE_ORDER);
for(String dirItem : list){
System.out.println(dirItem);
}
}

}
class DirFilter implements FilenameFilter{

private Pattern pattern;
public DirFilter(String regex){
pattern = Pattern.compile(regex);

}
@Override
public boolean accept(File dir, String name) {
// TODO Auto-generated method stub
return false;
}

}


这个书上的例子是要用命令行来运行 加参数才使String【】不为空。另外类里面的Filtername的引用可以用内部类来实现。

File类有许多操作,自行google。

File path = new File("hms.txt");
if(path.exists()){
System.out.println(path.getAbsolutePath());
}else{
path = new File("hms.txt");
System.out.println(path.getAbsolutePath());
}


这里第一个 path = new File(“hms.txt”)创建的只是一个文件流而已。

下面检测之后确认是要创建一个文件。

18.2 输入和输出

流:它代表有能力产出数据的数据源对象或是有能力接受数据的接收端对象。”流”屏蔽了实际的I/O设备中处理数据的细节。

有时候,我们想创建单一的流,但是却要创建多个对象。其实这是Java的装饰者模式(我blog的设计模式里有)。

/*----start modify by hms 2016-8-12----*/


用BufferedInputStream的例子介绍一下流中的装饰者模式,首先要知道BufferedInputStream的优点是通过修改InputStream流中read()方法的可以明显的减少I/O操作。

public class BufferedInputStream extends FilterInputStream


BufferedInputStream继承FilterInputStream,而FilterInputStream是InputStream的简单实现。但是BufferInputStream中的read()方法明显不同于FilterInputStream。

看BufferedInputStream的构造方法

public BufferedInputStream(InputStream in){
this.(in,defaulBuffersize);
}


BufferedInputStream可以修饰继承了InputStream的类。

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File("hms.txt")));


可能有人说这不就是简单的继承吗,看下面的代码,互相都可以修饰。

BufferedInputStream bis01 = new BufferedInputStream(new DataInputStream(new FileInputStream(new File("hms.txt"))));

DataInputStream bis02 = new DataInputStream(new BufferedInputStream(new FileInputStream(new File("hms.txt"))));


我只是讲了装饰者模式在这里的应用,讲的不清楚,大家可以先去看一下我的设计模式blog。

18.3

添加属性和有用的接口。

像DataInputStream这个流,继承了FilterInputStream,还添加了DataInput这个接口。这个DataInput接口中的带的方法就是DataInputStream特有的方法。

18.4 Reader和Writer

提供兼容Unicode与面向字符的I/O功能。之前的InputStream和OutputStream是面向字节的

后面大多都是对具体流的详解,我感觉知道会了方法掌握它们应该不成问题,就不一一列举了。

--/*start------modify by hms 2016-8-9 20:33----*/


访问量莫名其妙的刷呀,为了对得起大家的访问,我来分享一下我学习一种流的方法。



我现在要学习DataInputStream这个类:

1、首先得知道它是干啥的:http://zhidao.baidu.com/link?url=HnUklmrw1gPwKCpxSoWSQDv78_DjNghg75ljd3LZ2Z4UdJc9sYFTtsFp-HoU1Xt4nxHbDfhIDACMqf-McxY4GK(将基本类型输入流中)

2.通过查看它继承的类和实现的接口来知道它的通用方法和独有的方法。

左键+ctrl + java.io.DataInputStream



DataInputStream继承FilterInputStream,还实现DataInput接口

/*---start---modify by hms ---2016-8-12------*/


重新看了看这个类,发现它并没有体现装饰者模式,这个读者自己体会,

BufferedInputStream是标准的装饰者模式。

/*---end---modify by hms ---2016-8-12------*/


先看它的DataInput中的接口

还是左键+ctrl+DataInput

列举几种:
int readInt() throws IOException;
long readLong() throws IOException;


这是这个类特有的方法,就是能够直接读入基本类型,还是很方便的。

那再去看FilterInputStream

左键+ctrl+FilterInputStream

这个类是FilterInputStream

看到它又继承了InputStream,我们知道InputStream是一个抽象类,那么InputStream应该是吧抽象类实现了。实际java.io.FilterInputStream中有自己的解释。

/**
* A <code>FilterInputStream</code> contains
* some other input stream, which it uses as
* its  basic source of data, possibly transforming
* the data along the way or providing  additional
* functionality. The class <code>FilterInputStream</code>
* itself simply overrides all  methods of
* <code>InputStream</code> with versions that
* pass all requests to the contained  input
* stream. Subclasses of <code>FilterInputStream</code>
* may further override some of  these methods
* and may also provide additional methods
* and fields.
*
* @author  Jonathan Payne
* @version 1.33, 04/07/06
* @since   JDK1.0
*/


现在DataInputStream的内部构造十分清晰:在拥有InputStream的全部方法的基础上拥有DataInput的特殊方法。

在到网上搜一下它的用法

http://www.yiibai.com/java/io/datainputstream_readunsignedshort.html

敲几行代码,so easy~

七夕快乐~

--/*end-------modify by hms 2016-8-9 21:54----*end/--------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java io