Java

浏览该分类下的所有文章

给PDF添加水印并保存(Java实现)

本文示例了使用 iText 5 为 PDF 添加文字水印的完整实现。首先在 Maven 中引入 `itextpdf` 与 `itext-asian` 依赖;随后编写 `PDFUtils` 工具类的 `addWaterMark` 方法,读取原 PDF、创建 `PdfStamper`、加载自定义字体并设置透明度、字体大小、倾斜角度及水平垂直间隔,在每页循环绘制水印文本;最后提供 `AddWaterMarkTest` 测试类演示调用。代码演示了如何通过 Java 程序批量为 PDF 添加可配置的水印并保存为新文件。

代码优化的部分实例

文章通过几个实际案例展示常见的代码优化手段。先用 String.format 代替“+”或 StringBuilder 拼接长字符串,提高可读性;再将普通 I/O 改为 BufferedInputStream/BufferedOutputStream 并使用缓冲区,显著提升文件读写性能;通过把循环中第二层集合转为 Map ,利用键直接查找,减少嵌套循环次数;强调使用完 ResultSet、PreparedStatement、Connection 等资源后必须按顺序关闭,防止泄漏;最后指出频繁创建数据库连接的开销,推荐使用 Druid、C3P0 等连接池来复用连接,提高并发和稳定性。整体强调简洁、可读、低耗资源的编程实践。

Linux命令速查手册

本文提供Linux常用命令速查,包括查看系统硬件信息(arch、uname、/proc/*、lspci、lsusb),时间管理(date、cal、clock),关机/重启(shutdown、reboot),文件目录操作(cd、ls、tree、mkdir、rm、mv、cp、ln、touch),文件搜索(find、locate、whereis、which),挂载/卸载文件系统(mount、umount、fuser),磁盘空间查询(df、du、rpm、dpkg),用户组管理(useradd、groupadd、passwd、chage),权限与属性设置(chmod、chown、chgrp、chmod +s/g/t、chattr),压缩打包(gzip、bzip2、tar、zip、rar),以及RPM 包的安装、查询、验证、升级和删除等完整示例。

HTML实现复制当前链接到剪切板

文章演示了在HTML页面中通过按钮实现复制当前页面链接到剪切板的完整步骤:使用<a>标签获取链接,点击按钮时动态创建隐藏的<input>,将链接写入并选中,调用 document.execCommand("Copy") 执行复制,依据返回值或异常弹出成功、失败或错误提示,从而实现“一键分享”。

HTML页面嵌入视频的方案

文章介绍了在HTML页面中使用 `<iframe>` 标签嵌入视频的基本方法,示例代码演示了如何通过 `src` 指定YouTube视频地址、设置宽高、允许全屏及相关权限。若需禁止自动播放,可在 `allow` 属性中加入 `autoplay=false`,并可通过 `style` 调整布局。整个实现简洁且可直接复制使用。

mapstruct的基本使用

MapStruct 是基于注解的编译期代码生成器,可通过普通 getter/setter 实现类型安全、无反射的对象映射,避免手写冗余代码并在编译时捕获映射不完整或类型不匹配的问题。文章先展示了原始的博客评论接口实现,代码臃肿且不易维护,随后引入 MapStruct 依赖并创建 `CommentInfoConverter` 接口,在其中通过默认方法把 `HttpServletRequest` 的参数转换为 `Comments` 实体,控制层只需调用 `commentInfoConverter.map(request)` 即可完成对象构建,代码更简洁。最后给出运行时报的 `NullPointerException` 堆栈,提示在使用旧版 1.2.0.CR1 时可能出现内部处理错误。

SpringBoot绕过Nginx代理获取客户端真实IP的解决方案

本文介绍在 SpringBoot 项目中通过 Nginx 代理获取客户端真实 IP 并解析其归属地的实现方案。首先在 Nginx 配置 `X-Real-IP` 与 `X-Forwarded-For` 头部,将真实 IP 传递给后端;随后编写 `IpUtil` 工具类,从请求头或 `request.getRemoteAddr()` 读取 IP;引入 `ip2region` 库并在资源目录放置 `ip2region.db`,使用 B‑tree 算法查询 IP 对应的省、市或国家信息;最后在控制层调用 `IpUtil.getIpAddr` 与 `IpUtil.getIpPossession`,将解析结果显示在评论区,实现博客评论的 IP 属地展示。

Optional详解

Optional 是 Java 8 为避免 NPE 而提供的容器类,使用 of、ofNullable、empty 创建实例,内部不可直接 new。常用方法包括:get 在值为空时抛异常;isPresent 判断是否非空;ifPresent 为空时不执行,非空时执行 Consumer;filter 根据 Predicate 过滤返回自身或空 Optional;map 将值映射为新对象并包装;flatMap 直接返回另一个 Optional;orElse、orElseGet、orElseThrow 在值为空时分别返回默认值、惰性 Supplier 或抛自定义异常。文中通过 Person 示例演示各方法用法,并给出 Service 层查询、DAO 返回 Optional 的实战场景,强调根据业务需求选用合适方法以提升代码可读性和安全性。

什么?十行代码实现了斗图?

文章介绍了在评论区实现“斗图”的两种方案:上传图片或直接输入图片链接。由于上传会占用服务器存储且对非表情包用户不便,作者选用第二种方式,即在评论框输入以 http/https 开头的图片地址,提交后通过 JavaScript 检测并自动包装成 `<img>` 标签显示。文中提供了相应的 HTML textarea 示例和核心 JS 代码,并演示了使用方法,推荐使用表情包网站复制图片地址直接粘贴即可。

博客的评论与回复功能的实现

文章详述了在个人博客中实现完整评论与回复功能的全过程。首先设计评论表结构,加入blogId、parentId等字段以实现关联和层级关系;随后在页面构建评论表单,利用QQ接口自动获取昵称、头像和邮箱。前端通过jQuery捕获提交和回复操作,构造请求数据并使用Ajax发送至后端。后端Controller接收参数并保存评论,随后根据parentId为‑1的根评论遍历并组织子评论,实现三级嵌套显示。关键点在于新评论置顶、子评论紧随父评论显示,以及通过parentId实现评论的层级结构。全文提供了实体类、HTML、JS及后端代码示例,帮助读者快速搭建可交互的博客评论系统。

面试官:synchronized可以锁字符串吗?

`synchronized`只能锁住引用相同的对象。`new String("...")`每次都会生成不同的堆对象,导致并发不受限制;而直接使用字面量或 `String.intern()` 把字符串放入常量池后,所有线程锁的是同一实例,才能实现互斥。但把所有字符串放入常量池会占用大量内存,回收只能依赖 Full GC,存在性能风险。推荐使用 Guava 的 `Interner`(弱引用实现),既能保证同一值的唯一锁,又能在内存不足时自动回收。

博客导流到微信公众号

文章介绍了在个人博客中通过 OpenWrite 的“博客导流公众号”功能,将首次访问的读者引导关注微信公众号并获取验证码,从而为公众号带来流量。实现步骤包括:在 OpenWrite 平台注册登录后,进入“增长工具”→“博客导流公众号”,填写博客域名和长期有效的二维码图片链接;在公众号后台设置触发关键字(如“博客”)用于发送验证码;在博客页面嵌入指定的 JavaScript 代码并在文章外层添加 id 为 “container” 的 div。用户仅需一次操作,体验影响不大,却能有效提升公众号关注度。