IO流7(打印流、压缩与解压缩流)

14 阅读5分钟

打印流

打印流是高级流,只有输出流。分为字节打印流(PrintStream)和字符打印流(PrintWriter)。它有3个特点:

1.打印流只操作文件目的地,不操作数据源

2.其特有的方法可以实现数据原样写出。例如打印97,写到文件中的就是97,而不是其对应的ASCII码a

3.其特有的写出方法可以实现数据的自动刷新与自动换行。所以打印流打印一次数据相当于写出+换行+刷新。

字节打印流

构造方法说明
public PrintStream(OutputStream/File/String)关联字节输出流/文件/文件路径
public PrintStream(String fileName, Charset charset)指定字符编码
public PrintStream(OutputStream out, boolean autoFlush)自动刷新
public PrintStream(OutputStream out, boolean autoFlush, String encoding)指定字符编码且自动刷新

由于字节打印流没有缓冲区,所以对于它来说开不开自动刷新都一样。写构造函数参数之前,可以先Ctrl+P看看可以写什么参数。

成员方法说明
public void write(int b)常规方法:规则与之前一样,将指定的字节写出
public void println(Xxx xx)特有方法:打印任意数据,自动刷新,自动换行
public void print(Xxx xx)特有方法:打印任意数据,不换行
public void printf(String format, Object... args)特有方法:带有占位符的打印语句,不换行

这三种特有方法可以实现数据的原样写出。

public class iodemo {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        PrintStream ps = new PrintStream(new FileOutputStream("io\a.txt"),true,Charset.forName("UTF-8"));
        ps.println(97);//写出+自动刷新+自动换行
        ps.print(true);
        ps.printf("吾妻%s","牧之原翔子")
        ps.close();
​
    }
}

字符打印流

字符流底层有缓冲区,想要自动刷新需要手动开启。构造方法成员方法和字节打印流一模一样,不再赘述。

实际上,我们经常使用打印流。我们最常用的System.out.println就用到了打印流。Ctrl+ B可以看到,System是一个类,而out是类的一个PrintStream类型的静态变量。所以System.out相当于获取了一个打印流,它被称作是系统中的标准输出流,该流是不能关闭的,因为它在系统中是唯一的,除非我们重启JVM。这个打印流是Java启动后由虚拟机自己创建的,不需要我们手动创建。这个打印流默认指向控制台。

所以,对于System.out.println("123"),我们可以这么写:

PrintStream ps = System.out;
ps.println("123");//写出数据,自动换行,自动刷新

解压缩流/压缩流

解压缩流主要负责读取压缩包中的文件,因此属于输入流。压缩流是将文件中的数据写到压缩包中,因此属于输出流。

需要说明的是,压缩包里的每一个文件,在Java中都是一个ZipEntry对象,解压的本质就是把每一个ZipEntry按照层级拷贝到本地另一个文件夹中。

public class iodemo {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //1.创建一个File表示要解压的压缩包
        File src = new File("C:\test.zip");
        //2.创建一个File表示解压后的目录(目的地)
        File dest = new File("C:\test");
        //3.解压
        unzip(src,dest);
    }
    //定义一个方法用来解压压缩包
    public static void unzip(File src,File dest) throws IOException {
        //1.创建一个解压流对象
        ZipInputStream zis = new ZipInputStream(new FileInputStream(src));
​
        //2.获取到压缩包中的每一个ZipEntry对象
​
        ZipEntry entry;
        while ((entry=zis.getNextEntry())!=null){ //每一个文件、文件夹及其子文件夹都能获取到
            //3.判断当前的ZipEntry对象是否是目录
            if (!entry.isDirectory()){ //没有isFile方法,但有isDirectory方法
                //4.如果是目录,就创建一个目录
                new File(dest,entry.getName()).mkdirs();//解压的本质就是拷贝
            } else{
                //5.如果不是目录,就读取文件数据,并创建一个输出流对象,用来写出文件
                FileOutputStream fos = new FileOutputStream(new File(dest,entry.getName()));
                int b;
                while((b=zis.read())!=-1){
                    fos.write(b);
                }
                //6.关闭输出流
                fos.close();
                //7.关闭ZipEntry对象,表示在压缩包中的一个文件处理完毕了
                zis.closeEntry();
            }
        }
        //8.关闭解压流
        zis.close();
    }
}
​

压缩同理,就是把每一个文件/文件夹看成ZipEntry对象放到压缩包中。

a.txt打包成一个压缩包:

public class iodemo {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //1.创建File对象表示要压缩的文件
        File src = new File("io\a.txt");
        //2.创建File对象表示压缩包的位置
        File dest = new File("io\");
        //3.压缩
        zip(src,dest);
    }
​
     //定义一个方法用来压缩文件
    public static void zip(File src,File dest) throws IOException {
        //1.创建一个压缩流对象关联压缩包
        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(new File(dest,"a.zip")));
        //2.创建一个文件输入流对象
        FileInputStream fis = new FileInputStream(src);
        //3.创建一个ZipEntry对象,表示压缩包中的每一个文件或文件夹
        ZipEntry entry = new ZipEntry(src.getName());
        //4.将ZipEntry对象添加到压缩流中
        zos.putNextEntry(entry);
        //5.读取文件数据,并写出到压缩包中
        int b;
        while((b=fis.read())!=-1){
            zos.write(b);
        }
        //6.关闭流
        zos.closeEntry();
        zos.close();
        fis.close();
    }
}

Commons-io工具包

使用步骤:

1.在项目中创建一个文件夹lib,用于存放第三方的jar包(第三方组织将写好的代码打包成一个压缩包,在Java中压缩包的后缀为jar)

2.将jar包复制粘贴到lib文件夹

3.右键点击jar包,选择Add as Library

4.在类中导包使用

其常见方法

FileUtils类(文件/文件夹相关)说明
static void copyFile(File srcFile, File destFile)复制文件
static void copyDirectory(File srcDir, File destDir)复制文件夹
static void copyDirectoryToDirectory(File srcDir, File 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)写出数据

Hutool工具包

相关类说明
IoUtil流操作工具类
FileUtil文件读写和操作的工具类
FileTypeUtil文件类型判断工具类
WatchMonitor目录、文件监听
ClassPathResource针对ClassPath中资源的访问封装
FileReader封装文件读取(注意导包)
FileWriter封装文件写入(注意导包)

官网:hutool.cn/

API文档:apidoc.gitee.com/dromara/hut…

中文使用文档:hutool.cn/docs/#/