一.字符流
1.字符输入流一次读取一个字符
2.字符输入流- 一次读取一个字符数组
3.字符输出流
(在上一篇):IO流(一)
https://blog.youkuaiyun.com/wangjh11234/article/details/130603547?spm=1001.2014.3001.5501
二.缓冲流
1.缓冲流概述
2.字节缓冲流
package com.wjh2.d1_byte_buffer;
/*
*/
import java.io.*;
public class ByteBufferDemo01 {
public static void main(String[] args) {
try (
//这里面只能放资源对象,用完会自动关闭,自动调用资源对象的close方法关闭资源(即使出现异常也会做关闭操作!)
//1.创建一个字节输入流管道与原文件接通
InputStream is = new FileInputStream("F:\\黑马程序员资料\\Java\\1、Java基础-20天学会Java\\1、课程全套PPT\\2、基础加强课全套PPT\\aaa.txt");
//a.把原始的字符输入流包装成高级的缓冲字节输入流
InputStream bis = new BufferedInputStream(is);
//2.创建一个自己输出流管道与目标文件接通
OutputStream os = new FileOutputStream("F:\\黑马程序员资料\\Java\\1、Java基础-20天学会Java\\new.txt");
//b.把字节输出流包装成高级的缓冲鲁输出鲁
OutputStream bos = new BufferedOutputStream(os);
//自动释放资源
){
//3.定义一个字节数组转移数据
byte[] bytes = new byte[1024];
int len; //记录每次读取的字节数
while((len = bis.read(bytes)) != -1){
bos.write(bytes,0, len);
}
System.out.println("复制完成");
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.字节缓冲流的性能分析
package com.wjh2.d2_byte_buffer_time;
/*
需求:
分别使用低级字节流和高级字节缓冲流拷贝大视频,记录耗时。
分析:
使用低级的字节流按照一个一个字节的形式复制文件。
使用低级的字节流按照一个一个字节数组的形式复制文件。
使用高级的缓冲字节流按照一个一个字节的形式复制文件。
使用高级的缓冲字节流按照一个一个字节数组的形式复制文件。
*/
import java.io.*;
public class ByteBufferDemo01 {
private static final String file = "F:\\javaTest\\IO流\\原文件\\test.mp4"; //原始文件
private static final String newFile = "F:\\javaTest\\IO流\\新文件\\"; //复制目的文件
public static void main(String[] args) {
// 使用低级的字节流按照一个一个字节的形式复制文件。(直接淘汰)
//copy01();
// 使用低级的字节流按照一个一个字节数组的形式复制文件。(比较慢,但还是可以忍受)
copy02();
// 使用高级的缓冲字节流按照一个一个字节的形式复制文件。(很慢,不建议使用!)
//copy03();
// 使用高级的缓冲字节流按照一个一个字节数组的形式复制文件。(推荐使用!)
copy04();
/*
一个18MB的视频比对结果:
结果:
使用低级的字节流按照一个一个字节的形式复制文件使用时间:107.305s
使用低级的字节流按照一个一个字节数组的形式复制文件使用时间:0.411s
使用高级的缓冲字节流按照一个一个字节的形式复制文件使用时间:1.298s
使用高级的缓冲字节流按照一个一个字节数组的形式复制文件使用时间:0.578s
结果:(把1和3每次字节流方法关起来)
使用低级的字节流按照一个一个字节数组的形式复制文件使用时间:2.885s
使用高级的缓冲字节流按照一个一个字节数组的形式复制文件使用时间:0.97s
*/
}
/**
* 使用高级的缓冲字节流按照一个一个字节数组的形式复制文件。
*/
private static void copy04() {
long startTime = System.currentTimeMillis();
try (
//这里面只能放资源对象,用完会自动关闭,自动调用资源对象的close方法关闭资源(即使出现异常也会做关闭操作!)
//1.创建一个字节输入流管道与原文件接通
InputStream is = new FileInputStream(file);
//a.把原始的字符输入流包装成高级的缓冲字节输入流
InputStream bis = new BufferedInputStream(is);
//2.创建一个自己输出流管道与目标文件接通
OutputStream os = new FileOutputStream(newFile + "newTest4.mp4");
//b.把字节输出流包装成高级的缓冲鲁输出鲁
OutputStream bos = new BufferedOutputStream(os);
//自动释放资源
){
byte[] bytes = new byte[1024 * 8];
int b; //记录每次读取的字节数
while((b = bis.read(bytes)) != -1){
bos.write(bytes, 0, b);
}
} catch (Exception e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
System.out.println("使用高级的缓冲字节流按照一个一个字节数组的形式复制文件使用时间:" + (endTime - startTime) / 1000.0 + "s");
}
/**
* 使用高级的缓冲字节流按照一个一个字节的形式复制文件。
*/
private static void copy03() {
long startTime = System.currentTimeMillis();
try (
//这里面只能放资源对象,用完会自动关闭,自动调用资源对象的close方法关闭资源(即使出现异常也会做关闭操作!)
//1.创建一个字节输入流管道与原文件接通
InputStream is = new FileInputStream(file);
//a.把原始的字符输入流包装成高级的缓冲字节输入流
InputStream bis = new BufferedInputStream(is);
//2.创建一个自己输出流管道与目标文件接通
OutputStream os = new FileOutputStream(newFile + "newTest3.mp4");
//b.把字节输出流包装成高级的缓冲鲁输出鲁
OutputStream bos = new BufferedOutputStream(os);
//自动释放资源
){
int b; //记录每次读取的字节数
while((b = bis.read()) != -1){
bos.write(b);
}
} catch (Exception e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
System.out.println("使用高级的缓冲字节流按照一个一个字节的形式复制文件使用时间:" + (endTime - startTime) / 1000.0 + "s");
}
/**
* 使用低级的字节流按照一个一个字节数组的形式复制文件。
*/
private static void copy02() {
long startTime = System.currentTimeMillis();
try (
//这里面只能放资源对象,用完会自动关闭,自动调用资源对象的close方法关闭资源(即使出现异常也会做关闭操作!)
//1.创建一个字节输入流管道与原文件接通
InputStream is = new FileInputStream(file);
//2.创建一个自己输出流管道与目标文件接通
OutputStream os = new FileOutputStream(newFile + "newTest2.mp4");
//自动释放资源
){
//3.定义一个字节数组转移数据
byte[] bytes = new byte[1024 * 8];
int len; //记录每次读取的字节数
while((len = is.read(bytes)) != -1){
os.write(bytes,0, len);
}
} catch (Exception e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
System.out.println("使用低级的字节流按照一个一个字节数组的形式复制文件使用时间:" + (endTime - startTime) / 1000.0 + "s");
}
/**
* 使用低级的字节流按照一个一个字节的形式复制文件。
*/
private static void copy01() {
long startTime = System.currentTimeMillis();
try (
//1.创建低级的字节流与原文件接通
InputStream is = new FileInputStream(file);
//2.创建低级的字节输出流与原文件接通
OutputStream os = new FileOutputStream(newFile + "newTest1.mp4");
){
//3.定义一个变量记录每次读取的字节(一个一个字节的复制)
int b;
while((b = is.read()) != -1){
os.write(b);
}
}catch (Exception e){
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
System.out.println("使用低级的字节流按照一个一个字节的形式复制文件使用时间:" + (endTime - startTime) / 1000.0 + "s");
}
}
一个18MB的视频比对结果:
结果:
使用低级的字节流按照一个一个字节的形式复制文件使用时间:107.305s
使用低级的字节流按照一个一个字节数组的形式复制文件使用时间:0.411s
使用高级的缓冲字节流按照一个一个字节的形式复制文件使用时间:1.298s
使用高级的缓冲字节流按照一个一个字节数组的形式复制文件使用时间:0.578s结果:(把1和3每次字节流方法关起来)
使用低级的字节流按照一个一个字节数组的形式复制文件使用时间:2.885s
使用高级的缓冲字节流按照一个一个字节数组的形式复制文件使用时间:0.97s
4.字符缓冲流
package com.wjh2.d3_char_buffer;
/*
目标:
缓冲字符输出流的使用,学会它多出来的的一个功能: newLine();
*/
import java.io.*;
public class BufferReaderDemo2 {
public static void main(String[] args) throws Exception{
//1.创建一个字符流输入管道与原文件接通
//1.创建一个字符流输入管道与原文件接通
//Writer wr = new FileWriter("..\\File-io-app\\src\\DATE\\date09.txt"); //覆盖管道,每次启动都会清空文件之前的数据
Writer wr = new FileWriter("..\\File-io-app\\src\\DATE\\date09.txt", true); //追加管道,每次启动都会追加数据到文件后面
BufferedWriter bw = new BufferedWriter(wr);
//a.void write(int c) 写一个字符
bw.write("899"); //shift + F6
bw.write('a');
bw.write('是'); //不会出问题!
bw.write("\r\n");
bw.newLine(); //换行 -> 追加换行
//b.void write(char[] cbuf) 写入一个字符数组
char[] chars = "asdf第三方sdsa".toCharArray();
bw.write(chars);
bw.write("\r\n");
//c.void write(char[] cbuf, int off, int len) 写入字符数组的一部分
bw.write(chars, 3, 5);
bw.write("\r\n");
//d.void write(String str) 写一个字符串
bw.write("sdsa反倒是防控");
bw.write("\r\n");
//e.void write(String str, int off, int len) 写一个字符串的一部分
bw.write("sdsa反倒是防控", 0, 5);
bw.write("\r\n");
//wr.flush();//刷新,关闭可以继续使用
bw.close(); //关闭,关闭后不能使用
}
}
3.侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下。愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。
1.先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。
5.亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之信之,则汉室之隆,可计日而待也。
2.宫中府中,俱为一体,陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不宜偏私,使内外异法也。
4.将军向宠,性行淑均,晓畅军事,试用于昔日,先帝称之曰能,是以众议举宠为督。愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。
6.臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。
9.今当远离,临表涕零,不知所言。
7.先帝知臣谨慎,故临崩寄臣以大事也。受命以来,夙夜忧叹,恐托付不效,以伤先帝之明,故五月渡泸,深入不毛。今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。此臣所以报先帝而忠陛下之职分也。至于斟酌损益,进尽忠言,则攸之、祎、允之任也。
8.愿陛下托臣
package com.wjh2.d3_char_buffer;
/*
目标:
需求:把《出师表》的文章顺序进行恢复到一个新文件中。
分析:
定义一个缓存字符输入流管道与源文件接通。
定义一个List集合存储读取的每行数据。
定义一个循环按照行读取数据,存入到List集合中去。
对List集合中的每行数据按照首字符编号升序排序。
定义一个缓存字符输出管道与目标文件接通。
遍历List集合中的每个元素,用缓冲输出管道写出并换行。
*/
import java.io.*;
import java.util.*;
public class BufferReaderTest3 {
public static void main(String[] args){
//1.常见字符输入流管道与原文件接通
try (
BufferedReader br = new BufferedReader(new FileReader("..\\File-io-app\\src\\DATE\\出师表.txt"));
//5.定义缓冲流字符输出管道与目标文件接通
BufferedWriter bw = new BufferedWriter(new FileWriter("..\\File-io-app\\src\\DATE\\new.txt"));
){
//2.定义一个List集合存储每行内容
List<String> date = new ArrayList<>();
//3.定义循环,按照行进行读取文章
String line;
while((line = br.readLine()) != null){
date.add(line);
}
System.out.println("原文集合:" + date);
//4.排序
Collections.sort(date);
// //自定义排序规则
// List<String> sizes = new ArrayList<>();
// Collections.addAll(sizes,"一","二","三","四","...","九");
// //如果文章是以:一二三四开头的,可以定义比较器进行排序
// Collections.sort(date, new Comparator<String>() {
// @Override
// public int compare(String o1, String o2) {
// //o1 八...
// //o2 七...
// return sizes.indexOf(o1.substring(0, o1.indexOf(".")))
// - sizes.indexOf(o2.substring(0, o2.indexOf(".")));
// }
// });
System.out.println("排序后:" + date);
//6.遍历每行集合中每行文章写进去,且要换行
for (String dm : date) {
bw.write(dm);
bw.newLine(); //换行
System.out.println(dm);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
原文集合:[3.侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下。愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。, 1.先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。, 5.亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之信之,则汉室之隆,可计日而待也。, 2.宫中府中,俱为一体,陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不宜偏私,使内外异法也。, 4.将军向宠,性行淑均,晓畅军事,试用于昔日,先帝称之曰能,是以众议举宠为督。愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。, 6.臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。, 9.今当远离,临表涕零,不知所言。, 7.先帝知臣谨慎,故临崩寄臣以大事也。受命以来,夙夜忧叹,恐托付不效,以伤先帝之明,故五月渡泸,深入不毛。今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。此臣所以报先帝而忠陛下之职分也。至于斟酌损益,进尽忠言,则攸之、祎、允之任也。, 8.愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏,臣不胜受恩感激。]
排序后:[1.先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。, 2.宫中府中,俱为一体,陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不宜偏私,使内外异法也。, 3.侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下。愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。, 4.将军向宠,性行淑均,晓畅军事,试用于昔日,先帝称之曰能,是以众议举宠为督。愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。, 5.亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之信之,则汉室之隆,可计日而待也。, 6.臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。, 7.先帝知臣谨慎,故临崩寄臣以大事也。受命以来,夙夜忧叹,恐托付不效,以伤先帝之明,故五月渡泸,深入不毛。今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。此臣所以报先帝而忠陛下之职分也。至于斟酌损益,进尽忠言,则攸之、祎、允之任也。, 8.愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏,臣不胜受恩感激。, 9.今当远离,临表涕零,不知所言。]
1.先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。
2.宫中府中,俱为一体,陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不宜偏私,使内外异法也。
3.侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下。愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。
4.将军向宠,性行淑均,晓畅军事,试用于昔日,先帝称之曰能,是以众议举宠为督。愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。
5.亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之信之,则汉室之隆,可计日而待也。
6.臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。
7.先帝知臣谨慎,故临崩寄臣以大事也。受命以来,夙夜忧叹,恐托付不效,以伤先帝之明,故五月渡泸,深入不毛。今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。此臣所以报先帝而忠陛下之职分也。至于斟酌损益,进尽忠言,则攸之、祎、允之任也。
8.愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏,臣不胜受恩感激。
9.今当远离,临表涕零,不知所言。
三.转换流
1.问题引出:不同编码读取乱码问题
package com.wjh2.d4_transfer_stream;
/*
演示一下代码编码与文件编码对的相同和不同
*/
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.Reader;
public class InputStreamReaderDemo1 {
public static void main(String[] args) {
//代码UTF-8 文件 UTF-8
try (
//代码是UTF-8,文件是UTF-8,不会乱码
//1.创建一个字符流输入管道与原文件接通
//Reader fr = new FileReader("..\\File-io-app\\src\\DATE\\date.txt");
//代码是UTF-8,文件是GBK,乱码
Reader fr = new FileReader("C:\\Users\\18231\\Desktop\\GBK.txt");
//a.把低级的字符输入流包装成高级的缓冲字符输入流
BufferedReader br = new BufferedReader(fr);
){
String line;
while((line = br.readLine()) != null){
System.out.println(line); //一行空内容不执行
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.字符输入转换流
package com.wjh2.d4_transfer_stream;
/*
演示一下代码编码与文件编码对的相同和不同
*/
import java.io.*;
public class InputStreamReaderDemo2 {
public static void main(String[] args) throws Exception{
//代码UTF-8 文件 GBK
//1.先提取GDK文件的原始字节流.
InputStream is = new FileInputStream("C:\\Users\\18231\\Desktop\\GBK.txt");
//2.把原始字节流转换成字符输入流
//Reader isr = new InputStreamReader(is); //默认以UTF-8转换成字符流,还是会乱码的
Reader isr = new InputStreamReader(is, "GBK"); //以指定的GBK编码转换成字符输入流(此时,不会乱码) 完美解决!
//3.把字符流转换成缓冲字符输入流,还是乱码
BufferedReader br = new BufferedReader(isr);
String line;
while((line = br.readLine()) != null){
System.out.println(line); //一行空内容不执行
}
}
}
3.字符输出转换流
package com.wjh2.d4_transfer_stream;
/*
*/
import java.io.*;
public class InputStreamWriteDemo3 {
public static void main(String[] args) throws Exception{
//1.定义一个字节输出流
OutputStream os = new FileOutputStream("..\\File-io-app\\src\\DATE\\date10.txt");
//2.把原始的字节输出流转换成字符输出流
//Writer isw = new OutputStreamWriter(os); //以默认的UTF-8字符出去,每次启动前跟写FileWriter一样
Writer isw = new OutputStreamWriter(os,"GBK"); //以指定的GBK方式
//sdas454���͵���s�ֶ�
//Writer isw = new OutputStreamWriter(os,"GBK"); //以指定的GBK方式
//bw.write("发送到后付款"); -> 多此一举!!
//3.把低级的字符输出流包装成高级的缓冲字符输出流
BufferedWriter bw = new BufferedWriter(isw);
bw.write("sdas");
bw.write("454");
bw.write("发送到后付款");
bw.write("s手动");
bw.close();
}
}
四.序列化对象
1.序列化对象
package com.wjh2.d5_serializable;
/*
目标:学会对象序列化,使用ObjectOutputStream 把内存中的对象存到磁盘文件中
*/
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
public class ObjectOutputStreamDemo1 {
public static void main(String[] args) throws Exception{
//1.创建一个学生对象
Student s = new Student("罗蒙","admin","123456");
//2.对象序列化(使用对象字节输出流包装字节输出流管道)
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("..\\File-io-app\\src\\DATE\\date11.txt"));
//3.直接调用序列化方法
oos.writeObject(s);
//4.释放资源
oos.close();
System.out.println("序列化完成!");
//此时报错! 要在学生类中定义接口
}
}
2.对象反序列化
package com.wjh2.d5_serializable;
/*
目标:学会对象反序列化,使用字节流把文件中的对象恢复成内存中Java对象
*/
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class ObjectOutputStreamDemo2 {
public static void main(String[] args) throws Exception{
//1.创建字节输入流管道包装低级的字节输入流管道
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("..\\File-io-app\\src\\DATE\\date11.txt"));
//2.调用对象字节输入流的反序列化方法
Student s = (Student) ois.readObject();
System.out.println(s);
//4.释放资源
ois.close();
System.out.println("反序列化完成!");
/*
Student{name='罗蒙', loginName='admin', passWord='123456'}
反序列化完成!
*/
}
}
private String name;
private transient String loginName;
//transient 修饰的成员变量不参加序列化了
private String passWord;
可以申明序列化的版本号
序列化版本号必须与反序列化的版本号一致
private static final long serialVersionUID = 1;
五.打印流
1.PrintStream, PrintWriter
package com.wjh2.d6_printStream;
/*
目标:学会使用打印流 高效 方便写数据到文件
*/
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
public class PrintDemo1 {
public static void main(String[] args) throws Exception{
//1.创建一个打印流对象
PrintStream ps = new PrintStream(new FileOutputStream("..\\File-io-app\\src\\DATE\\printDemo1.txt",true));//低级管道,追加数据在低级后面加true
PrintStream ps2 = new PrintStream("..\\File-io-app\\src\\DATE\\printDemo1.txt"); //低级管道
//PrintWriter ps3 = new PrintWriter("..\\File-io-app\\src\\DATE\\printDemo1.txt"); //功能一样:只能写字节
ps.println(97);
ps.println("sdfasfsa");
ps.println('s');
ps.println("浮华昂首地方");
ps.println(23.5);
ps.println(true);
ps.println();
ps.close(); //刷新并打印
}
}
2.输出语句的重定向
package com.wjh2.d6_printStream;
/*
目标:了解改变输出语句的位置到文件
*/
import java.io.FileOutputStream;
import java.io.PrintStream;
public class PrintDemo2 {
public static void main(String[] args) throws Exception{
System.out.println("锦瑟无端五十弦");
System.out.println("一弦一柱思华年");
//改变输出语句的位置(重定向)
PrintStream ps = new PrintStream("..\\File-io-app\\src\\DATE\\printLog.txt");
System.setOut(ps); //把系统的打印流改成我们自己的打印流 -> 之后的内容开始写
System.out.println("庄生晓梦迷蝴蝶");
System.out.println("望帝春心托杜鹃");
}
}
六.补充知识:Properties
package com.wjh2.d7_Porperties;
/*
需求:读取刚才的内容
*/
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Properties;
public class PropertiesDemo2 {
public static void main(String[] args) throws Exception{
//Map maps = new Properties(); //Properties是Map集合家族的孩子(但是已经离家出走)
Properties properties = new Properties();
System.out.println(properties);
//加载属性文件中的键值对数据添加到属性对象Properties中去
properties.load(new FileReader("..\\File-io-app\\src\\DATE\\PropertiesDemo1.txt"));
System.out.println("调用后:" + properties);
String rs = properties.getProperty("root");
System.out.println(rs);
String pwd = properties.getProperty("admin");
System.out.println(pwd);
}
}
{}
调用后:{administrator=12345678, root=root, MySql=1234, admin=123456}
root
123456进程已结束,退出代码为 0
七.补充知识: IO框架
package com.wjh2.d8_commons;
/*
*/
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
public class CommonsIODemo1 {
public static void main(String[] args) throws Exception{
//在lib添加了commons-io-2.6.jar的前提下进行
//1.完成文件的复制
// IOUtils.copy(new FileInputStream("F:\\javaTest\\IO流框架\\原文件\\1.png")
// ,new FileOutputStream("F:\\javaTest\\IO流框架\\新文件\\new.png"));
//2.完成文件复制到某个文件夹下!
FileUtils.copyFileToDirectory(new File("F:\\javaTest\\IO流框架\\原文件\\1.png")
,new File("F:\\javaTest\\IO流框架\\新文件"));
//删除文件夹
FileUtils.deleteDirectory(new File("F:\\javaTest\\IO流框架\\新文件\\nneeww.png")); //6
//3.完成文件复制到某个文件夹下!
// FileUtils.copyFileToDirectory(new File("F:\\javaTest\\IO流框架\\原文件\\1.png")
// ,new File("F:\\javaTest\\IO流框架\\新文件"));
//JDK1.7自己也做了一些一行代码完成复制的操作:New IO的技术
// Files.copy(Path.of("F:\\javaTest\\IO流框架\\原文件\\1.png")
// ,Path.of("F:\\javaTest\\IO流框架\\新文件\\main.png"));
//删除文件
Files.delete(Path.of("F:\\javaTest\\IO流框架\\新文件\\main.png"));
//删除空文件夹
// Files.deleteIfExists(Path.of("F:\\javaTest\\IO流框架\\新文件"));
//删除失败!(非空)
}
}
项目实战