[JavaSE](打印流、FileUtils工具类、 ImageIO(验证码、二维码))

🌿🍁 ✨✨个人主页:沫洺的主页

📚📚系列专栏: 📖 JavaWeb专栏📖 JavaSE专栏 📖 Java基础专栏📖vue3专栏 

                           📖MyBatis专栏📖Spring专栏📖SpringMVC专栏📖SpringBoot专栏

                           📖Docker专栏📖Reids专栏📖MQ专栏📖SpringCloud专栏     

💖💖如果文章对你有所帮助请留下三连✨✨

🌾打印流

打印流的作用:

  • 打印流可以实现方便、高效的打印数据到文件中去。

打印流一般是指:

  • PrintStream,PrintWriter两个类。

可以实现打印什么数据就是什么数据

  • 例如打印整数97写出去就是97,打印boolean的true,写出去就是true。

构造方法

构造器

说明

public PrintWriter(OutputStream os)

打印流直接通向字节输出流管道

public PrintWriter (Writer w)

打印流直接通向字符输出流管道

public PrintWriter (File  f)

打印流直接通向文件对象

public PrintWriter (String filepath)

打印流直接通向文件路径

方法

方法

说明

public void print(Xxx xx)

打印任意类型的数据出去

package cn;

import java.io.*;

public class moming18 {
    public static void main(String[] args) throws IOException {
        //打印流
        //构造方法
        PrintWriter pw1 = new PrintWriter(new FileOutputStream("mondule02\\src\\files\\fos.txt"));
        PrintWriter pw2 = new PrintWriter(new FileWriter("mondule02\\src\\files\\fos.txt"));
        PrintWriter pw3 = new PrintWriter(new File("mondule02\\src\\files\\fos.txt"));
        String path = "mondule02\\src\\files\\fos.txt";
        PrintWriter pw4 = new PrintWriter(path) ;
        pw1.print(10);
        //pw2.print(1.234);
        //pw3.print('a');
        //pw4.print("abcd");
        pw1.close();
        pw2.close();
        pw3.close();
        pw4.close();
    }
}

 PrintStream和PrintWriter的区别

  • 打印数据功能上是一模一样的,都是使用方便,性能高效(核心优势)
  • PrintStream继承自字节输出流OutputStream,支持写字节数据的方法。
  • PrintWriter继承自字符输出流Writer,支持写字符数据出去。

输出语句重定向

属于打印流的一种应用,可以把输出语句的打印位置改到文件。

PrintStream ps = new PrintStream("文件地址")
System.setOut(ps);
package cn;

import java.io.*;

public class moming18 {
    public static void main(String[] args) throws IOException {
        //输出语句重定向
        PrintStream ps = new PrintStream("mondule02\\src\\files\\fos.txt");
        System.setOut(ps);
        System.out.println("在这里");
    }
}

🍃IO框架

commons-io 是一套io工具jar包
下载地址

网盘

链接:https://pan.baidu.com/s/1NgM50O0X71Qm6LncPyReiw?pwd=wznb 
提取码:wznb 

解压后添加jar包

commons-io概述

  • commons-io是apache开源基金组织提供的一组有关IO操作的类库,可以提高IO功能开发的效率。
  • commons-io工具包提供了很多有关io操作的类。有两个主要的类FileUtils, IOUtils
  • IOUtils 包含一些工具类,用于处理读,写和拷贝,这些方法基于 InputStream, OutputStream, Reader 和 Writer工作.
  • FileUtils 包含一些工具类,它们基于File对象工作,包括读,写,拷贝和比较文件
  • FilenameUtils包含一些工具类,它们基于文件名工作而不是File对象。这个类旨在 在Unix和
  • Windows环境下保持一致,帮助在两个环境下过渡(如从开发环境到生成环境)
  • FileSystemUtils包含一些工具类,基于文件系统访问功能不被JDK支持。目前,只有一个方法就是得
  • 到驱动器空余空间。注意这使用命令行而不是 native code。
  • EndianUtils 包含静态方法来交换Java基本类型和流的字节序
  • SwappedDataInputStream实现了DataInput接口。可以从文件中读取非本地字节序。

FileUtils主要有如下方法:

方法名

说明

String readFileToString(File file, String encoding)

读取文件中的数据, 返回字符串

void copyFile(File srcFile, File destFile)

复制文件。

void copyDirectoryToDirectory(File srcDir, File destDir)

复制文件夹。

package cn.moming18;

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;

public class FileUtilsDemo {
    public static void main(String[] args) throws IOException {
        String path = "mondule02\\src\\files\\fos.txt";
        String path1 = "mondule02\\src\\files\\fos1.txt";
        String a = "mondule02\\src\\files\\A";
        String b = "mondule02\\src\\files\\A1";
        //读取文件中的数据,返回字符串
        String s = FileUtils.readFileToString(new File(path), "utf-8");
        System.out.println(s);
        //复制文件。
        FileUtils.copyFile(new File(path),new File(path1));
        //复制文件夹。
        FileUtils.copyDirectoryToDirectory(new File(a),new File(b));
    }
}

package cn.moming18;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;

import java.io.File;
import java.io.IOException;

public class FileUtilsDemo {
    public static void main(String[] args) throws IOException {
        String path = "mondule02\\src\\files\\fos.txt";
        String path1 = "mondule02\\src\\files\\fos1.txt";
        String a = "mondule02\\src\\files\\A";
        String b = "mondule02\\src\\files\\A1";
        //建立文件
        FileUtils.write(new File("mondule02\\src\\files\\fos.txt"), "hello world 中文\n", "utf-8", true);
        //读取文件中的数据,返回字符串
        String s = FileUtils.readFileToString(new File(path), "utf-8");
        System.out.println(s);

        System.out.println(FilenameUtils.getExtension(path));
        System.out.println(FilenameUtils.getName(path));
        System.out.println(FilenameUtils.getBaseName(path));
        System.out.println(FilenameUtils.getFullPathNoEndSeparator(path));
        //复制文件。
        //FileUtils.copyFile(new File(path),new File(path1));
        复制文件夹。
        //FileUtils.copyDirectoryToDirectory(new File(a),new File(b));
        //删除文件
        //FileUtils.delete(new File("mondule02\\src\\files\\fos1.txt"));
        //FileUtils.deleteDirectory(new File("mondule02\\src\\files\\A1"));
    }
}
在这里
hello world 中文

txt
fos.txt
fos
mondule02\src\files

🌲ImageIO图像操作

直接上案例

🍂案例一:验证码

package cn.moming18;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Random;

public class VerificationCode {
    public static void main(String[] args){
        try {
            check();
        } catch (FontFormatException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    private static void check() throws FontFormatException, IOException {
        //创建画布
        int w = 100;
        int h = 50;
        BufferedImage img = new BufferedImage(w,h,2);
        //获取二维画笔
        Graphics2D g = img.createGraphics();
        //设置线条和文件的,抗锯齿(平滑)
        g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT);
        //添加画布颜色
        g.setColor(Color.WHITE);//白色
        g.fillRect(0, 0, w, h);
        //创建字体(导入字体)
        //加粗,字体大小35
        Font font = new Font("微软雅黑", Font.BOLD, 25);
        //获取字体
        g.setFont(font);
        //画字符串验证码(随机生成的字符串)
        //一个一个字符的写,且颜色随机
        String str1 = getRandStr();
        Random random = new Random();
        for (int i = 0; i < str1.length(); i++) {
            //获取随机色,随机透明度
            g.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256), random.nextInt(200,256)));
            //设置字符坐标(随机坐标)
            int x = i*25+ random.nextInt(2,6);
            int y =random.nextInt(25,40);
            g.drawString(str1.substring(i, i+1), x, y);
        }
        //干扰字(个数)
        String str2 = getRandStr(random.nextInt(15,20));
        for (int i = 0; i < str2.length(); i++) {
            //获取随机色,随机透明度
            g.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256), random.nextInt(50,100)));
            //设置字符坐标(随机坐标)
            int x = random.nextInt(w);
            int y = random.nextInt(h);
            //字号大小
            font = font.deriveFont(1.0f*random.nextInt(15, 19));
            //获取字体字号
            g.setFont(font);
            //画字符串
            g.drawString(str2.substring(i, i+1), x, y);
        }
        //随机个干扰线
        for (int i = 0; i < random.nextInt(10,15); i++) {
            //线坐标
            int x1 = random.nextInt(w);
            int y1 = random.nextInt(h);
            int x2 = random.nextInt(w);
            int y2 = random.nextInt(h);
            //随机粗细
            g.setStroke(new BasicStroke(random.nextInt(1,5)));
            //随机颜色
            g.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256), random.nextInt(50,100)));
            //画线
            g.drawLine(x1,y1,x2,y2);
        }
        //释放画笔资源
        g.dispose();
        //保存图片,格式,位置名称
        ImageIO.write(img, "png", new File("check.png"));
    }
    //随机获取4长度的字母
    public static String getRandStr(){
        return getRandStr(4);
    }
    //随机获取len长度的字母
    public static String getRandStr(int len){
        String letter = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789";
        StringBuilder sbu = new StringBuilder();
        Random random = new Random();
        //随机截取len个字母
        for (int i = 0; i < len; i++) {
            //随机获取一个字串
            //随机获取一个索引位
            int pos = random.nextInt(0, letter.length());
            //从获取的索引位置开始截取1个字符
            sbu.append(letter.substring(pos,pos+1));
        }
        return sbu.toString();
    }
}

🌿案例二:二维码编码和解码

网盘,连接在上面

 导包

package cn.moming18;

import com.google.zxing.*;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.QRCodeReader;
import com.google.zxing.qrcode.QRCodeWriter;

import javax.imageio.ImageIO;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class QRCode {
    public static void main(String[] args) throws WriterException, IOException, ChecksumException, NotFoundException, FormatException {
        //String qr = "day02/aaa/qr.png";
        //生成二维码
        // 编码格式
        Map<EncodeHintType,Object> hints = new HashMap<>();
        hints.put(EncodeHintType.CHARACTER_SET,"utf-8");
        //留白边距
        hints.put(EncodeHintType.MARGIN, 5);
        var bm = new QRCodeWriter().encode("https://blog.csdn.net/HeyVIrBbox?spm=1000.2115.3001.5343", BarcodeFormat.QR_CODE, 200, 200,hints);
        //var bm = new QRCodeWriter().encode("tel:15737452089", BarcodeFormat.QR_CODE, 200, 200,hints);
        var i = MatrixToImageWriter.toBufferedImage(bm);
        //ImageIO.write(i, "png", new FileOutputStream(qr));
        ImageIO.write(i, "png", new FileOutputStream("qr.png"));

        //解析二维码
        var img = ImageIO.read(new File("qr.png"));
        var src = new BufferedImageLuminanceSource(img);
        var binarizer = new HybridBinarizer(src);
        var binarBitmap = new BinaryBitmap(binarizer);
        var result = new QRCodeReader().decode(binarBitmap);
        System.out.println(result.getText());
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沫洺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值