标准输入输出流概述
OutputStreamWriter的概述和使用
之前我们是怎么做的?
BufferedReader br = new BufferedReader(new FileReader("dd"));
OutputStream os = System.out;
String line;
while((line = br.readLine())!= null) {
os.write(line.getBytes());
os.write("\r\n".getBytes());
}
os.close();
br.close();
运行结果
的确能出结果,不过很麻烦,因为出现了转换流
改进后的代码
BufferedReader br = new BufferedReader(new FileReader("dd"));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String line;
while((line = br.readLine())!=null) {
bw.write(line);
bw.newLine();
}
bw.close();
br.close();
运行结果一样,不过简便不少
InputStreamReader的概述和使用
之前我们的解决方式
//创建输入流对象
InputStream is = System.in;
//创建输出流对象
FileWriter fw = new FileWriter("b.txt");
//读写数据
byte[] b = new byte[1024];
int len;
while((len = is.read(b))!= -1) {
fw.write(new String(b, 0, len));
}
//释放资源
fw.close();
is.close();
也挺麻烦
改进后的代码
InputStream is = System.in;
InputStreamReader isr = new InputStreamReader(is);
FileWriter fw = new FileWriter("c.txt");
char[] c = new char[1024];
int len;
while((len = isr.read(c))!= -1) {
fw.write(c);
fw.flush();
}
打印流的概述
实例代码
//创建打印流对象
PrintWriter pw = new PrintWriter("f.txt");
//写出数据
pw.write("hello");
pw.write("my");
pw.write("girl");
//释放资源
pw.close();
运行结果
打印流特有功能
使用手动换行
代码
//创建打印流对象
PrintWriter pw = new PrintWriter("g.txt");
//写出数据
pw.println("hello");
pw.println("my");
pw.println("girl");
//释放资源
pw.close();
运行结果
使用打印流特有功能自动换行
PrintWriter pw = new PrintWriter(new FileWriter("h.txt"),true);
pw.println("hello");
pw.println("my");
pw.println("girl");
// pw.close();//把刷新关了 看能不能自动刷新
运行结果
一样能出来
使用打印流复制文本文件
//创建输入流对象
BufferedReader br = new BufferedReader(new FileReader("i.txt"));
//创建打印流对象
PrintWriter pw = new PrintWriter(new FileWriter("d:\\a\\i.txt"),true);
//读写(复制)
String line;
while((line = br.readLine())!= null) {
pw.println(line);
}
//释放资源
pw.close();
br.close();
运行结果
对象操作流的概述
使用对象操作流读写对象
需求
代码
首先写一个学生类
class Student10 implements Serializable {
String name;
int age;
public Student10(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student10 [name=" + name + ", age=" + age + "]";
}
}
接下来正体
//创建对象输出流的对象
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("j.txt"));
//创建学生对象
Student10 s1 = new Student10 ("杨狗蛋",22);
Student10 s2 = new Student10 ("龚翠华",20);
//写出学生对象
oos.writeObject(s1);
oos.writeObject(s2);
//释放资源
oos.close();
现在对象就写进去了
开始读出来
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("j.txt"));
Object obj = ois.readObject();
System.out.println(obj);
Object obj2 = ois.readObject();
System.out.println(obj2);
Object obj3 = ois.readObject();
System.out.println(obj3);
ois.close();
如上代码所示,不小心多输出了一个会怎么样?返回-1还是null?
嗯,报错了,出现了没有序列化的异常,
修改方法
首先要让
接下来装进try catch语句里面输出
try {
while(true) {
Object obj = ois.readObject();
System.out.println(obj);
}
}catch( EOFException e) {
System.out.println("读到文件末尾了");
}
运行结果
进一步解决对象输入流读取对象出现异常的问题
不能确定到底该输出多少个,那我们就让它变成一个,所以我们可以使用集合把他们装进去,再输出来集合
首先写入数据
//创建对象输出流对象
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("k.txt"));
//创建集合对象
ArrayList<Student11> list = new ArrayList<>();
//添加学生对象
list.add(new Student11("杨大物",22));
list.add(new Student11("龚龚",20));
//写出集合对象
oos.writeObject(list);
//释放资源
oos.close();
接下来输出数据
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("k.txt"));
Object obj = ois.readObject();
System.out.println(obj);
ois.close();
运行结果
但是这样会一口气把所有的挤在一起输出
那我们想要一个一个元素的慢慢输出怎么办?
修改方法
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("k.txt"));
Object obj = ois.readObject();
// System.out.println(obj);
//想要一个一个的输出对象怎么办
//向下转型 再遍历
ArrayList<Student11> list = (ArrayList<Student11>) obj;
for (Student11 student11 : list) {
System.out.println(student11);
}
ois.close();
运行结果
解决对实现序列化接口出现的黄色警告问题
给一个固定的序列号就好!
Properties的概述
//创建属性列表对象
Properties pp = new Properties();
//添加映射关系
pp.put("001", "大王");
pp.put("002", "虹吸");
pp.put("003", "上冲");
//遍历属性列表
Set<Object> keys = pp.keySet();
for (Object key : keys) {
Object value = pp.get(key);
System.out.println(key+"---"+value);
}
System.out.println("#################");
Set<Map.Entry<Object, Object>> entrys = pp.entrySet();
for (Map.Entry<Object, Object> entry : entrys) {
Object key = entry.getKey();
Object value = entry.getValue();
System.out.println(key+"------"+value);
运行结果
Properties和IO流结合的功能
String comments就是可以在前面加描述性的语句
编码表的概述
Java中字符串的编码