IO流的理解第二篇

        上篇介绍到文件File类的一些常用方法,这篇写写java中常用的2种流(字节流、字符流)以及他们是怎么去操作文件的。实际运用当中这两种流是常常结合缓冲流、转换流 一起使用,先给大家看看这几种流间的关系。

一、字节流

1,字节输入流    

      InputStream超类

              FileInputStream

              BufferedInputStream(缓冲流) 顾名思义是为了提高操作文件时的效率

常用方法:

 * int read() 读取一个字节
 * int read(byte[] b) 读取一定量字节
 * int read(byte[] b,int off, int len)将输入流中最多len个数据字节读入b中

2,字节输出流

      OuputStream 超类

            FileOutputStream

            BufferedOuputStream(缓冲流)

常用方法:

 *write(int b) 写入一个字节        写入此输出流
 *write(byte[] b) 写入字节数组
 *write(byte[] b, int off, int length) 写入字节数组  off 开始写入的索引 length 写几个

二、字符流(只能操作文本类型的文件)

1,字符输入流

      Reader超类

           BufferedReader 字符输入缓冲流

           InputStreamReader 转换流(字节转换为字符流)  InputStreamReader(FileInputStream in,String charsetName) 

                  FileReader (读取字符)

2,字符输出流

     Writer

         BufferedWriter 字符输出缓冲流

         OutputStreamWriter 转换流

                FileWriter (写入字符)  要使用flush()方法刷新流,否则写不进去

3,流的选择

      明确需求,要操作的时数据源还是数据目的。

      数据源:就是读,读到哪?InputStream(将数据读到此流中)

      数据目的:就是写,写到哪?OutputStream(将数据写到此流中)

注:我们可以这样理解。输入流输出流是面向文件的,而缓冲流是面向字节(字符)的,所以缓冲流是不能单独使用的。

BufferedInputStream bis =new BufferedInputStream (new FileInputStream(path));

三、与流相关的类:Properties类(Hashtable的子类,map集合中的方法都可以用)

       构造方法:Properties pro = new Properties();

       load(InputStream)  把指定流所对应的文件中的数据,读取出来,保存到Propertie集合中

       load(Reader)  

       store(OutputStream,commonts)把集合中的数据,保存到指定的流所对应的文件中,参数commonts代表对描述信息

       stroe(Writer,comments);

下面以读取zip包为例来体验这些流的使用:

       d盘目录下下有个a.zip的压缩包,里面有个名为helleo文件夹,文件家中有张1.png图片

/**
 * 获取zip包的大小和解压之后的大小及里面的条目数
 * 获取图片分辨率(宽度和高度)
 *
 */
public class TestZipDemo {
	
	private static int LEN = 10000;
	private static final String path = "d:\\a.zip";
	public static void main(String[] args) {
		//先定义好要使用的文件和流对象
		File file = null;
		ZipFile zf = null;
		FileInputStream is =null;
		//缓冲流
		BufferedInputStream bis = null;
		ZipInputStream zis =null;
		ZipEntry zipEntry = null;
		//zip包的大小 单位B
		Long size = 0L;
		//zip解压之后的大小 单位B
		Long totalSize = 0L;
		//zip包中的条目数,文件夹也算
		int total = 0;
		//zip包中的条目数,文件夹也算
		int zipEntryies = 0;
		//读取字节到该数组
		byte b[] = new byte[LEN];
		
		//创建相关实例对象
		file = new File(path);
		try {
			zf = new ZipFile(path);
			is = new FileInputStream(path);
			bis = new BufferedInputStream(is);
			zis = new ZipInputStream(bis);
			size = file.length();
			total = zf.size();
			//遍历zip包
			while((zipEntry = zis.getNextEntry()) != null){
				//读一个加一个
				zipEntryies++;
				//是否为文件夹
				if(!zipEntry.isDirectory()) {
					String zipEntryName = zipEntry.getName();
					//获取该节点的输入流
					InputStream iss = zf.getInputStream(zipEntry);
					Image image = ImageIO.read(iss);
					//获取该图片的宽度
					int imageWidth = image.getWidth(null);
					//获取该图片的高度
					int imageHeigh = image.getHeight(null);
                    System.out.println("zipEntryName= "+zipEntryName);
					System.out.println("imageWidth= "+imageWidth);
					System.out.println("imageHeigh= "+imageHeigh);
					
					int cout = 0;
					while ((cout = zis.read(b, 0, LEN)) != -1){
						totalSize += cout;
					}
				}
			}
			System.out.println("size= "+size);
			System.out.println("total= "+total);
			System.out.println("zipEntryies= "+zipEntryies);
			System.out.println("totalSize= "+totalSize);
		} catch (ZipException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			try {
				if(zis != null)
				zis.close();
			} catch (IOException e) {
				throw new RuntimeException("释放资源失败");
			}
		}
		
		
	}

}

打印结果:

zipEntryName= helleo/1.png
imageWidth= 604
imageHeigh= 390
size= 79383
total= 2
zipEntryies= 2
totalSize= 80579

根据原作 https://pan.quark.cn/s/0ed355622f0f 的源码改编 野火IM解决方案 野火IM是专业级即时通讯和实时音视频整体解决方案,由北京野火无限网络科技有限公司维护和支持。 主要特性有:私有部署安全可靠,性能强大,功能齐全,全平台支持,开源率高,部署运维简单,二次开发友好,方便与第三方系统对接或者嵌入现有系统中。 详细情况请参考在线文档。 主要包括一下项目: 野火IM Vue Electron Demo,演示如何将野火IM的能力集成到Vue Electron项目。 前置说明 本项目所使用的是需要付费的,价格请参考费用详情 支持试用,具体请看试用说明 本项目默认只能连接到官方服务,购买或申请试用之后,替换,即可连到自行部署的服务 分支说明 :基于开发,是未来的开发重心 :基于开发,进入维护模式,不再开发新功能,鉴于已经终止支持且不再维护,建议客户升级到版本 环境依赖 mac系统 最新版本的Xcode nodejs v18.19.0 npm v10.2.3 python 2.7.x git npm install -g node-gyp@8.3.0 windows系统 nodejs v18.19.0 python 2.7.x git npm 6.14.15 npm install --global --vs2019 --production windows-build-tools 本步安装windows开发环境的安装内容较多,如果网络情况不好可能需要等较长时间,选择早上网络较好时安装是个好的选择 或参考手动安装 windows-build-tools进行安装 npm install -g node-gyp@8.3.0 linux系统 nodej...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值