在Java的IO类库里,应用最广泛的主要有两个设计模式,一个是装饰者模式,一个是适配器模式。
装饰者模式主要用于给一个对象动态的添加一些额外的职责,而不影响对象本身的属性,如BufferedInputStream装饰了FileInputStream,优化了文件读取的效率。
适配器模式,可以对于不同的对象进行适配,如对于InputStream而言,有ByteArrayInputStream、FileInputStream等等。
1、ByteArrayInputStream / ByteArrayOutputStream:直接操作字节数组的流,参考代码如下:
def bis = new ByteArrayInputStream('测试字节流'.getBytes('utf-8'))
def bos = new ByteArrayOutputStream()
def index = 0
while ((index = bis.read()) != -1) {
bos.write(index)
}
printf("输出字节流:bos.toString=%s,bos.size=%d",bos.toString(),bos.size())
2、FileInputStream / FileOutputStream:操作文件的流,参考代码如下:
def MAX_BYTE = 60000000 //设置单次读取的缓存最大值
def writeBytes(FileInputStream fis, FileOutputStream fos, int byteSize) {
def bytes = new byte[byteSize]
fis.read(bytes, 0, byteSize)
fos.write(bytes)
fos.flush()
}
def fis = new FileInputStream(new File('D:\\img.jpg'))
def fos = new FileOutputStream(new File('D:\\img_new.jpg'))
def available = fis.available()
def num = (int) Math.floor(available / MAX_BYTE)
def leave = (int) available % MAX_BYTE
for (int i = 0; i < num; i++) {
writeBytes(fis, fos, MAX_BYTE)
}
if (leave > 0) {
writeBytes(fis, fos, leave)
}
缺点是直接读取文件,在读写大文件时会有大量的IO操作
3、BufferedInputStream / BufferedOutputStream:操作内存缓存的流,参考代码如下:
def size = 1024
def fis = new FileInputStream("D:\\\\test.txt")
def bis = new BufferedInputStream(fis, 3*size)
def index = 0
def sp = new StringBuffer()
def bytes = new byte[size]
while ((index = bis.read(bytes)) != -1) {
sp.append(new String(bytes))
}
println '文件内容为:' + sp.toString()
def fos = new FileOutputStream('D:\\\\test_new.txt')
def bos = new BufferedOutputStream(fos, size * 3)
bos.write(sp.toString().getBytes('utf-8'))
bos.flush()
当操作大文件时要比FileInputStream/FileOutputStream速度快(一次多读入,存于内存中),缺点是当文件比较小时会有不必要的缓存操作