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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值