---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
1、SequenceInputStream
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();
}
}
3、Properties
Properties是hashtable的子类也就是说它具备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));
}
}
}
4、Properties的例子:
创建程序运行次数配置文件超过限定次数时,不能运行程序
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>、期待与您交流! ----------------------