1.LineNumberReader:
public int getLineNumber():获取行号
public void setLineNumber(int lineNumber):设置起始行号
String readLine():读取一行
2.操作基本数据类型的流
DataInputStream:读数据
DataOutputStream:写数据
作用:可以操作基本类型的流对象,其读写顺序必须一致,否则数据有问题。
public static void main(String[] args) throws IOException {
//DataInputStream:读数据,创建对象
DataInputStream dis = new DataInputStream(new FileInputStream("dos.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.readChar());
System.out.println(dis.readFloat());
System.out.println(dis.readDouble());
System.out.println(dis.readBoolean());
//关流
dis.close();
//public DataOutputStream(OutputStream out)
DataOutputStream dos = new DataOutputStream(new FileOutputStream("dos.txt"));
//给流关联的文件中写入基本类型的数据
dos.writeByte(20);
dos.writeShort(200);
dos.writeInt(2000);
dos.writeLong(20000L);
dos.writeChar(97);
dos.writeFloat(12.34F);
dos.writeDouble(23.34);
dos.writeBoolean(true);
//关流
dos.close();
}
3.内存操作流:
作用:解决临时数据存储的问题。将数据写到流中保存在内存,并且读取
ByteArrayInputStream 写入
ByteArrayOutputStream 输出
byte[] toByteArray() 将之前写入内存的流转换成字节数组
操作字符数组:
CharArrayReader 输出
CharArrayWrite 写入
操作字符串
StringReader 输出
StringWriter 写入
操作字节数组
ByteArrayInputStream 写入
ByteArrayOutputStream 输出
4.打印流:
字节打印流 PrintStream
字符打印流 PrintWriter
特点:
A.只能操作目的地,不能操作数据源
B.可以操作任意类型的数据
C.如果启动了自动刷新,能够自动刷新
D.可以操作文件的流
操作任意类型的数据的方法:
print()
println():如果启动了自动刷新,能够实现刷新,而且还实现了自动换行。
PrintWriter(OutputStream out, boolean autoFlush) 字节流
PrintWriter(Writer out, boolean autoFlush) 字符流
注:如果启用了自动刷新,则只有在调用 println、printf 或 format之中的一个方法时才可能完成此操作
public static void main(String[] args) throws IOException {
// 利用字符打印流复制java文件(BufferedReader+PrintWriter)
//封装数据源和目的地
//数据源
BufferedReader br = new BufferedReader(new FileReader("a.java"));
//目的地
PrintWriter pw = new PrintWriter(new FileWriter("copy.java"),true);
//读一行写一行
String line;
while ((line=br.readLine())!=null) {
pw.println(line);
}
//关流
pw.close();
br.close();
}
5.标准输入输出流
System类下的两个构造方法:
标准输入流:
public static final InputStream in
标准输出流:
public static final PrintStream out
public static void main(String[] args) throws IOException {
//用IO流实现键盘录入,一次读取一行数据
//将键盘录入数据system.in关联到bufferedreader上
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//一次读取一行数据
System.out.println("请输入你的姓名");
String name = br.readLine();
System.out.println("请输入你的年龄");
String age = br.readLine();
System.out.println(name+":"+age);
}
6.合并流:
定义:SequenceInputStream类可以将多个输入流串流在一起,合并为一个输入流,因此,该流也被称为合并流。
构造:
SequenceInputStream(InputStream s1, InputStream s2) :将s1和s2合并成一个输入流,先读取 s1后读取s2
public static void main(String[] args) throws IOException {
//创建合并流对象
//将s1和s2合并成一个输入流,先读取s1后读取s2
SequenceInputStream sis = new SequenceInputStream(new FileInputStream("PrintWriterDemo.java"), new FileInputStream("SystemIn2.java"));
//封装目的地
FileOutputStream fos = new FileOutputStream("copy2.java");
//读写一个字节数组
byte[] buf = new byte[1024];
int len;
while ((len=sis.read(buf))!=-1) {
fos.write(buf, 0, len);
}
//关流
fos.close();
sis.close();
}
8. 对象的序列化和反序列化
序列化流:把对象按照流一样的方式写到文件或者在网络中传输。
ObjectOutputStream:序列化流
writeObject(Object obj) 将指定的对象写入 ObjectOutputStream.
反序列化流:把文件或者网络中的流对象数据还原对象。
ObjectInputStream:反序列化流
Object readObject() 从 ObjectInputStream 读取对象.
注意:如果一个类不是实现Serializable接口无法把实例化,会报异常java.io.NotSerializableException
类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。
让对象所属类的实现序列化接口可以实现类的实例化。
public static void main(String[] args) throws Exception {
//创建序列化流对象
//public ObjectOutputStream(OutputStream out)
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("oos.txt"));
//创建一个学生对象,将学生对象写入文件中
Studnet s = new Studnet("刘", 50);
oos.writeObject(s);
// java.io.NotSerializableException
//类通过实现 java.io.Serializable 接口以启用其序列化功能
//关流
oos.close();
//创建反序列化流对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("oos.txt"));
//读取文件中存储的对象,以实现反序列化
//readObject()
Object object = ois.readObject();
System.out.println(object);
//关流
ois.close();
}
9. Properties
介绍:Properties 类表示了一个持久的属性集。属性列表中每个键及其对应值都是一个字符串。它实现map接口,其本质是一个map集合
特点:Properties 可保存在流中或从流中加载。
特有功能:
A.添加元素
publicObject setProperty(String key,String value)
B.获取元素
publicString getProperty(String key)
publicSet
可以和IO流进行结合使用:
把文件中的数据加载到集合中。注意:文件中的数据必须是键值对象形式的。
publicvoid load(InputStream inStream)
publicvoid load(Reader reader)
把集合中的数据存储到文本文件中,并且是按照键值对形式存储的。
public void store(OutputStream out,Stringcomments)
publicvoid store(Writer writer,String comments)
public static void main(String[] args) throws IOException {
/*
我有一个文本文件,我知道数据是键值对形式的,但是不知道内容是什么。
请写一个程序判断是否有“lisi”这样的键存在,如果有就改变其值为”100”
zhangsan=3
lisi=4
wangwu=5
1.创建集合对象
2.将文件中的键值对加载到集合中
3.获取多有的键的集合,遍历,判断
4.如果存在lisi,的话,给集合中重新存储键值对lisi=100
5.将集合中的数据存储到文件中
*/
//1.创建集合对象
Properties prop = new Properties();
// 2.将文件中的键值对加载到集合中
prop.load(new FileReader("prop.txt"));
//3.获取多有的键的集合,遍历,判断
Set
// 4.如果存在lisi,的话,给集合中重新存储键值对lisi=100
for (String key : keys) {
if ("lisi".equals(key)) {
prop.setProperty(key, "100");
}
}
//5.将集合中的数据存储到文件中
prop.store(new FileWriter("prop3.txt"), null);
}