Java IO浅析

本文介绍Java IO类库中的两种主要设计模式——装饰者模式与适配器模式,并通过示例展示不同类型的流操作,包括直接操作字节数组、文件以及内存缓存的流,探讨其优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      在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速度快(一次多读入,存于内存中),缺点是当文件比较小时会有不必要的缓存操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值