操作基本数据类型的流、内存操作流、打印流、标准输入流和标准的输出流、随机访问流、合并流、序列化流/反序列化流、属性集合类
一、操作基本数据类型的流
DataInputStream :数据输入流
DataOutputStream:数据输出流
可以操作一些基本数据类型
egg:
DataOutputStream dos = new DataOutputStream(new FileOutputStream("dos.txt"));
das.writeByte(10);
das.writeShort(100);
das.writeInt(1000);
das.writeLong(10000L);
das.writeFloat(12.34F);
das.writeDouble(12.56);
das.writeBoolean(true);
das.writeChar(‘A‘);
DataInputStream dis = new DataInputStream(new FileInputStream("das.txt"));
System.out.println(dis.readByte());
System.out.println(dis.readShort());
System.out.println(dis.readInt());
System.out.println(dis.readLong());
System.out.println(dis.readFloat());
System.out.println(dis.readDouble());
System.out.println(dis.readBoolean());
System.out.println(dis.readChar());
dos.close();
dis.close();
二、内存操作流
用来存储内存中的临时信息,程序结束,内存流消失
字节数组操作内存流:
ByteArrayInputStream
ByteArrayOutputStream
字符数组操作的内存流:
CharArrayReader
CharArrayWriter
字符串操作的内存流:
StringReader
StringWriter
egg:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos.write("hello".getBytes());
byte[] bys = baos.toByteArray();
ByteArrayInputStream bais = new ByteArrayInputStream(bys);
int by=0;
while((by=bais.read())!= -1){
System.out.print((char)by);
}
该流的close方法没有任何的操作,该流可以不用关闭
三、打印流(只能写数据,不能读数据)
1、字节打印流:PrintStream
构造方法:
printStream ps = System.out;
写数据:
println()带换行
print()
System.out.println();
2、字符打印流:PrintWriter
egg:
PrintWriter pw = new PrintWriter("pt.txt") ;
pw.write("hello");
pw.flush();
pw.close();
字符打印流的一个构造方法:可以进行自动刷新
public PrintWriter(Writer out, boolean autoFlush)第二个参数的值为:true则自动刷新
egg:
PrintWriter pw = new PrintWriter(new FileWriter("pw2.txt"), true);
pw.println("hello"); //使用print()不换行写入操作
pw.close();
四、标准输入流和标准的输出流
1、System类中的字段
public static final InputStream in 标准输入流
InputStream in = System.in; 字节输入流
public static final PrintStream out 标准输出流
PrintStream out = System.out;:字节打印流
2、直接使用标准输入流录入数据
BufferedReader br = new BufferedReader(new OutputStreamReader(System.in));
//使用装换流将字节流装换为字符流传给字符缓冲流
System.out.println("请输入一个字符串:");
String line = br.readLine(); //录入数据
System.out.println(line);
br.close();
3、直接使用标准输出流输出数据
BufferedWriter bw = new BufferedWriter(new InputStreamWriter(System.out));
bw.write("hello");
bw.newLine();
bw.close();
五、随机访问流 —— RandomAccessFile(并不是实际意义的流)
类的实例支持对随机访问文件的读取和写入,融合了InputStream和OutputStream两个类
1、构造方法:
public RandomAccessFile(String name,String mode) mode:常用的就 rw:既可以读,也可以写
egg:
RandomAccessFile raf = new RandomAccessFile("raf.txt","rw");
raf.writeByte(97);
raf.writeChar(‘A‘);
raf.writeUTF("中国");
System.out.println(raf.readByte());
System.out.println(raf.readChar());
System.out.println(raf.readUTF()); //读取一个字符串
raf.close();
2、特殊方法:
public long getFilePointer(),返回此文件的偏移量
//到此文件开头的偏移量(以字节为单位),在该位置发生下一个读取或写入操作。
六、合并流 —— SequenceInputStream(只能合并输入流)
1、构造方法:
public SequenceInputStream(InputStream s1,InputStream s2) 先读取 s1,然后读取 s2,将两个输入流合并
public SequenceInputStream(Enumeration<? extends InputStream> e)
//将多个输入流对象添加到Vector集合,通过v.elements()方法产生Enumeration对象传入合并流,使得多个输入流合并
2、将e:\\a.txt和b.txt复制到c.txt
七、序列化流和反序列化流
1、概述
序列化流:ObjectOutputStream
将对象按照流的形式封装成流数据:对象--->流数据
反序列化流:ObjectInputStream
将流数据又封装成了一个对象: 流数据-->对象
2、实现方式:
类通过实现java.io.Serializable接口以启用其序列化功能,未实现此接口的类将无法使其任何状态序列化或反序列化。
Serializable接口中没有字段,构造方法,成员方法,所有如果一个接口中没有任何的方法或者他的字段,将这种接口叫标记接口!
1)该类实现Serializable接口
2)private static final long serialVersionUID = 1L; //给当前类定义一个ID
重写toString()方法
不然的话,在读数据过程中如果中途对类有所修改,会报java.io.InvalidClassException异常
注意:如果在一个类中,有时候为了让成员变量不被序列化,加一个关键字:transient
3)创建序列化流和反序列化流对象,创建需要序列化类的对象;
4)oos.writeObject(obj)写
5)ois.readObject()读
6)关闭所有的流
八、属性集合类 —— Properties
1、概述:
Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载
这个类是Hashtbale的子类,而Hashtable是Map下面的双列集合,所以,Properties使用put()方法,添加元素
且,没有泛型
2、特殊方法
public Object setProperty(String key,String value):和添加相关的
public Set<String> stringPropertyNames():获取所有的键的集合
public String getProperty(String key):获取指定的属性集合中的键的值
public void load(Reader reader):将文本文件的数据读取集合中
public void store(Writer writer, String comments):将集合中的数据保存到文本文件中
//comments:属性列表的描述