----------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! -----------
黑马程序员_java Properties与序列流篇Day5
核心:
1,当我们写应用的时候,如果用户已经使用的次数过了,就要提醒注册
2,序列流,在序列流中切割时注意我们每一部分的大小,待会组装时,可以比这个小,但绝不能比它大,如:读取时byte[] b=newbyte[1024*200]; 200K,最好在切割与组装时保持一致。
其实这篇博客早该写了,但总是抑制不止这颗想继续看视频的心,
不过还是相信“不积跬步无以至千里,不积小流无以成江海”,不罗嗦了,还是来点实在的吧。
(一)
Properties的黑马程序员_java基础_Day2(上),这篇文章已基本介绍了Properties是什么,但并没有将其应用介绍清楚,当我们使用文本编辑器或者一些其他软件时,我们可能会注意到,当我们将文件中字体选中变色后,当我们关闭软件再次打开,颜色是改变后的颜色,这说明软件把用户选则的操作记录下来了,将其存放在文件中,当再次打开时,我们就会看到这样的结果。
其实Properties最重要的还是与流一起操作,Properties类中几个重要的方法我们的注意一下的,分别是:load(),List(),store().这些方法都是为我们的功能服务的,当我们写应用的时候,如果用户已经使用的次数过了,就要提醒注册。
一步一步来:
Step1,学习Properties与流结合的读取
Properties prop=new Properties();
FileInputStream fr=newFileInputStream("d:/1/1.txt");
prop.load(fr);//fr代表的是输入流
prop.list(System.out); System.out代表输出流,只不过是输出在控制台
Step2,学习Properties与流结合的写入
Properties prop=new Properties();
prop.setProperty("num",String.valueOf(1));
FileOutputStream fw=new FileOutputStream("d:/1/2.txt");
prop.store(fw,"注册登记");
其实结合这两个我们就可以实现注册监控了,我们将prop.setProperty("num",String.valueOf(1));
中的1改为变量,读取时重新赋值,这样不就实现了监控吗?
Step3,原理,为什么Properties直接用store就可以存储我们的键对值呢?
其实我们就是不用他的方法,直接用流操作也能实现这样监控的功能,但是这样不更加简单吗,他的底层还是用流操作的。
如下:只举了写Properties的部分代码。
FileReader f=new FileReader("d:/1/1.txt");
BufferedReader br=new BufferedReader(f);
// int len=0;
String str=null;
// char[] b=new char[1024];
Properties p=new Properties();
while((str=br.readLine())!=null)
{
String[]str1=str.split("=");
//System.out.println(str1[0]+"="+str1[1]);
p.setProperty(str1[0],str1[1]);
}
(二)
序列流,SequenceInputStream,从字面意思我们就应该知道了,这是由许多流组成的一个队列,在总结序列流之前先了解一下文件切割SplitFile(这个是我们自己要实现的类),这个有点牛,我们可以将我们的文件切割成很多部分,直接上代码,这是我写的将一张700多K图片切割的。
publicstatic void SplitFile()throws IOException
{
FileInputStream fis=new FileInputStream("d:/12.jpg");
BufferedInputStream bis=newBufferedInputStream(fis);
int len =0;
byte[] b=newbyte[1024*200];
int num=1;
while((len=bis.read(b))!=-1)
{
System.out.println("sd");
FileOutputStream fos=new FileOutputStream("d:/"+num+".part");
BufferedOutputStream bos=new BufferedOutputStream(fos);
num++;
bos.write(b);
bos.close();
}
bis.close();
}
其实他就是一个写操作,不过就是这两句
FileOutputStream fos=new FileOutputStream("d:/"+num+".part");
BufferedOutputStream bos=new BufferedOutputStream(fos);
加到了while里面实现的效果。Num变量主要是为了文件名不一样。如果一样,那不覆盖了吗!
我们看看效果:
那切完了,我们还要组装吧,就用到了序列类,代码如下
Vector<FileInputStream>e=new Vector<FileInputStream>();
FileInputStream fis1=new FileInputStream("d:/1.part");
FileInputStream fis2=new FileInputStream("d:/2.part");
FileInputStream fis3=new FileInputStream("d:/3.part");
FileInputStream fis4=new FileInputStream("d:/4.part");
e.add(fis1);
e.add(fis2);
e.add(fis3);
e.add(fis4);
Enumeration<FileInputStream> enm=e.elements();
SequenceInputStream sis=new SequenceInputStream(enm);
FileOutputStream fos=new FileOutputStream("d:/隐形的翅膀.jpg");
BufferedOutputStream bos=newBufferedOutputStream(fos);
int len=0;
byte[] b=newbyte[1024*200];
while((len=sis.read(b))!=-1)
{
bos.write(b);
}
----------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! -----------