需求:上传和下载等
I 是 input 输入
O 是 output 输出
电脑上的文件,在进行读取和存储的时候,都是以流的形式进行操作的
流的概念是比较抽象的
1.1缓冲的概念
看视频有点卡?暂停一下 这时候就是在缓冲
缓冲其实就是为了提高读取和存储的效率的
计算机通过cpu读取硬盘的数据,在java中可以加上缓冲的概念,每次读取具体的缓冲值。可以提高效率
1.2IO流
从磁盘(c盘)读取数据到内存(java代码)以内存java代码做参照物
1.txt===>java代码(输出出来) 输入流:
input : 场景使用 从磁盘的c:/aaa/1.txt文件中 读取数据到内存中(java代码)
字节输入流:
字符输入流:
从内存(java代码 String="狗蛋")写入数据到 磁盘(c盘 1.txt)
输出流:
output: 从内存(String str = "一个字符串数据") 写入到磁盘的c:/aaa/1.txt文件中
字节输出流:
字符输出流:
参照物是 内存(java代码)
1.2.1字节输入流
FileInputStream
可以将磁盘上面文件的内容读取到java代码中
package com.shuru; import java.io.*; public class Demo01 { public static void main(String[] args) throws IOException { //输入流 将磁盘上面的内容读取到java代码中 //创建一个File对象,把要读取的文件抽象话 File file = new File("d:/aaa/HelloWored.txt"); //创建字节输入流的核心类 FileInputStream fis = new FileInputStream(file); //添加一个缓冲buf方法 BufferedInputStream bis = new BufferedInputStream(fis); //添加缓冲数组 字节是byte byte[] buf = new byte[4*1024]; //读取并 创建一个停止条件 int length; while ((length = bis.read(buf)) != -1){ System.out.println(new String(buf , 0 , length)); } bis.close(); fis.close(); } }
1.2.2字节输出流
FileoutputStream
可以将java代码中的一个字符串写入到磁盘一个txt文件中
package com.shuru; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; public class Demo03 { public static void main(String[] args) throws IOException { //创建输出文件对象 File file = new File("d:/bbb/2.txt"); //创建输出流核心方法 FileOutputStream fos = new FileOutputStream(file); //创建缓冲方法 BufferedOutputStream bos = new BufferedOutputStream(fos); //声明一个字符串 String str = "wasdzxcf"; bos.write(str.getBytes()); bos.close(); fos.close(); } }
案例:
d:/aaa/1313k.wmv文件 复制到d:/bbb下面
package com.shuru; import java.io.*; public class Demo02 { public static void main(String[] args) throws IOException { //从磁盘输入到java代码 创建缓冲输入流对象 BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File("d:/aaa/1313k.wmv"))); //从java输出到磁盘 创建缓冲输出流对象 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File("d:/bbb/1313k.wmv"))); //准备一个缓冲数组 byte[] buf = new byte[1080]; int length; while ((length = bis.read(buf)) != -1 ){ bos.write(buf , 0 ,length); } bos.close(); bis.close(); } }
1.2.3字符输入流【非重点】
FileReader
将磁盘中的文件的内容读取到Java代码中
阅读字符文件的便利类
FileReader
是用于读取字符流。 要读取原始字节流(图片 音频 视频),请考虑使用FileInputStream
FileReader是从字节流到字符流的桥:它读取字节,并使用指定的charset
将其解码为字符 。
1.2.4字符输出流【非重点】
FileWriter
场景: Java中有一个字符串然后写入到磁盘的一个文件中
总结: 1.输入流和输出流的功能 输入流: 从磁盘到内存(Java代码) 输出流: 从内存(java 代码)到磁盘 2.输入流 分为两种: 字节输入流 FileInputSrteam 字符输入流 FileReader 核心方法: read
关于效率问题,他们两个有对应的缓冲流 FileInputSrteam 对应的BufferedInputStream FileReader 对应的 BufferedReader 3.输出流 分为两种: 字节输出流: FileOutputStream 字符输出流: FileWriter 核心的方法 write 关于效率问题,他们两个有对应的缓冲流 FileOutputStream对应的缓冲流 BufferedOutputStream FileWriter对应缓冲流 BufferedWriter 4.记住一句话 用字节流
1.3序列化和反序列化
新建类然后创建对象,对对象进行属性赋值 使对象真实存在,然后通过流将对象存入本地磁盘上面, 这就是序列化。
本地磁盘上面存有对象的数据,在通过流读取到java代码上变成对象, 这就是反序列化。
序列化和反序列化可以提高对象的 持久可操作性
从内存到磁盘 序列化 输出流 ObjectOutputStream write
package com.ol; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.io.Serializable; class Person implements Serializable { String name; int age; public Person(String name, int age) { this.name = name; this.age = age; } public void eat(){ System.out.println("正在吃饭"); } } public class XuLie01 { public static void main(String[] args) throws IOException { Person per = new Person("赖柳" , 18); FileOutputStream fos = new FileOutputStream("d:/aaa/5.txt"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(per); oos.close(); fos.close(); } }
从磁盘到内存 反序列化 输入流 ObjectInputStream read
package com.ol; import java.io.FileInputStream; import java.io.IOException; import java.io.ObjectInputStream; public class XuLie02 { public static void main(String[] args) throws IOException, ClassNotFoundException { //反序列化 FileInputStream fis = new FileInputStream("d:/aaa/5.txt"); ObjectInputStream ois = new ObjectInputStream(fis); //ois调用并写入并强转为Person对象并赋值给per2 Person per2 = (Person)ois.readObject(); System.out.println(per2.name); System.out.println(per2.age); } }
注意事项:
一个类的对象想要序列化成功,必须满足两个条件:
该类必须实现 java.io.Serializable 接口。
该类的所有属性必须是可序列化的。如果有一个属性不是可序列话的,则该属性必须注明是短暂的