一.序列流
1.什么是序列流
序列流可以把多个字节输入流整合成一个,从序列流中读取数据时,将从被整合的第一个流开始读,读完一个之后继续读第二个,以此类推.
2.使用方式
FileInputStream fis1 = new FileInputStream("a.txt");
FileOutputStream fos = new FileOutputStream("c.txt");
int b1;
while((b1 = fis1.read()) != -1) {
fos.write(b1);
}
fis1.close();
FileInputStream fis2 = new FileInputStream("b.txt");
int b2;
while((b2 = fis2.read()) != -1) {
fos.write(b2);
}
fis2.close();//close写到了后面,还可以继续写,不清空
fos.close();
整合两个: SequenceInputStream(InputStream, InputStream)
FileInputStream fis1 = new FileInputStream("a.txt");
FileInputStream fis2 = new FileInputStream("b.txt");
FileOutputStream fos = new FileOutputStream("c.txt");
SequenceInputStream sis = new SequenceInputStream(fis1, fis2); //将两个输入流对象整合成一个
int b;
while((b = sis.read()) != -1) {
fos.write(b);
}
fos.close();
sis.close();
整合多个: SequenceInputStream(Enumeration)
FileInputStream fis1 = new FileInputStream("a.txt"); //创建输入流对象,关联a.txt
FileInputStream fis2 = new FileInputStream("b.txt");
FileInputStream fis3 = new FileInputStream("c.txt");
Vector<FileInputStream> v = new Vector<>(); //创建集合对象,泛型就是流对象
v.add(fis1); //添加每个流对象
v.add(fis2);
v.add(fis3);
Enumeration<FileInputStream> en = v.elements(); //获取流对象放入枚举
SequenceInputStream sis = new SequenceInputStream(en); //就多个流对象整合成一个输入流对象
FileOutputStream fos = new FileOutputStream("d.txt");
int b;
while((b = sis.read()) != -1) {
fos.write(b);
}
sis.close();
fos.close();
二.内存输出流*****
1.什么是内存输出流
该输出流可以向内存中写数据,把内存当作一个缓冲区,写出之后可以一次性获取出所有数据
2.使用方式
* 应用available()获取读取文件的大小,并根据文件的大小创建字节数组
* 与ByteArrayOutputStream的区别是什么
* 如果需要逐个写入,用的就是ByteArrayOutputStream(操作的是文本,溢出的可能性很小)
* 如果需要整个文件的拷贝,用的即使available()(但是也不建议,有可能会内存溢出)
创建对象: newByteArrayOutputStream()
写出数据:write(int), write(byte[])
获取数据:toByteArray()
FileInputStream fis = new FileInputStream("day23笔记.txt");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int b;
while((b = fis.read()) != -1) {
baos.write(b); //将其写进内存,所以不需要关流
}
//byte[] arr = baos.toByteArray();
//System.out.println(new String(arr));
System.out.println(baos);//自动调用ToString方法
fis.close(); //内存和硬盘的通道需要关闭
三.对象操作流
1.什么是对象操作流
该流可以将一个对象写出,或者读取一个对象到程序中.也就是执行了序列化和反序列化的操作.
2.使用方式
写出: new ObjectOutputStream(OutputStream), writeObject()
理解:
Person p1 = new Person("张三", 23);
Person p2 = new Person("李四", 24);
//FileOutputStream fos = new FileOutputStream("b.txt");
//字节流不能写出对象
//fos.write(p1);
//FileWriter fw = new FileWriter("b.txt");
//字符流不能写出对象
//fw.write(p1);
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("b.txt"));
oos.writeObject(p1);
oos.writeObject(p2);
oos.close();
集合:
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("b.txt"));
Person p1 = new Person("张三", 23);
Person p2 = new Person("李四", 24);
Person p3 = new Person("王五", 25);
ArrayList<Person> list = new ArrayList<>();
list.add(p1); //将对象存储在集合中
list.add(p2);
list.add(p3);
oos.writeObject(list); //将集合对象写出去
oos.close();
读取: new ObjectInputStream(InputStream), readObject()
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("b.txt"));
List<?> list = (List<Person>) ois.readObject(); //读取集合对象
for (Object object : list) {
System.out.println(object);
}
ois.close();
3.注意
要写出的对象必须实现Serializable接口才能被序列化
四.打印流*****
1.什么是打印流 (只操作数据目的) 而数据源有inputStream等操作
该流可以很方便的将对象的toString()结果输出,并且自动加上换行,而且可以使用自动刷出的模式
System.out就是一个PrintStream(字节流),其默认向控制台输出信息
2.使用方式
打印: print() , println()
自动刷出: PrintWriter(OutputStream out, boolean autoFlush, String encoding)
针对的是println()方法
五.标准输入输出流
1.什么是标准输入输出流
System.in是InputStream,标准输入流,默认可以从键盘输入读取字节数据(默认指向键盘,不用关闭)
System.out是PrintStream,标准输出流,默认可以向Console中输出字符和字节数据 (不用关闭,默认指向控制台,可以关,但是关了不能继续输出了)
PrintStream ps =System.out;
ps.println(97); //println方法打印97其实是将97转换为字符串打印,所以打印的是97而不是a
PrintStream ps2 = System.err; //标准的错误输出流
ps2.println(98);
2.修改标准输入输出流
修改输入流:System.setIn(InputStream)
修改输出流:System.setOut(PrintStream)
System.setIn(new FileInputStream("c.txt")); //改变标准输入流,到c.txt上读取数据
System.setOut(new PrintStream("d.txt")); //改变标准输出流,写到d.txt上
InputStream is = System.in; //获取标准输入流
PrintStream ps = System.out; //获取标准输出流
int b;
while((b =is.read()) != -1) { //is.read读取的是一个字节,半个中文
//ps.println(b);
ps.write(b); //将字节数据写到文件上
}
六.数据输入输出流
1.什么是数据输入输出流
DataInputStream,DataOutputStream可以按照基本数据类型大小读写数据
例如按Long大小写出一个数字,写出时该数据占8字节.读取的时候也可以按照Long类型读取,一次读取8个字节.
2.使用方式
DataInputStream(InputStream), readInt(),readLong()
DataInputStream dis=new DataInputStream(newFileInputStream("e.txt"));
int x =dis.readInt(); //读取一个int数,4个字节
DataOutputStream(OutputStream), writeInt(),writeLong()
DataOutputStream dos =new DataOutputStream(newFileOutputStream("e.txt"));
dos.writeInt(997); //写出一个int数,4个字节
七.Properties 是hashTable的子类是个双列集合
1.向内存中存入值,并通过键获取值setProperty(key,value)getProperty(key);
2.通过load方法,读取配置文件,propertyNames获取所有的key,返回Enumeration
3.根据键改值,并重新存入到配置文件setProperty(key,value),list(newPrintStream())
System.getProperties();获取系统属性,propertyNames将所有的键返回到枚举里,就可以迭代了
八.IO总结
1.字节流
FileInputStream,FileOutputStream,自定义数组拷贝文件
BufferedInputStream,BufferedOutputStream,内置缓冲区拷贝文件
2.字符流
FileReader,FileWriter
InputStreamReader,OutputStreamWriter
BufferedReader,BufferedWriter
会读写各种码表的文件中的文本数据
3.File
掌握文件夹递归
拷贝一个带内容的文件夹