——- 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");
}
}
大家可以试试上面的合并流把这些文件给合并一下看看能不能播放!