——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
IO流(三)
八、Properties类
Properties类可以从流中加载键值对信息。它具备map集合的特点,它储存的键值对都是字符串。是集合中和IO技术相结合的集合容器。
它的特点是可以拥有键值对形式的配置文件。
prop.setProperty(“张三”, “30”);----------------------张三=30
Java.util.Properties:一个可以将键值进行持久化存储的对象。Map–Hashtable的子类。
Map
|–Hashtable
|–Properties:用于属性配置文件,键和值都是字符串类型。
特点:1:可以持久化存储数据。2:键值都是字符串。3:一般用于配置文件。
|– load():将流中的数据加载进集合。
原理:其实就是将读取流和指定文件相关联,并读取一行数据,因为数据是规则的key=value,所以获取一行后,通过 = 对该行数据进行切割,左边就是键,右边就是值,将键、值存储到properties集合中。
|– store((OutputStream out, String comments):写入各个项后,刷新输出流。comments为注入信息
|– list():将集合的键值数据列出到指定的目的地。
九、IO包中的其他流
1.打印流
PrintStream();
打印流提供了打印方法,可以将各种数据类型的数据都原样打印。
字节打印流:
PrintStream
构造函数可以接受的参数类型:
1.file对象。File
2.字符串路径。String
3.直接输出流。OutputStream
字符打印流
PrintWriter();
构造函数可以接受的参数类型:
1.file对象。File
2.字符串路径。String
3.直接输出流。OutputStream
4.字符输出流。Writer
2.序列流
SequenceInputStream:对多个流进行合并
切割的时候用foc.read(new byte[1024],0,len);fos.close();
package test;
import java.io.*;
import java.util.*;
public class SequenStreamDemo{
public static void main(String[] args) throws IOException{
merge();
}
public static void Sequen() throws IOException{
Vector<FileInputStream> v= new Vector<FileInputStream>();
v.add(new FileInputStream("1.txt"));
v.add(new FileInputStream("2.txt"));
v.add(new FileInputStream("3.txt"));
Enumeration<FileInputStream> en= v.elements();
SequenceInputStream sis= new SequenceInputStream(en);
FileOutputStream fos= new FileOutputStream("4.txt");
byte[] buf= new byte[1024];
int len =0;
while((len=sis.read(buf))!=-1){
fos.write(buf, 0, len);
}
fos.close();
sis.close();
}
public static void merge() throws IOException{
ArrayList<FileInputStream> al= new ArrayList<FileInputStream>();//Vector效率太低。
for(int x=1; x<=3; x++){
al.add(new FileInputStream(x+".txt"));
}
final Iterator<FileInputStream> it= al.iterator();//这是匿名内部类,而且使用迭代器
Enumeration<FileInputStream> en= new Enumeration<FileInputStream>(){
public boolean hasMoreElements(){
return it.hasNext();
}
public FileInputStream nextElement(){
return it.next();
}
};//文件流的枚举
SequenceInputStream sis= new SequenceInputStream(en);
FileOutputStream fos= new FileOutputStream("0.txt");
byte[] buf= new byte[1024];
int len=0;
while((len=sis.read(buf))!=-1){
fos.write(buf, 0, len);
}
sis.close();
fos.close();
}
}
3.操作对象的流
ObjectOutputStream(); ObjectInputStream();
public class ObjectStreamDemo{
public static void main(String[] args) throws Exception{
writeObj();
readObj();
}
public static void writeObj() throws Exception{
ObjectOutputStream oos= new ObjectOutputStream(new FileOutputStream("a.object"));
oos.writeObject(new Person("sss",99));//写入的是内存数据,读出的是乱码。
oos.close();
}
public static void readObj() throws Exception{
ObjectInputStream ois= new ObjectInputStream(new FileInputStream("a.object"));
Person p= (Person) ois.readObject();
System.out.println(p);
ois.close();
}
}
package test;
import java.io.Serializable;
public class Person implements Serializable{//必须用序列化接口,给Person提供一个serialVersionUID数。
public static final long serialVersionUID = 42L;//定义一个定值(serialVersionUID是系统根据类内容生成的编号)
private String name;
int age;
public Person(String name, int age) {
// TODO Auto-generated constructor stub
this.name= name;
this.age= age;
}
public String getName() {
// TODO Auto-generated method stub
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
}
4.管道流
PipedlnputStream 和 PipedOutputStream
输入输出可以直接进行连接,通过结合线程使用
in.connect(out);
Read r= new Read(in);
Write w= new Write(out);
new Thread(r).start();
new Thread(w).start();
5.RandomAccessFile
随机访问文件,自身具备对象的方法。通过skipBytes(int x),seek(int x)来达到随机访问。
不是IO体系中的子类。而是直接击穿自Object。但是他说IO包中成员,因为它具备读和写功能。内部封装了一个数组,而且通过指针对数组的元素进行操作。可以通过getFilePointer获取指针位置。同事可以通过seek改变指针的位置。
其实完成对象的原因是内部封装了字节读取和输入流。
通过过着函数可以看成,该类只能操作文件。而且操作文件还有模式。(r rw rws rwd)
如果木事是只读r。不会创建文件。会去读取一个已存在文件,如果该文件不存在,则会出现溢出。如果木事为rw。那么对象的构造函数要操作文件不存在,会自动创建,如果存在会覆盖。
skipBytes(int n)跳过n个字节不能往回跳,seek(long pos)可以随便指。
可以用线程分段读写,用seek分字节段
6.操作基本数据类型
凡是操作基本数据类型就用
DataInputStream DataOutputStrem
7.字节数组流
用于操作字节数组的流对象。
ByteArrayInputStream:在构造的时候,需要结束数据源,而且数据源是一个字节数组。
BytArrayOutputStream:在构造的时候,不用定义数据目的,因为该对象中已经内部封装了可变长度的直接数组。这就是数据的目的。
因为这两个流对象都是操作的数组,并没有使用系统资源。所以,不用进行close关闭。
在流操作规律讲解时:
源设备,
键盘 System.in, 硬盘 FileStream , 内存 ArratySteam。
目的设备:
控制台 System.out, 硬盘 FileStream, 内存 ArratyStream。
用流的读写思想来操作数组。
8.操作字符数组
CharArrayIReader CharArrayWrite
9.操作字符串
StringReader StringWriter
十、字符编码
字符流的出现为了方便操作字符。更重要的是加入了编码转换。InputStreamRead OutputStreamWrite
两对象在构造的时候可以用编码表。
编码:字符串变成字节数组
String——byte[]; str.getBytes(charsetName);
解码:直接数组变成字符串
byte[]——-String; new String(byte(), charsetName);
iso8859-1:是欧洲拉丁文编码服务器上常用。
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-