Java 文件相关

下载文件

//加载文件
        File file = new File(filePath);

        if (!file.exists()) {
            throw new RuntimeException("Can not find file...");
        }

        try (InputStream is = new BufferedInputStream(new FileInputStream(file));
             OutputStream out = new BufferedOutputStream(response.getOutputStream())){
            byte[] buffer = new byte[byteBufferSize];
            // 清空response
            response.reset();
            // 设置response的Header
            response.addHeader("Content-Disposition", "attachment;filename=" + java.net.URLEncoder.encode(fileName, "UTF-8") + file.getName().substring(file.getName().lastIndexOf(".")));
            response.addHeader("Content-Length", "" + file.length());
            response.setContentType("application/octet-stream");
            int len;
            while ((len = is.read(buffer)) != -1) {
                out.write(buffer, 0, len);
            }
            out.flush();
        } catch (Exception e) {
            log.error("Failed to download file...", e);
            throw new RuntimeException("Failed to download file...");
        }
    }

文件以文件流形式传给前端

try (InputStream in = new FileInputStream(file);
     OutputStream out = response.getOutputStream()) {
    response.reset();
    response.setHeader("Content-disposition", "filename=" + URLEncoder.encode(fileName, "UTF-8") + ".pdf");
    response.setHeader("fileKey", fileKey);
    response.setCharacterEncoding("utf-8");
    response.setContentType("application/pdf");
    byte[] buf = new byte[1024];
    int len = 0;
    while((len = in.read(buf)) != -1){
         out.write(buf, 0, len);
    }
    out.flush();
} catch (Exception e) {
    throw EsrmException.GENERAL_EXCEPTION.of("预览失败");
}

pdf转换图片

<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.20</version>
</dependency>
/**
     * pdf转换图片
     *
     * @param pdfPath      pdf全路径
     * @param imgDirectory 图片目录
     * @param imgName      图片名称
     * @param dpi          图片dpi
     * @param imgType      图片类型
     * @throws IOException
     */
public static List<String> pdfToImage(String pdfPath, String imgDirectory, String imgName, int dpi, String imgType) throws IOException {
    if (StringUtils.isAnyEmpty(pdfPath, imgDirectory, imgName)) {
        throw new IllegalArgumentException();
    }
    if (dpi < 0) {
        dpi = 100;
    }
    if (StringUtils.isEmpty(imgType)) {
        imgType = "png";
    }
    if (!imgDirectory.endsWith("/") && !imgDirectory.endsWith("\\")) {
        imgDirectory += File.separator;
    }

    List<String> imgList = new ArrayList<>();
    //pdf转为byte
    byte[] pdfBytes = Files.readAllBytes(Paths.get(pdfPath));
    PDDocument document = PDDocument.load(pdfBytes);
    //pdf粉刷器
    PDFRenderer renderer = new PDFRenderer(document);
    int pageCount = document.getNumberOfPages();
    for (int i = 0; i < pageCount; i++) {
        BufferedImage bufferedImage = renderer.renderImageWithDPI(i, dpi);
        String imgPath = imgDirectory + File.separator + imgName + "_" + (i + 1) + "." + imgType;
        ImageIO.write(bufferedImage, imgType, new File(imgPath));
        imgList.add(imgPath);
    }
    document.close();
    return imgList;
}

ByteArrayOutputStream & ByteArrayInputStream

此类实例域中有存储数据的缓冲区byte buf[],其中数据被写入到字节数组中, 缓冲区在数据写入时会自动增长,关闭该流无效。关闭此流后它的数据仍然存在,调用方法不会有异常。

reset():重置此字节输出流,废弃此前存储的数据

InputStream & OutputStream

处理字节流的abstract class

FileInputStream & FileOutputStream

分别为InputStream和OutputStream的实现类

BufferedInputStream & BufferedOutputStream

分别继承FileInputStream和FileOutputStream

BufferedInputStream比FileInputStream多了一个缓冲区,执行read时先从缓冲区读取,当缓冲区数据读完时再把缓冲区填满。
因此,当每次读取的数据量很小时,FileInputStream每次都是从硬盘读入,而BufferedInputStream大部分是从缓冲区读入。读取内存速度比读取硬盘速度快得多,因此BufferedInputStream效率高。
BufferedInputStream的默认缓冲区大小是8192字节。当每次读取数据量接近或远超这个值时,两者效率就没有明显差别了。
BufferedOutputStream和FileOutputStream同理。

InputStreamReader & OutputStreamWriter

实现字节流到字符流转换的abstract class

InputStreamReader 继承 Reader abstract class

Reader实现了read的相关方法

abstract public int read(char cbuf[], int off, int len) throws IOException;
// 将其他地方的内容读入到cbuf中

OutputStreamReader 继承 Writerabstract class

Writer实现了write的相关方法

abstract public void write(char cbuf[], int off, int len) throws IOException;
// 将cbuf中的内容写出到其他地方

BufferedReader & BufferedWriter

BufferedReader包装Reader 可用Reader作为构造函数入参 该包装提供了一个buffer为读取的字符缓冲

BufferedWriter包装Writer 可用Writer作为构造函数入参 该包装提供了一个buffer为读取的字符缓冲

BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

html 转存pdf

调用chrome.exe

google-chrome --headless --no-sandbox --timeout=15000 --virtual-time-budget=90000 --print-to-pdf=test.pdf --disable-gpu --run-all-compositor-stages-before-draw "http://www.baidu.com"
// headless 无图形化
// no-sandbox 停用沙箱
// timeout 超时时限
// virtual-time-budget 系统在认为页面准备好之前等待指定的虚拟毫秒数
// run-all-compositor-stages-before-draw 等待渲染

java.nio

java.nio.file.Files类
java Files类和Paths类的用法

classpath

JVM会在编译项目时,会主动将 .java文件编译成 .class文件 并和 resources目录下的静态文件一起放在 target/classes(如果是test下的类,便会放于/target/test-classes下) 目录下,这两个目录就是相应的classpath

class.getResource() 不带"/"时候是从当前类所在包路径去获取资源
class.getResource() 带"/"时候是从classpath的根路径获取
class.getResource() 本质上也是调用了getClassLoader,只是封装了一层方便了我们使用而已
getClassLoader().getResource("") 不带"/"时候是从classpath的根路径获取
getClassLoader().getResource("/") 返回null,路径中不可带有"/"
getResourceAsStream() 方法仅仅是获取对应路径文件的输入流,在路径的用法上与getResource()一致

posted @   云轻YK  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示