黑马程序员—SequenceInputStream和Properties类

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

1SequenceInputStream

SequenceInputStream 表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。

 

SequenceInputStream和InputStream一样都有read方法,用法基本一致。

 

SequenceInputStream的构造方法:

SequenceInputStream(Enumeration<? extends InputStream> e)
通过记住参数来初始化新创建的 SequenceInputStream,该参数必须是生成运行时类型为 InputStream 对象的 Enumeration 型参数

   

SequenceInputStream(InputStream s1, InputStream s2)
通过记住这两个参数来初始化新创建的 SequenceInputStream(将按顺序读取这两个参数,先读取 s1,然后读取 s2),以提供从此 SequenceInputStream 读取的字节。

 

下面的这个程序是用SequenceInputStream创建有三个输入流的管道流,并将管道流中的三个输入流依次写入指定的文件中。

 

publicclass SequenceDemo

{

    publicstaticvoid main(String[] args)throws IOException

    {

       //创建Vector集合,这个集合的泛型是FileInputStream类型的

       Vector<FileInputStream> v = new Vector<FileInputStream>();

      

       //向集合中添加文件字节流对象

       v.add(new FileInputStream("G:\\1.txt"));

       v.add(new FileInputStream("G:\\2.txt"));

       v.add(new FileInputStream("G:\\3.txt"));

      

       //将这些集合中的元素转化成Enumeration类型

       Enumeration<FileInputStream> en = v.elements();

      

       //将这些文件字节流放入管道流中

       SequenceInputStream sis = new SequenceInputStream(en);

      

       //创建文件输出流对象

       FileOutputStream fos = new FileOutputStream("G:\\4.txt");

      

       byte[] buf = newbyte[1024];

      

       int len = 0;

      

       //将管道流中的字节流依次写入创建的文件中

       while((len = sis.read(buf))!=-1)

       {

           fos.write(buf, 0, len);

       }

      

       fos.close();

      

       sis.close();

    }

 

}

 

2、思考:SequenceInputStream流可以把几个文件合成为一个文件,那么他可以把一个文件又分成若干个文件吗?答案是不能的,应为Sequence只用读取流SequenceInputStream而并没有SequenceOutputStream,所以他不能把一个文件分离成若干个文件。

下面一个例子中有两个函数,一个是用SequenceInputStream把文件合并的combine,一个是用普通方法把文件分离成若干个文件的split

publicclass SplitFile

{

    publicstaticvoid main(String[] args)throws IOException

    {

       split();

       combine();

    }

   

    //将两个文件用管道流合成一个文件

    publicstaticvoid combine()throws IOException

    {

       //创建Vector集合,集合中的对象是FileInputStream对象

       Vector<FileInputStream> v = new Vector<FileInputStream>();

      

       //向集合中加入两个流对象

       v.add(new FileInputStream("G:\\123\\2.part"));

       v.add(new FileInputStream("G:\\123\\1.part"));

      

       //将这些集合中的元素转化成Enumeration类型

       Enumeration en = v.elements();

      

       //将这些文件字节流放入管道流中

       SequenceInputStream sis = new SequenceInputStream(en);

      

       //创建文件输出流对象

       FileOutputStream fos = new FileOutputStream("G:\\111.jpg");

      

       byte[] buf = newbyte[1024];

      

       int len = 0;

      

       //将管道流中的字节流依次写入创建的文件中

       while((len = sis.read(buf))!=-1)

       {

           fos.write(buf, 0, len);

       }

       fos.close();

       sis.close();

    }

   

    //将一个文件分割成若干个文件

    publicstaticvoid split()throws IOException

    {

       //创建一个文件读取流对象用来读取文件

       FileInputStream fis = new FileInputStream("G:\\123.jpg");

      

       //创建一个文件输出流对象用来写入数据

       FileOutputStream fos = null;

      

       //定义一个1024*1024字节大小的字节数组

       byte[] buf = newbyte[1024*1024];

      

       int len = 0;

      

       //定义一个标识文件名的整型数

       int count = 1;

      

       //将源文件中的数据循环写入每次新建的文件中

       //每循环一次就创建一个被写入数据的文件

       while((len = fis.read(buf))!=-1)

       {

           //创建被写入数据的文件

           fos = new FileOutputStream("G:\\123\\"+(count++)+".part");

          

           //将数据写入创建好的文件中

           fos.write(buf, 0, len);

          

           //关闭输出流流

           fos.close();

       }

       //关闭读取流

       fis.close();

    }

 

}

 

3Properties

Propertieshashtable的子类也就是说它具备map集合的特点,而且它里面存储的键值对都是字符串是集合中和IO技术相结合的集合容器

该对象的特点:可以用于键值对形式的配置文件

 练习:

 info.txt中的键值数据存到集合中进行操作

 1、用一个流和info.txt文件关联

 2、读取一行数据,将该行数据用“=”进行切割

 3、等号左边作为键,右边作为值,存入到Properties集合中即可

 

 

 

publicclass PropertiesDemo

{

    publicstaticvoid main(String[] args) throws IOException

    {

       //setAndget();

       method_1();

    }

   

    publicstaticvoid method_1()throws IOException

    {

       //打开一个字符流读文件

       BufferedReader bufr  = new BufferedReader(new FileReader("info.txt"));

      

       String line = null;

      

       //创建一个属性对象

       Properties prop = new Properties();

      

       while((line = bufr.readLine())!=null)

       {

           //“=”分割字符串成两个字符串

           String[] arr = line.split("=");

          

           //将分割出来的字符串存进Properies对象中

           prop.setProperty(arr[0], arr[1]);

          

           System.out.println(arr[0]+"::"+arr[1]);

       }

      

       bufr.close();

      

       System.out.println(prop);

      

    }

   

    //设置和获取属性名和值

    publicstaticvoid setAndget()

    {

       Properties prop = new Properties();

      

       //设置属性键和值

       prop.setProperty("name", "admin");

      

       prop.setProperty("password", "lsk123");

      

       System.out.println(prop);

      

       //获得属性的值

       String name = prop.getProperty("name");

      

       System.out.println(name);

      

       Set<String> sp =  prop.stringPropertyNames();

      

       //遍历属性集合

       for(String s : sp)

       {

           System.out.println(s+prop.getProperty(s));

       }

      

    }

 

}

 

4Properties的例子:

创建程序运行次数配置文件超过限定次数时,不能运行程序

publicclass RunCount

{

    publicstaticvoid main(String[] args) throws IOException

    {

       //创建Properties对象

       Properties prop = new Properties();

      

       //创建文件对象

       File file = new File("count.ini");

      

       //如果file不存在就创建

       if(!file.exists())

           file.createNewFile();

      

       //创建文件读取流对象

       FileInputStream fis = new FileInputStream(file);

      

       //从输入流中读取属性列表

       prop.load(fis);

      

       int count = 0;

      

       //获取value属性值

       String value = prop.getProperty("time");

      

       if(value!=null)

       {

           count = Integer.parseInt(value);

          

           //如果运行次数大于5次结束运行

           if(count>5)

           {

              System.out.println("please regest!");

              return ;

           }

       }

      

       //运行次数加一

       count++;

      

       //time属性的值设置为count

       prop.setProperty("time", count+"");

      

       //创建写文件流

       FileOutputStream fos = new FileOutputStream(file);

      

       //将此 Properties 表中的属性列表(键和元素对)写入输出流

       prop.store(fos, "");

      

       fos.close();

      

       fis.close();

      

      

      

    }

 

}

 ---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值