菜鸟之路Day17一一IO流(三)
作者:blue
时间:2025.2.20
文章目录
- 菜鸟之路Day17一一IO流(三)
- 0.概述
- 1.打印流
- 1.1字节打印流
- 1.2字符打印流
- 2.解压缩流/压缩流
- 2.1解压缩流
- 2.2压缩流
- 3.Commons-io工具包
- 4.HuTool工具包
0.概述
文章内容学习自黑马程序员BV1yW4y1Y7Ms
1.打印流
分类:打印流一般是指:PrintStream,PrintWriter两个类
特点1:打印流只操作文件目的地,不操作数据源
特点2:特有的写出方法可以实现,数据原样写出
例如:打印:97,文件中:97
特点3:特有的写出方法,可以自动刷新,自动换行
打印一次数据 = 写出 + 换行 + 刷新(字节流底层没有缓冲区,开不开自动刷新都一样)
1.1字节打印流
public class myPrintStreamDemo1 {
public static void main(String[] args) throws FileNotFoundException {
/*
* 字节打印流:
* 构造方法
* public PrintStream(OutputStream/File/String)
* public PrintStream(String fileName,Charset charset)
* public PrintStream(OutputStream,boolean autoFlush) 自动刷新
* public PrintStream(OutputStream,boolean autoFlush,String encoding)
* 成员方法:
* public void write(int b)
* public void println() 打印任意数据,自动刷新,自动换行
* public void print() 不换行
* public void printf(String format,Object args) 带占位符打印语句,不换行
* */
PrintStream ps = new PrintStream(new FileOutputStream("src\\a.txt"),true, Charset.forName("UTF-8"));
ps.println(666);
ps.printf("%d",999);
}
}
1.2字符打印流
字符流底层有缓冲区,想要自动刷新需要开启
public class myPrintStreamDemo2 {
public static void main(String[] args) throws IOException {
/*
* 字符打印流:
* 构造方法
* public PrintWriter(OutputStream/File/String)
* public PrintWriter(String fileName,Charset charset)
* public PrintWriter(OutputStream,boolean autoFlush) 自动刷新
* public PrintWriter(OutputStream,boolean autoFlush,String encoding)
* 成员方法:
* public void write(int b)
* public void println() 打印任意数据,自动刷新,自动换行
* public void print() 不换行
* public void printf(String format,Object args) 带占位符打印语句,不换行
* */
PrintWriter pw = new PrintWriter(new FileWriter("src\\a.txt"),true);
pw.println("mwnwzdhxhn");
pw.print("aaa");
pw.close();
}
}
我们平时用的System.out.println();其实就是打印流的一个应用
public class myPrintStreamDemo3 {
public static void main(String[] args) {
//获取打印流的对象,此打印流在虚拟机启动的时候,由虚拟机创建,默认指向控制台
//特殊的打印流,系统中的标准输出流,是不能关闭的,在系统中是唯一的。
PrintStream ps = System.out;
ps.println("123");
}
}
2.解压缩流/压缩流
2.1解压缩流
压缩包里面的每一个文件都是ZipEntry对象,解压的本质,就是把每一个ZipEntry按照层级拷贝到本地另一个文件夹中
public class ZipStreamDemo1 {
public static void main(String[] args) throws IOException {
File src = new File("源文件位置");
File dest = new File("目标文件位置");
unzip(src, dest);
}
private static void unzip(File src, File dest) throws IOException {
//解压的本质就是将压缩包中每一个文件读取出来,按层级复制到目的位置
//创建一个解压缩流来读取压缩包中的数据
ZipInputStream zis = new ZipInputStream(new FileInputStream(src));
ZipEntry entry;
while((entry=zis.getNextEntry())!=null){ //getNextEntry方法用来获取下一个entry对象
if(entry.isDirectory()) {
//如果entry是文件夹,则要在当前位置创建一个文件
File file = new File(dest,entry.toString());
file.mkdirs();
}
else {
//如果是文件的话就要做一个文件拷贝
FileOutputStream fos = new FileOutputStream(new File(dest,entry.toString()));
int ch;
while((ch=zis.read())!=-1){
fos.write(ch);
}
fos.close();
//表示压缩包中一个文件处理完毕了
zis.closeEntry();
}
}
zis.close();
}
}
2.2压缩流
压缩本质:把每一个(文件/文件夹)看成ZipEntry对象放到压缩包中
压缩单个文件
public class ZipStreamDemo2 {
public static void main(String[] args) throws IOException {
File src = new File("源文件");
File dest = new File("目的地址");
ToZip(src,dest);
}
private static void ToZip(File src, File dest) throws IOException {
//创建一个压缩流对象关联压缩包
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(new File(dest,"a.zip")));
//用ZipEntry对象来代表压缩包中的文件
ZipEntry entry = new ZipEntry("a.txt");
//把ZipEntry对象放到压缩包中
zos.putNextEntry(entry);
FileInputStream fis = new FileInputStream(src);
int b;
while((b=fis.read())!=-1){
zos.write(b);
}
zos.closeEntry();//表示压缩包中一个文件处理完毕了
fis.close();
zos.close();
}
}
压缩整个文件夹
public class ZipStreamDemo3 {
//需求:压缩一整个文件夹
public static void main(String[] args) throws IOException {
//1.创建一个File对象表示要压缩的文件夹
File src = new File("源文件");
//2.获取其父级路径,也就是其存放的位置
File destparent = src.getParentFile();
//3.创建目的File对象,也就是压缩包
File dest = new File(destparent,src.getName()+".zip");
//4.创建压缩流,来管理压缩包
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(dest));
//5.对文件进行压缩
ToZipFunction(src,zos,src.getName());
//6.释放资源
zos.close();
}
/*
* 作用:对文件进行压缩
* 参数一:数据源
* 参数二:管理压缩包的压缩流
* 参数三:压缩包内部路径
* */
private static void ToZipFunction(File src, ZipOutputStream zos, String name) throws IOException {
//获取数据源中的每一个文件
File[] files = src.listFiles();
//遍历每一个文件
for (File file : files) {
if(file.isFile()) {
//首先要在压缩包中创建这个文件
ZipEntry entry = new ZipEntry(name+"\\"+file.getName());
zos.putNextEntry(entry);
//如果是文件则copy
FileInputStream fis = new FileInputStream(file);
int b;
while((b=fis.read())!=-1){
zos.write(b);
}
fis.close();
//关闭当前的entry对象
zos.closeEntry();
}
else {
//如果是文件夹则递归
ToZipFunction(file,zos,name+"\\"+file.getName());
}
}
}
}
3.Commons-io工具包
Commons-io是apache开源基金组织提供的一组有关IO操作的开源工具包
作用:提高IO流的开发效率
Commons-io使用步骤
①在项目中创建一个文件夹:lib
②将jar包复制粘贴到lib文件夹
③右键点击jar包,选择Add as Library -> 点击ok
④在类中导包使用
常用方法
/*
* FileUtils类
* static void copyFile(File srcFile,File destFile) 复制文件
* static void copyDirectory(File srcDir,File destDir) 复制文件夹(直接拷贝数据源中的内容)
* static void copyDirectoryToDirectory(File srcDir,File destDir) 复制文件夹(直接将srcDir塞到destDir中)
* static void deleteDirectory(File directory) 删除文件夹
* static void cleanDirectory(File directory) 清空文件夹(清空里面的内容)
* static String readFileToString(File file,Charset encoding) 读取文件中的数据变成字符串
* static void write(File file,CharSequence data,String encoding) 写出数据
*
* IOUtils类
* public static int copy(InputStream input,OutputStream output) 复制文件
* public static int copyLarge(Reader input,Writer output) 复制大文件
* public static String readLines(Reader input) 读取数据
* public static void write(String data,OutputStream output) 写出数据
* */
4.HuTool工具包
难得糊涂,无所谓失,无所谓得
简介 | Hutool
Hutool🍬一个功能丰富且易用的Java工具库,涵盖了字符串、数字、集合、编码、日期、文件、IO、加密、数据库JDBC、JSON、HTTP客户端等功能。
public class myhutoolDemo1 {
public static void main(String[] args) {
/*
* FileUtil类:
* file:根据参数创建一个file对象
* touch:根据参数创建文件
*
* writeLines:把集合中得数据写出到文件中,覆盖模式
* appendLines:把集合中得数据写出到文件中,续写模式
* readLines:指定字符编码,把文件中得数据,读到集合中
* readUtf8Lines:按照UTF-8的形式,把文件中的数据,读到集合中
*
* copy:拷贝文件或者文件夹
* */
//hutool这个方法可以接熟可变参数,自动拼接成一条文件路径
File file = FileUtil.file("D:\\","aaa","bbb","a.txt");
System.out.println(file);
File touch = FileUtil.touch(file);//touch根据参数创建文件,它的强大之处在于,即便文件不存在也能创建
//会将其连同父级路径一同创建出来
System.out.println(touch);
ArrayList<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
File file1 = FileUtil.writeLines(list, file, "UTF-8");
System.out.println(file1);
File file2 = FileUtil.appendLines(list, file, "UTF-8");
System.out.println(file2);
//读取的时候认为一行为一个元素
List<String> strings = FileUtil.readLines(file, "UTF-8");
System.out.println(strings);
}
}