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()一致
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?