20190801 Day 17
内容回顾:
java专题 IO流 Input and Output Stream(输入输出流)
1、File对象,java中专门用来操作文件的一个对象
构造函数
File(String path);
File(String parent,String child);
File(File file,String child);
File(Uri url);
常见方法:
createNewFile()
delet()
exists()
isFile()
isDirectory()
getAbsolutePath()
getAbsoluteSpace()
getName()
getFreeSpace()
getUsableSpace()
getTotalSpance()
length()
mkdir()
mkdirs()
list()
listFiles()
2、IO流
IO的分类(包含的关系,相互掺杂的)
|–流的方向 输入流和输出流 所有的字节输入流都是以InputStream开头的
所有的字节输出流都是以OutputStream开头的
|–流的类型 字节流和字符流 字节流对应(InputStream、OutputStream)
字符流对应(Reader、Writer)
|–流的作用 节点流和过滤流(装饰流) Filter
过滤流(FilterInputStream、FilterOutStream、FilterReader、FilterWriter)
过滤流的已知直接子类:BufferedInputStream
(查看文档有很多) DataInputStream
DateOutputStream
转换流:转换字节和字符,准确的说是 将字节流转换成字符串(InputStreamReader、OutputStreamWriter)
使用字节输入流,读取了一个磁盘上的文件
|–1.创建对应的流
|–2.创建一个字节数组
|–3.定义一个int类型的长度
|–4.循环读取read(数组)
|–5.关闭流。要放在finally中(最重要)
使用字节流,读入读出数据
使用过滤流,读取数据
|–如果过滤流没有关闭,会导致数读不全
|–装饰者的设计模式
设计模式:所有设计模式的本质:解耦合
编程中有个OCP原则(open closed principle):对于增加开放、对于修改关闭
课堂练习:把数字存储到磁盘上 123456 保存数据类型用out
读出数据类型用的是in 要站在内存的角度
用数据流(过滤流(FilterxxxxStream)的子类)
如果需要保存数据(数值)类型,建议使用数据流(DataOutputStream)完成
读入数据:
public static void main(String[] args) {
DataOutputStream dis = null;
try {
dis = new DataOutputStream(new FileOutputStream(“e:\a.dat”));
dis.writeInt(123456);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (dis != null) {
try {
dis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
读入、读出数据:
public static void main(String[] args) {
DataOutputStream dos = null;
DataInputStream dis = null;
try {
dos = new DataOutputStream(new FileOutputStream("d:/a.txt"));
dos.writeInt(123);
dos.writeInt(1234);
dos.writeInt(12345);
dos.writeInt(123456);
try {
dis = new DataInputStream(new FileInputStream("d:/a.txt"));
System.out.println(dis.readInt());
System.out.println(dis.readInt());
System.out.println(dis.readInt());
System.out.println(dis.readInt());
} catch (EOFException e) {
System.out.println("数据输入完成");
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
if(dis != null){
try {
dis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(dos != null){
try {
dos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
下午:
字节流→在数据流动的过程中,数据是以字节的形式流动的
字符流→在数据传输过程中,数据以字符的形式流动(主要是文本的传输)
|–字符输入流:Reader类
|–字符输出流:Writer类
注意:
使用过滤流(包装流、缓冲流):
包装字节流时,建议使用BufferedInputStream、BufferedOutputStream
包装字符流时,建议字符输入流使用BufferedReader,建议字符输出流使用PrintWriter
字符流输入输出:
public void testCharStreamOutput02() {
BufferedReader br = null;
PrintWriter out = null;
try {
br = new BufferedReader(new FileReader(“E:\\workspace\\day16\\src\\com\\openlab\\io\\TestFile.java”));
// 节点流
out = new PrintWriter(“e:\test.java”);
String str = null;
while((str = br.readLine()) != null) {
out.println(str + “\n”); //不写的话 他出来的都是一行代码,这个写了就可以换行
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (out != null) {
out.close();
}
}
}
}
//标准流是字节流
//System.in 标准输入流
//System.out 标准输出流
转换流:
转换流的本质是字符流,主要功能就是将字节流转换成字符流
在Java中,多层直接使用break关键字无法退出
但是在开发中,我们有时需要退出多层循环,这个时候我们需要使用lable
public void testChangeStream01() throws Exception {
// 标准流是字节流
// System.in 标准输入流
// System.out 标准输出流
InputStream is = System.in;
// 转换流
InputStreamReader isr = new InputStreamReader(is);
label:while (true) {
System.out.println(“请输入您要输入的内容:”);
char[] buf = new char[1024];
int len = 0;
while((len = isr.read(buf))> -1) {
String str = new String(buf, 0, len);
if (str.trim().equals(“exit”)) {
// break;
// 直接退出程序
// System.exit(0);
// 使用label退出多层循环
break label;
}
String rstr = str.replace(“吗?”, “”);
System.out.println(rstr);
}
}
}
20190802 Day 18
内容回顾:
IO流
|–输入流 字节输入流都要实现InputStream抽象类、字符输入流都要实现Reader抽象类
|–输出流 …OutputStream抽象类,字符输出流都要实现Writer抽象类
|--字节流 InputStream OutputStream 为父类的
|--字符流 Reader Writer为父类的
|--节点流
|--过滤流
|--data流 数据流是过滤流
|--转换流 实现字节转换为字符流
|--对象流
|--对象输入流(序列化 | 串行化),将我们java的对象存储在磁盘上
|--对象输出流(反序列化),将存储在磁盘上的对象读取到内存中
demo:
1、将String存储到磁盘上
注意:在java中,对象默认是没办法序列化的,如果需要序列化对象必须实现一个接口Serializable的接口
注意:这个接口是空接口,是jdk1.1定义的
public interface Serializable{
如果你要序列化一个对象,必须实现Serializable
自定义类型的序列化和反序列化
必须要生成一个空接口serializable
然后生成序列号,再正常定义一个类
注意:如果java类的某些属性使用tranistan关键字修饰,则表示这些属于瞬时属性,这些属性无法参与序列化