new File(String pathname) //根据路径构建一个File对象
new File(File parent,String child)/根据父目录文件+子路径构建
new File(String parent,String child) //根据父目录+子路径构建
public class fileCreat {
public static void main(String[] args) {
}
//方式1:
@Test
public void create01(){
String filePath1="D:\\new1.txt";
File file = new File(filePath1);
try {
//执行了createNewfile()才能真正创建文件
file.createNewFile();
} catch (IOException e) {
//throw new RuntimeException(e);
e.printStackTrace();
}
System.out.println("成功");
}
//方式二。
@Test
public void create02(){
//父路径是file对象
File parentfile = new File("D:\\");
String fileName="new02.txt";
File file = new File(parentfile, fileName);
try {
boolean newFile = file.createNewFile();
} catch (IOException e) {
throw new RuntimeException(e);
}
System.out.println("成功");
}
//方式三。 new File(String parent,String child)
@Test
public void create03(){
//父路径是file对象
String parentPath = "D:\\";
// String parentPath = "D:/";也可以
String fileName="new03.txt";
File file = new File(parentPath, fileName);
try {
boolean newFile = file.createNewFile();
} catch (IOException e) {
throw new RuntimeException(e);
}
System.out.println("成功");
}
}
file.getAbsoluteFile());得到文件的绝对路径
file.getParent());得到文件的父级目录
file.length());获取文件大小(字节)
file.exists());判断文件是否存在boolean
file.isFile());是不是文件boolean
file.isDirectory());//是不是目录boolean
public class mation_ {
public static void main(String[] args) {
}
public void info(){
File file = new File("D://news1.txt");
System.out.println(file.getName());
System.out.println("绝对路径"+file.getAbsoluteFile());
System.out.println("父级目录"+file.getParent());
System.out.println("文件大小(字节)"+file.length());
System.out.println("文件是否存在"+file.exists());//True
System.out.println("是不是文件"+file.isFile());//True
System.out.println("是不是目录"+file.isDirectory());//Flase
}
}
file.delete();文件或目录删除
file.mkdir();单级目录的创建
file.mkdirs():多级目录的创建
目录也是文件类型的
public class directory_ {
public static void main(String[] args) {
}
@Test
public void m1(){
String filePath="D://new1.txt";
File file = new File(filePath);
if(file.exists()){
file.delete();
}else {
System.out.println("文件不存在");
}
}
@Test
public void m2(){
String filePath="D://demo";
File file = new File(filePath);
if(file.exists()){
System.out.println("存在");
}else {
if (file.mkdir()){
System.out.println("创建成功");
}else {
System.out.println("创建失败");
}
}
}
@Test
public void m3(){
String filePath="D://demo//a//b";
File file = new File(filePath);
if(file.exists()){
System.out.println("存在");
}else {
if (file.mkdirs()){
System.out.println("创建成功");
}else {
System.out.println("创建失败");
}
}
}
}
按操作数据单位不同分为: 字节流(8 bit),字符流(按字符)
按数据流的流向不同分为: 输入流,输出流
按流的角色的不同分为:节点流,处理流/包装流
都是从下面四个抽象基类派生出来的。
抽象基类 | 字节流 | 字符流 |
输入流 | InputStream | Reader |
输出流 | outputStream | Writer |
节点流可以从一个特定的数据源读写数据,如FileReader、FileWriter。只能处理一种数据。
处理流(也叫包装流)是“连接”在已存在的流(节点流或处理流》之上,为程序提供更为强大的读写功能,也更加灵活,如BufferedReader、BufferedWriter 。可以处理Reader,Wirter的子类类型的数据。
蓝色是节点流,紫色是包装流。包装流可以处理上面的节点流数据。只需传入InputStream或者InputStream子类,就能处理节点流数据。包装类的构造器里也是要传入节点流参数
节点流只能处理对应的数据 。
分类 | 字节输入流 | 字节输出流 | 字符输入流 | 字符输出流 |
抽象基类 | InPutStream | OutPutStream | Reader | Writer |
访问文件 | FileInputStream | FileOutputStream | FileReader | FileWriter |
访问数组 |
ByteArrayInPutStream | ByteOutPutStream | charArrayReader | charArrayWriter |
访问管道 | PipedInPutStream | PipedOutPutStream | PipedReader | PipedWriter |
访问字符串 | StingReader | StingWriter | ||
缓冲流 | BufferedInPutStream | BufferedOutPutStream | BufferedReader | BufferedWriter |
转换流 | InPutStreamReader | OutPutStreamWriter | ||
对象流 | ObjectInPutStream | ObjectOutPutStream | ||
抽象基类 | FilterInPutStream | FilterOutPutStream | FilterReader | FilterWriter |
打印流 | PrintStream | PrintWriter | ||
推回输入流 | PushbackInPutStream | PushbackReader | ||
特殊流 | DataInPutStream | DataOutPutStream |
public class FileInputStream01 {
public static void main(String[] args) {
}
//单个字节读取
@Test
public void readFile01() throws IOException {
String filePath="D:\\hello.txt";
int readDate=0;
FileInputStream fileInputStream =null;
try {
//创建FileInputStream对象,用于读取文件
fileInputStream = new FileInputStream(filePath);
//从该输入流读取一个字节的数据,如果没有输入可用,此方法将阻止
//如果返回-1,表示读取完毕
while ((readDate = fileInputStream.read()) !=-1){
System.out.print((char) readDate);
//转成char显示,读取的字符是int类型的
//读完之后要关闭,释放文件连接
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭文件,释放资源
fileInputStream.close();
}
}
//使用read(byte[]b)读取文件,读取
@Test
public void readFile02() throws IOException {
String filePath = "D:\\hello.txt";
int readDate = 0;
//字节数组
byte[] buf=new byte[8];//一次读取8个字节
int readLen =0;
FileInputStream fileInputStream = null;
try {
//创建FileInputStream对象,用于读取文件
fileInputStream = new FileInputStream(filePath);
//从该输入流读取一个字节的数据,如果没有输入可用,此方法将阻止
//如果返回-1,表示读取完毕
//如果读取正常,返回实际读取的字节数
while ((readLen = fileInputStream.read(buf)) != -1) {
System.out.print(new String(buf ,0,readLen));
//转成char显示,读取的字符是int类型的
//读完之后要关闭,释放文件连接
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭文件,释放资源
fileInputStream.close();
}
}
}
public class FileOutStream01 {
public static void main(String[] args) {
}
//如果文件不存在,则创建文件
@Test
public void writeFile(){
//创建 FileOutputStream 对象
String filePath="D://a.txt";
FileOutputStream fileOutputStream=null;
try {
//得到FileOutputStream 对象
//1.创建方式是覆盖原来的内容
fileOutputStream=new FileOutputStream(filePath);
//2.new FileOutputStream(filePath,true);是追加到文件末尾
//写入一个字节
//fileOutputStream.write('q');
//写入字符串
String str="helo";
fileOutputStream.write(str.getBytes());//getBytes把字符串转为字节数组
//写入byte数组的内容,到文件,从0开始到str.length
fileOutputStream.write(str.getBytes(),0,str.length());
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fileOutputStream.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
创建:
1) new FileReader(File/String)
2)read:每次读取单个字符,返回该字符,如果到文件未尾返回-1
3)read(char【】): 批量读取多个字符到数组,返回读取到的字符数,如果到文件末尾返回-1表示读取完毕
相关API:
1)new String(char[]):将char[]转换成String
2)new String(char[],offlen):将charl的指定部分转换成String
public class fileReader {
public static void main(String[] args) {
}
@Test
public void readFile01(){
String filePath = "D://story.txt";
FileReader fileReader=null;
int data =0;
//1.创建 FileReader 对象
try {
fileReader = new FileReader(filePath);
//2.读取
while ((data = fileReader.read()) != -1){//read()方法返回的是int类型的
System.out.println((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//字符数组读取文件
@Test
public void readFile02(){
String filePath = "D://story.txt";
FileReader fileReader=null;
int readLen =0;
char []buf = new char[8];
//1.创建 FileReader 对象
try {
fileReader = new FileReader(filePath);
//2.读取
while ((readLen = fileReader.read(buf)) != -1){//read()方法返回的是int类型的,读取到了几个字符
System.out.println(new String(buf,0,readLen));//把字符转为字符串
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
创建:
1) new FileWriter(File/String):相当于流的指针在首端
2) new FileWriter(Fiie/String,true):追加模式,相当于流的指针在尾端
写入:
3) write(int):写入单个字符
4)write(char【】):写入指定数组
5) write(charll,off,,en):写入指定数组的指定部分
6) write (string) : 写入整个字符串
7)write(string,off,len):写入字符串的指定部分
相关API:String类: toCharArray:将String转换成char【】
注意:
FileWriter使用后,必须要关闭(close)或刷新(flush),否则写入不到指定的文件。
public class fileEriter {
public static void main(String[] args) {
}
@Test
public void fileWriter(){
FileWriter fileWriter=null;
String filePath="D:\\hello.txt";
char[] chars={'a','b','c'};
try {
fileWriter = new FileWriter(filePath);
// 1) write(int):写入单个字符
fileWriter.write('H');
// 2) write(char[]):写入指定数组
fileWriter.write(chars);
// 3) write(char[],off,Len):写入指定数组的指定部分
fileWriter.write("你好啊啊啊".toCharArray(),0,3);
// 4) write (string):写入整个字符串
fileWriter.write("你好比较");
// 5) write(string,off,Len):写入字符串的指定部分
fileWriter.write("上海阿迪斯",0,2);//上海
}catch (IOException e){
e.printStackTrace();
}
}
}
class Test_{
public static void main(String[] args) {
//读取文件
BufferedReader01 bufferedReader01 = new BufferedReader01(new FileReader01());
bufferedReader01.readFiles(10);
//读取字符串
BufferedReader01 bufferedReader011 = new BufferedReader01(new StringRader01());
bufferedReader011.readString(5);
}
}
public abstract class reader01 {//抽象类,
public void readerFile(){}
public void readerString(){}
}
class FileReader01 extends reader01{//节点流
public void readerFile(){
System.out.println("读取文件");
}
}
class StringRader01 extends reader01{//节点流
public void readerString(){
System.out.println("读取字符串");
}
}
class BufferedReader01 extends reader01{//这个就是包装流
private reader01 r;//属性是reader01
public BufferedReader01(reader01 r) {
this.r = r;
}
//
public void readFiles(int num){
for (int i = 0; i < num; i++) {
r.readerFile();
}
}
public void readString(int num){
for (int i = 0; i < num; i++) {
r.readerString();
}
}
}
只需传入Reader或者Reader类,就能处理节点流数据。构造器里传入节点流参数。
BufferedReader 和 BufferedWriter 属于字符流,关闭时处理流,只需要关闭外层流即可。
public class bufferReader {
public static void main(String[] args) throws IOException {
String fP="D://buffer.java";
BufferedReader bufferedReader = new BufferedReader(new FileReader(fP));
String line;//按行读取
//返回null,表示读取完毕
while ((line=bufferedReader.readLine()) != null){
System.out.println(line);
}
//只需关闭BufferReader,底层会自动关闭节点流FileReader
bufferedReader.close();
}
}
只需传入Writer或者Writer子类,就能处理节点流数据。构造器里传入节点流参数。
public class BufferWriter01 {
public static void main(String[] args) throws IOException {
String filePath = "D:\\hello.txt";
//创建BufferWriter
//true表示以覆盖的方式写入
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath,true));
bufferedWriter.write("你好");
bufferedWriter.write("你好");
bufferedWriter.newLine();//换行符
bufferedWriter.write("你好");
bufferedWriter.write("你好");
//关闭外层流即可
bufferedWriter.close();
}
}
只需传入InputStream或者InputStream子类,就能处理节点流数据。构造器里传入节点流参数。
只需传入OutputStream或者OutputStream子类,就能处理节点流数据。构造器里传入节点流参数。
//演示 bufferedOutputStream 和 bufferedInputStream 使用拷贝文件
public class bufferedOutputStream {
public static void main(String[] args) {
String srcp="D:\\xiao.jpg";
String destp="D:\\demo\\qhx.jpg";
//创建 BufferedOutputStream 和 BufferedIntputStream
BufferedInputStream bi=null;
BufferedOutputStream bo=null;
try {
bi = new BufferedInputStream(new FileInputStream(srcp));
bo = new BufferedOutputStream(new FileOutputStream(destp));
//循环的读取文件,并写入到 destFiTePath
byte[] buff = new byte[1024];
int readLen = 0;
//当返回-1时,就表示文件读取完毕
while ((readLen = bi.read(buff)) != -1){
bo.write(buff,0,readLen);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭外层流
try {
if (bi != null){
bi.close();
}
if (bo != null){
bo.close();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
将 Dog dog = new Dog(“小黄”,3) 这个 dog对象 保存到 文件中,并且能够从文件恢复.
上面的要求,就是 能够将 基本数据类型 或者 对象 进行 序列化 和 反列化,这就需要对象流。序列化:保存值和数据类型
反序列化:恢复值和数据类型
某个类要实现序列化可以通过下面两个接口:
1.Serializable // 这是一个标记接口,里面没有任何方法,推荐使用这个
2.Externalizable //
序列化
使用ObjectOutputStream 序列化 基本数据类型和 一个 Dog对象(name, age),并
保存到 data.dat 文件中
public class objectOutPutStream01 {
public static void main(String[] args) throws IOException {
//序列化后,保存的文件格式,不是存文本,而是按照他的格式来保存
String fp="D:\\data.dat";
ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream(fp));
oo.writeInt(100);// int -> Integer (实现了 Serializable)
oo.writeBoolean(true);// boolean -> Boolean (实现了 Serializable)
oo.writeChar('a');// char -> Character (实现了 Serializable)
oo.writeDouble(9.5);// double -> Double (实现了 Serializable)
oo.writeUTF("海贼王");//String
//保存一个dog对象
oo.writeObject(new Dog("旺财",10));
oo.close();
System.out.println("数据保存完毕");
}
}
class Dog implements Serializable {//把dog类序列化
public String name;
private int age;
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
反序列化:把dog放到可以引入的位置,然后引入。
import com.qhx.Dog;//引入dog类
public class a {
public static void main(String[] args) throws IOException, ClassNotFoundException {
// 1.创建流对象
String fp="D:\\data.dat";
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fp));
//2.读取,注意顺序要和保存数据(序列化)的顺序一样
System.out.println(ois.readInt());
System.out.println(ois.readBoolean());
System.out.println(ois.readChar());
System.out.println(ois.readDouble());
System.out.println(ois.readUTF());
//这里会抛异常,抛出去就行了
//要把Dog类也拿到到这里
Object dog=ois.readObject();//底层Object -> Dog
//这里得到的dog编译类型是object
System.out.println("运行类型=" + dog.getClass());
//如果要使用dog里的方法,要向下转型
Dog d=(Dog)dog;
d.getAge();
//3.关闭
ois.close();
System.out.println("以反序列化的方式读取(恢复)ok~");
}
}
细节:
1.序列化和反序列的读写顺序要一致
2.要求实现序列化或反序列的对象,需要实现Serializable
3.序列化对象时,默认将里面所有属性都进行序列化,但除了static或transient修饰的成员
4.序列化对象时,要求里面属性的类型也需要实现序列化接口
5.序列化具备可继承性,也就是如果某类已经实现了序列化,则它的所有子类也已经默认实
现了序列化
读取一个文件(字符)时,如果是gdk编码读取成功,改成utf-8可能会读取到乱码。
InputStreamReader(lnputStream, Charset)
转换流:传入一个字节流,和编码方式,把字节流转为字符流
转换流介绍:
1.InputStreamReader:Reader的子类,可以将InputStream(字节流)包装成Reader(字符流)
2.OutputStreamWriter:Writer的子类,实现将OutputStream(字节流)包装成Writer(字符流)
3.当处理纯文本数据时,如果使用字符流效率更高,并且可以有效解决中文问题,所以建议将字节流转换成字符流。
4.可以在使用时指定编码格式(比如 utf-8,gbk,gb2312,ISO8859-1 等)
//使用InputStreamReader 转换流解决中文乱码问题
//将字节流 FileInputStream 转成字符流
public class inputStreamReader {
public static void main(String[] args) throws IOException {
String fp="D://a.txt";
//1.创建转换流,传入字节流,指定编码格式
InputStreamReader gdk = new InputStreamReader(new FileInputStream(fp), "gbk");
//2.创建缓冲流,传入转换流
BufferedReader b=new BufferedReader(gdk);
//第一二步可以合并为一句
String s=b.readLine();//一行一行的读取
System.out.println("读取内容"+s);
//关闭
b.close();
}
}
//读取文件
public class outputstreamWriter {
public static void main(String[] args) throws IOException {
//1.转换流(字节流,编码)
OutputStreamWriter o = new OutputStreamWriter(new FileOutputStream("D:\\a.txt"), "UTF-8");
//2.缓冲流(转换流)
BufferedWriter b = new BufferedWriter(o);
//3.写入
b.write("HELLO,你好11啊啊啊啊啊");
//4.关闭外层流
b.close();
}
}
打印流只有输入流,没有输出流
public class printStream {
public static void main(String[] args) throws FileNotFoundException {
PrintStream out = System.out;
//out属性是System类的一个PrintStream属性
out.print("john");
//可以使用我们写入方法,写入到标准输出 即显示器,效果一样
//out.write("john".getBytes());
out.close();
//重定向输出设备,到文件
System.setOut(new PrintStream("D:\\t1.txt"));
//写入内容
System.out.println("nihao");//输出到t1.txt中
}
}
public class printWriter {
public static void main(String[] args) throws IOException {
//PrintWriter printWriter = new PrintWriter(System.out);
//传入OutPutStream的子类,默认打印在控制台
PrintWriter printWriter=new PrintWriter(new FileWriter("D:\\a.txt"));
printWriter.println("hi,北京你好");
//关闭后才能写入进去
printWriter.close();
}
}
用途:配置文件
常见方法:
1.load(): 加载配置文件的键值对到Properties对象
2.list():将数据显示到指定设备
3.getProperty(key),get():根据键获取值,获取到的值是object类型的
4.setProperty(key,value):设置键值对到Properties对象
5.store:将Properties中的键值对存储到配置文件,在idea 中,保存信息到配置文件,如果
含有中文,会存储为unicode码
public class properties01 {
public static void main(String[] args) throws IOException {
//使用 properties 类来读取mysql.properties 文件
//1.创建Properties 对象
Properties properties = new Properties();
//2.加载指定配置文件
properties.load(new FileReader("src\\mysql.properties"));
//3.把k-v显示控制台
properties.list(System.out);
//4.根据k获取对应的值
String a=properties.getProperty("name");
System.out.println(a);
}
}
使用 properties 类添加k-v到新文件 mysql2.properties 中
public class properties02 {
public static void main(String[] args) throws IOException {
//把配置文件的内容,存放到另外一个配置文件
//1.创建 properties 对象
Properties properties = new Properties();
//2.设置键值对,(键值对保存在properties对象中)
properties.setProperty("charset","utf-8");//
properties.setProperty("user","汤姆");
properties.setProperty("password","1234");
//3.现在把键值对放到 mysql2 配置文件中
properties.store(new FileOutputStream("src\\mysql2.properties"),null);
//null的位置是对配置文件进行说明,会出现在mysql2的第一行(被注释)
System.out.println("放置成功");
//4.修改,也是通过setProperties方法
properties.setProperty("password","123");//修改
}
}
把一个文件复制到另外一个地方
public class fileCopy {
public static void main(String[] args) {
//把C:\Users\qhx\Pictures\2019922141926_25145.jpg拷贝到D:\\
//思路分析
//1.创建文件的输入流 ,将文件读入到程序
//2.创建文件的输出流,
String filePath ="D:\\hello.txt";
String destPath = "D:\\";
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
try {
fileInputStream=new FileInputStream(filePath);
fileOutputStream=new FileOutputStream(destPath);
//定义字节数组
byte[] buf=new byte[1024];
int readLen =0;
while ((readLen =fileInputStream.read(buf)) != -1){
//读取到就写出去
fileOutputStream.write(buf,0,readLen);//一定要要用这个方法
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (fileInputStream != null){
fileInputStream.close();
}
if (fileOutputStream != null){
fileOutputStream.close();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
使用FileReader从story.txt读取内容
利用BufferedReader和BufferedWriter拷贝文件
public class BufferedCopy_ {
public static void main(String[] args) {
String src="D://hello.txt";
String dest="D://aa.txt";//目标文件
BufferedReader bufferedReader=null;
BufferedWriter bufferedWriter=null;
String line;
try {
bufferedReader = new BufferedReader(new FileReader(src));
bufferedWriter = new BufferedWriter(new FileWriter(dest));
while ((line=bufferedReader.readLine()) !=null){//读取一行的内容
//每读取一行就写入
bufferedWriter.write(line);
//换行
bufferedWriter.newLine();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
//关闭流
if (bufferedReader !=null){
bufferedReader.close();
}
if(bufferedWriter != null){
bufferedWriter.close();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
(1).在判断D盘下是否有文件夹mytemp ,如果没有就创建mytemp
(2).在D:\\mytemp 目录下,创建文件 hello.txt
(3).如果hello.txt 已经存在,提示该文件已经存在,就不要再重复创建了
public class e1 {
public static void main(String[] args) throws IOException {
String s="D:\\mytemp";
File file = new File(s);
if(!(file.exists())){
System.out.println("文件夹不存在,创建");
file.mkdir();
}else {
System.out.println("文件夹存在");
}
File file1 = new File(file, "hello.txt");
if(!(file1.exists())){
if (file1.createNewFile()){
System.out.println("hello.txt创建成功");
//写入
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file1));
bufferedWriter.write("hellooooo");
bufferedWriter.close();
}else {
System.out.println("hello创建失败");
}
}else {
System.out.println("hello.txt存在");
}
}
}
使用BufferedReader读取一个文本文件,为每行加上行号再连同内容一并输出到屏幕上。
public class e2 {
public static void main(String[] args) throws IOException {
String s="D:\\hello.txt";
BufferedReader bufferedReader=null;
String line="";
int num=0;
try {
//转换流
// FilelnputStream -> InputStreamReader[可以指定字符集]
// ->BufferedReadered
InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(s), "utf-8");
bufferedReader=new BufferedReader(inputStreamReader);
while ((line=bufferedReader.readLine()) != null){
System.out.println(++num + line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
bufferedReader.close();
}
}
}
(1)要编写一个dog.properties : name=tom ,age=5,color=red
(2) 编写Dog 类(name,age,color) 创建一个dog对象,读取dog.properties 用相应的内容完成属性初始化,并输出
(3) 将创建的Dog 对象 ,序列化到 文件 dog.dat 文件
public class e3 {
public static void main(String[] args) throws IOException {
Properties properties = new Properties();
properties.store(new FileOutputStream("src\\dog.properties"),null);
String name = properties.get("name")+"";//properties.get返回值是obj类型的
int age = Integer.parseInt(properties.get("age")+"");//s->i
String color = properties.get("color")+"";
Dog dog = new Dog(name, age, color);
System.out.println(dog.toString());
//序列化
String f="D:\\dog.dat";
ObjectOutputStream o=new ObjectOutputStream(new FileOutputStream(f));
o.writeObject(dog);
o.close();
}
//编写一个方法,反序列化
@Test
public void m1() throws IOException, ClassNotFoundException {
String f1="D:\\dog.dat";
ObjectInputStream oo=new ObjectInputStream(new FileInputStream(f1));
Dog d=(Dog) oo.readObject();
oo.close();
}
}
class Dog implements Serializable {
private String name;
private int age;
private String color;
public Dog(String name, int age, String color) {
this.name = name;
this.age = age;
this.color = color;
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age=" + age +
", color='" + color + '\'' +
'}';
}
}