黑马程序员_java Properties与序列流篇Day5

来源:互联网 发布:js ajax push 编辑:程序博客网 时间:2024/06/06 20:20

  ----------------------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图片切割的。

 

publicstaticvoid 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培训、期待与您交流! -----------

 

 

原创粉丝点击