黑马程序员-课堂笔记-Properties类及文件切割及文件合并练习

  ------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------

    其实重点主要是Properties,只是文件的切割和合并是对所学知识的一个综合练习,设计的内容比较多,包括容器,异常,泛型,打印流等所以标题就成这样的,又是Properties,又是切割又是合并的,可能Properties远不止这些功能,以下内容为个人课堂笔记,将按自己的理解方式经行记录,如有阅读者另有高见,请不吝赐教,批评指正,我本菜鸟。无畏批评,教导。请多关照。

Properties:类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。——这句话是JavaAPI上面的说明,我怎么都不能理解,听毕老师的视频后,个人的理解是:Properties是一种对io流和图(键值对)相结合的一种对软件配置信息的持久化存储的优化。以下是课程中讲解Properties的主要方法:

String getProperty(String key):返回值为字符串类型,而Properties是hashtable的子类,它具备map集合的特点,并且该集合中存储的是键值对组合成的一个一个的字符串,集合中的元素就像hashmap中实例调用entrySet()返回的Entry一样,把键和值合并成了一个元素,而这个元素包含了键和值的信息,并可以同个Properties方法重新将他们分开。getProperty的参数是map集合的键,返回的是对应的值。

例如:

Properties propt=new Properties();                      
                     propt.setProperty("wangwu", 23+"");
                     propt.setProperty("zhangsan", 20+"");                     
                    System.out.println(propt.getProperty("wangwu");//打印结果会是23.


 

    既然上述内容中已经涉及到了setProperty()方法,那先阐述我对这个方法的了解,其实本来就因为放一块儿将的,学javabean,不就是讲的get和set吗?听课后练习写代码时该方法,基本上有两个作用,第一,相当于集合中的add或是append,能够往properties中加入数据,第二,能够针对修改已经存在的键值对中的值。增加元素的功能是因为当时我修改容器中的wangwu的值时,少打了一个g。但打印结果却多了一个wanwu的结果。  “  propt.setProperty("wanwu", 40+"");”就这句话的作用。

    能够发表的笔记,是不是不光自己要能够便于理解、记忆和学习,还要别人能起到同样的作用哈?刚想到这,我就想起是不是做笔记也得讲个科学性,比如下边的内容, 就像类的抽象化,重点是抽取共性,那下边我分三个部分分别讲述(或者说是记录我的课堂笔记),因为菜鸟讲出来的东西,都是需要经过大神们考验才是准确的东西,更何况软件是一门很注重细节的专业。不表达一下我的不专业,怕会贻笑大方之家哦……  嘿嘿,言归正传:

        第一部分:void list(PrintStream out)和void list(PrintWriter out)重载了。一个接收字节流参数,一个接收字符流参数。将属性列表输出到指定的输出流propt.list(System.out);//列出集合目录。并打印在控制台上。学到的就这么点内容,其他没什么可讲的,我一直在想的是:将属性列表输出到指定的输出流。,如果参数传递的不是System.out,而是文件,是不是这存储的格式就它prpt.list();方法说了算?“-- listing properties --”这玩意儿去掉咋整呢?再有?不是输出到指定的流里边去了吗?要是我把指定的流再封装一下。接下来又该咋整了?要是我的接收文件有固定格式不需要这个“-- listing properties --”那得咋整啊?是不是这个list()方法就只局限于打印输出?

        第二部分:void load(Reader reader)和void load(InputStream inStream)和list()方法差不多,也是返回空,也是接收字节流,接收字符流参数,其实说到这里,共性就出来了,下面将的第三部分,也存在着同样的共性,也是返回空,接收字节流字符流重载。讲完第三部分,把他们整一块吧。印象更加深刻。void load(InputStream inStream)——从输入流中读取属性列表(键和元素对)。void load(Reader reader)按简单的面向行的格式从输入字符流中读取属性列表(键和元素对)。其实两者都是按面向行的格式读取属性列表,在API对load(InputStream inStream)没有细细赘述了,实例如下:

Properties propt=new Properties();//创建Properties对象

FileInputStream fis=new FileInputStream("src\\com\\itheima\\info.txt");//创建字节输入流,并关联源。

 propt.load(fis);//调用load方法,并把字节输入流传递给load方法。然后load方法按简单的面向行的格式从输入字节流中读取属性列表。

        第三部分:void store(OutputStream out, String comments)和void store (Writer writer ,String comments)其实功能和load正好相反!load是从持久化存储的文件中获取配置信息传递给Properties集合,store则是从内存中的Properties集合中通过调用方法,并通过输出流,把需持久化存储的配置信息存储到配置文件中存储起来。实例如下:

                             Properties propt=new Properties();
                             FileOutputStream fos=new FileOutputStream("src\\com\\itheima\\info.txt");
                             propt.store(fos, "PropertiestoFile");
                             propt.list(System.out);//此行用于获取内存中Properties集合中的数据,然后和已经传到的配置文件中的配置信息进行对比(假如是修改配置信息,而不是新建的配置文件)!

                      传递字节流参数

                         传递字符流参数
void list(PrintStream out)void list(PrintWriter out)
void load(InputStream inStream)void load(Reader reader)
void store(OutputStream out, String comments)void store(Writer writer,String comments)

 

 

切割文件:

1.需求:把一个文件按固定文件大小,把一个文件切割成几个独立的文件片段,并以.properties为扩展名的文件格式保存文件片段。

2.思路:文件时以大小进行切割,思路是:定义字节数组缓冲区,假设文件是以1M的容量进行切割,然后通过读取流关联需要被切割的文件。同时建立字节输出流。接收字节数组缓存区的数据。因为是切割成为多个片段文件,如果不知道被切割文件的大小,可以通过在循环体中新建输出流对应每个需接收数据的片段文件。

3步骤(代码):

 

public static void splitFile()throws Exception
	{
		File f=new File("i.txt");
		System.out.println(f.getAbsolutePath());
		FileInputStream fis = new FileInputStream("splitfiles\\helloworld.mp3");
		FileOutputStream fos=null;
		byte [] buf=new byte[1024*1024];
		int len=0;
		int count=1;
		while((len=fis.read(buf))!=-1)
		{
			fos=new FileOutputStream("splitfiles\\"+(count++)+".part");
			fos.write(buf, 0, len);
			fos.close();
		}
		fis.close();
	}

 

合成文件:

1.需求:把上例中的片段文件重新组合成一个可执行的.mp3文件。

2.思路:根据逆向思维,将多个文件组合成一个文件,那么需建立多个输入流,对应一个输出流。问题是多个流如何与一个流建立有序传输数据的连接呢?本例中引入了SequenceInputStream。它的作用是将多个流合并成一个流。并以最后一个流的终止符,作为改合并了的流终止符。先分别建立对应多个片段文件的字节输入流(因为引入的SequenceInputStream是字节流),并且与文件关联。下一步试将多个流文件按顺序合并到SequenceInputStream流中。但是这里涉及到一个问题是:SequenceInputStream有两种重载形式的构造函数,一种是接收一个Enumeration的参数,而另外一个只接收两个字节输入流!所以就只能选择第一种SequenceInputStream(Enumeration<? extends InputStream> e)。问题有出来了,怎么将多个输入流变成一个Enumeration然后传递给SequenceInputStream呢?同时Enumeration是一个接口!?摆在眼前的一堆选择(1、Vector容易可以实现就多个元素返回成一个Enumeration,但是执行效率不高;2、可以考虑用执行效率高的容器,然后通过实现Enumeration接口来创建枚举实例达到同样的效果)。接下来就是创建缓冲区,创建输出流,按同样的思路执行即可。

3.步骤(代码):

 

	public static void merge()throws Exception
	{
		ArrayList<FileInputStream> arrlist=new ArrayList<FileInputStream>();
		for(int i=1;i<5;i++)
		{
			//FileInputStream fis=new FileInputStream("splitfiles\\"+i+".part");
			arrlist.add(new FileInputStream("splitfiles\\"+i+".part"));
			//fis.close();
		}
		final Iterator<FileInputStream> it=arrlist.iterator();
		Enumeration<FileInputStream> en=new Enumeration<FileInputStream>()
		{
			public boolean hasMoreElements()
			{
				return it.hasNext();
			}
			public FileInputStream nextElement()
			{
				return it.next();
			}
		};
		SequenceInputStream sis=new SequenceInputStream(en);
		byte [] buf = new byte[1024];
		FileOutputStream fos=new FileOutputStream("splitfiles\\shanming.mp3");
		int len=0;
		while((len=sis.read(buf))!=-1)
		{
			fos.write(buf, 0, len);
		}
		
		fos.close();
		sis.close();
		
		//fos.write(en);
	}

 

 

 

  FileInputStream fis = new FileInputStream("splitfiles\\helloworld.mp3");

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值