需求:上传和下载等
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 接口。
该类的所有属性必须是可序列化的。如果有一个属性不是可序列话的,则该属性必须注明是短暂的
1998

被折叠的 条评论
为什么被折叠?



