黑马程序员——配置,操作文件

——- android培训java培训、期待与您交流! ———-

Properties类

定义:

Properties 类表示了一个持久的属性集。 
Properties 可保存在流中或从流中加载。 
属性列表中每个键及其对应值都是一个字符串。 
一个属性列表可包含另一个属性列表作为它的“默认值”; 
如果未能在原有的属性列表中搜索到属性键,则搜索第二个属性列表。 
因为 Properties 继承于 Hashtable,
所以可对 Properties 对象应用 put 和 putAll 方法。 
但不建议使用这两个方法,因为它们允许调用者插入其键或值不是 String 的项。 
相反,应该使用 setProperty 方法。如果在“不安全”的 Properties 对象 
(即包含非 String 的键或值)上调用 store 或 save 方法,则该调用将失败。 
类似地,如果在“不安全”的 Properties 对象(即包含非 String 的键) 
上调用 propertyNames 或 list 方法,则该调用将失败。 

我们日常用到的程序比如迅雷,里面设置了下载路径,同时下载的数目,等等,而且下次启动时这些配置不会丢失是怎么做到的呢?对于JAVA我们可以用Properties setProperty(String key, String value) 和getProperty(String key) 来进行配置文件
示例一:保存人的信息包含姓名,年龄,然后能过人名获取年龄,还有信息全部打印出来
我们要用到的构造方法:

Properties() 
      创建一个无默认值的空属性列表。

我们要用到的调用方法:

setProperty(String key, String value) 
      调用 Hashtable 的方法 put。
getProperty(String key) 
      用指定的键在此属性列表中搜索属性。 
Set<String> stringPropertyNames() 
      返回此属性列表中的键集,其中该键及其对应值是字符串,如果在主属性列表中未找到同名的键,则还包括默认属性列表中不同的键。 
import java.util.Properties;
import java.util.Set;

public class OperateFileDemo {

    private void writeInfo(){
        Properties prop = new Properties();
        //设置属性值
        prop.setProperty("zhang", "11");
        prop.setProperty("li", "18");
        prop.setProperty("wang", "23");
        //通过属性名称来获取内容
        System.out.println(prop.getProperty("li"));
        //获取所有属性值的名称
        Set<String> set = prop.stringPropertyNames();
        for(String s:set){
            System.out.println(s+":"+prop.getProperty(s));
        }
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new OperateFileDemo().writeInfo();
    }

}

这里写图片描述
示例二:如果有一个配置文本,已经存在配置信息格式为”属性名称”=”属性值”….有许多这样的数量,我们怎么读取并显示呢?

分析:方法-我们可以用文本读取流来读文本的行然后对行进行"="分格 
,然后打印出信息. 
方法二:通过Properties的void load(Reader reader)的方法来取出值, 
方法二更简单我们就用方法二吧!
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;
import java.util.Set;

public class OperateFileDemo {

    private void writeInfo(){
        try {
            FileReader fis = new FileReader("c:\\puke\\woshiku.txt");
            Properties prop = new Properties();
            try {
                prop.load(fis);
                Set<String> set = prop.stringPropertyNames();
                for(String s:set){
                    System.out.println(s+":"+prop.getProperty(s));
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            try {
                fis.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new OperateFileDemo().writeInfo();
    }

}

这里写图片描述

许多时候我们上网看小说,小说总是一章节一章节的每次看都要切换章节感觉好烦啊!我们经常看到有些下载软件下载电影的时候一部电影分成若干部分,等到最后下载完成的各个部分全部都全为一起了.
我们一般是这样想的,读一个写一个,直到写完最后一个文件,感觉这样好繁琐啊!JAVA提供一个SequenceInputStream类,这个类厉害之处于它把所有文件汇到一起,我们只需要读完该流就可以完成对文件的合并.
示例:把多个文件合成一个文件
我们要用到的类:SequenceInputStream()(合并流)

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

我们要用到的构造方法:

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

我们要用到的方法:

      int read(byte[] b, int off, int len) 
      将最多 len 个数据字节从此输入流读入 byte 数组。 
      void close() 
      关闭此输入流并释放与此流关联的所有系统资源。 
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.SequenceInputStream;
import java.util.Enumeration;
import java.util.Vector;

public class CombineFile {
    private void combineFiles(){
        //因为Vector能返回Enumeration,所以采用了VECTOR
        Vector<FileInputStream> vector = new Vector<FileInputStream>();
        try {
            //添加要合并的路径
            vector.add(new FileInputStream("c:\\puke\\part1.txt"));
            vector.add(new FileInputStream("c:\\puke\\part2.txt"));
            vector.add(new FileInputStream("c:\\puke\\part3.txt"));
            vector.add(new FileInputStream("c:\\puke\\part4.txt"));
            vector.add(new FileInputStream("c:\\puke\\part5.txt"));
            vector.add(new FileInputStream("c:\\puke\\part6.txt"));
            //拿到序列流要的对象(类似于叠代器)
            Enumeration<FileInputStream> en =vector.elements();
            SequenceInputStream ss = new SequenceInputStream(en);
            FileOutputStream fos = new FileOutputStream("c:\\puke\\combine.txt");
            byte []buf = new byte[1024];
            int len;
            try {
                while((len=ss.read(buf))!=-1){
                    fos.write(buf, 0, len);
                }
                fos.close();
                ss.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new CombineFile().combineFiles();
    }

}

这里写图片描述

既然有了合并流那么有没有分割流呢?答案是有的而且非常简单哟!
所谓分格就把一个大文件折分成许多小文件
要求:把一个电影折成无数部分最大不要超过10MB

分析:我们平时经常用到读取流, 
试想一想我每一次讯取1MB然后再把文件写出不就可以了
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class SplitFile {
    //用于写文件
    private void writeFile(String path,byte []buf,int len){
        try {
            FileOutputStream fos = new FileOutputStream(path);
            try {
                fos.write(buf,0,len);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            try {
                fos.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
    //读取文件
    private void readFile(String path,String name){
        try {
            FileInputStream fis = new FileInputStream(path+name);
            int count =0;
            //定义缓存为10MB
            byte []buf = new byte[1024*1024*10];
            int len;
            try {
                while((len=fis.read(buf))!=-1){
                    //每次读取给分割部分加1
                    writeFile(path+"part"+count,buf,len);
                    count++;
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }   
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new SplitFile().readFile("c:\\puke\\", "生活大爆炸.第七季.mkv");
    }

}

这里写图片描述
这里写图片描述
这里写图片描述
大家可以试试上面的合并流把这些文件给合并一下看看能不能播放!

——- android培训java培训、期待与您交流! ———-

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值