堪称神级!GitHub上标星157K的Java教程,全程干货,只讲重点

兄弟萌,福利来了!

昨晚有个小伙伴私信我说,“哥,能推荐一些高质量的 Java 教程吗?

都这么叫咱了,咋着也得找一份牛掰的教程给他不是,于是就有了今天这份神仙级Java教程,刚在GitHub看的时候还是129k,现在已经标星157k了,里面涵盖了 Java 所有的知识点,包括 Java 语法、Java 集合框架、Java IO、Java 并发编程和 Java 虚拟机,内容不多,只讲重点

话不多说,下面将这份教程的内容展示给大家,希望能帮助到正在学习Java的小伙伴

花了三个小时把这份教程整理成 PDF 后,我发给了小伙伴,他连忙发私信给我说,“哥,对不起,对不起,是我不懂规矩,你也太用心了,这份教程的质量真的高,不服不行!”

如果你也对这份 PDF 感兴趣的话或者想看看GitHub地址,可以帮忙转发文章后关注私信回复【学习】来获取!

Java基础

Java容器

Java并发

Java虚拟机

Java IO

限于文章篇幅原因,就展示到这里了,有需要这份文档及GitHub地址的小伙伴可以帮忙转发文章后关注私信回复【学习】来获取!

太牛了!腾讯T9耗时69天整理出最全架构师进阶核心知识点笔记

俗话说的好:

每一个程序员应该都想着如何快速提升自己(反正我是这样想的),从程序员进阶到架构师再到技术专家再到CTO 。当然这其中需要大量的知识储备,是一个不断学习的过程,话不多说下面我直接上图

Spring 原理

Netty 与RPC

RabbitMQ

负载均衡

数据库

数据结构与算法

这本Java全栈PDF一共283页,由于篇幅限制无法将全部内容展示出来,需要的小伙伴帮忙点赞转发加关注一下,然后私信【666】即可得到获取方式

  • Spring框架的七大模块
  • Bean定义5种作用域
  • spring ioc初始化流程?
  • BeanDefinition加载流程?
  • DI依赖注入流程? (实例化,处理Bean之间的依赖关系)
  • 依赖注入怎么处理bean之间的依赖关系?
  • Bean的生命周期?
  • Spring的IOC注入方式
  • 怎么检测是否存在循环依赖?
  • Spring如解决Bean循环依赖问题?
  • Spring 中使用了哪些设计模式?
  • 解释一下AOP
  • AOP 主要应用场景有
  • AOP源码分析
  • AOP使用哪种动态代理?
  • jdk动态代理
  • 动态代理与静态代理区别
  • CGLIB与JDK动态代理区别
  • SpringMVC
  • springMVC流程:
  • Mybatis
  • Mybatis原理
  • Mybatis一级缓存与二级缓存
  • Zookeeper+eureka+springcloud
  • SpringBoot启动流程
  • Spring Boot 的核心注解
  • SpringBoot常用starter都有哪些
  • Spring Boot 的核心配置文件
  • Zuul与Gateway区别
  • Zuul原理分析
  • Gateway原理分析
  • Zookeeper 工作原理(待查)
  • zoo与eur区别
  • Hystrix原理(待查)
  • 为什么需要hystrix熔断
  • 微服务优缺点
  • eureka自我保护机制
  • MQ对比
  • AVL树与红黑树(R-B树)的区别与联系
  • 为啥redis zset使用跳跃链表而不用红黑树实现
  • JAVA基本数据类型
  • IO与NIO
  • 异常类
  • LVS(4层与7层)原理
  • StringBuilder与StringBuffer
  • interrupt/isInterrupted/interrupt区别
  • sleep与wait区别
  • CountDownLatch和CyclicBarrier区别
  • 终止线程方法
  • ThreadLocal的原理和应用
  • threadLocal 内存泄漏问题
  • 如果我们要获取父线程的ThreadLocal值呢
  • 线程状态
  • Java中的线程池是如何实现的?
  • 如果线程池中的一个线程运行时出现了异常,会发生什么
  • 线程池原理
  • 拒绝策略
  • newFixedThreadPool (固定数目线程的线程池)
  • newCachedThreadPool(可缓存线程的线程池)
  • newSingleThreadExecutor(单线程的线程池)
  • newScheduledThreadPool(定时及周期执行的线程池)
  • synchronized实现原理
  • ReentrantLock 是如何实现可重入性的 ?
  • ReentrantLock如何避免死锁?
  • tryLock 和 lock 和 lockInterruptibly 的区别
  • CountDownLatch和CyclicBarrier的区别是什么
  • synchronized与ReentrantLock区别
  • 什么是信号量Semaphore
  • Semaphore 应用
  • 可重入锁概念
  • CAS+AQS队列来实现
  • AQS 原理
  • AQS两种资源共享方式
  • CAS原理
  • 公平锁与分公平锁
  • 4种锁状态
  • 轻量级锁与偏向锁的区别
  • 自旋锁升级到重量级锁条件
  • 读写锁了解嘛,知道读写锁的实现方式嘛
  • zookeeper实现分布式锁
  • volatile变量
  • volatile如何保证线程间可见和避免指令重排
  • jre、jdk、jvm的关系
  • JVM内存模型
  • 对象4种引用
  • 对象的构成:
  • 如果判断一个对象是否存活
  • java是根据什么来执行可达性分析的:
  • JVM 类加载顺序
  • JVM三种类加载器
  • 双亲委派机制
  • 双亲委派模型有啥作用
  • 如何打破双亲委派模型?
  • 双亲委派机制缺陷?
  • 导致fullGC的原因
  • 堆外内存的优缺点
  • JVM七种垃圾收集器
  • arthas 监控工具
  • 定位频繁full GC,堆内存满 oom
  • G1垃圾回收器(重点)
  • 什么时候发生Full GC呢?
  • 那为什么不在引用赋值语句处直接更新RS呢?
  • 线程本地分配缓冲区(TLAB:Thread Local Allocation Buffer)?
  • PLAB:Promotion Thread Local Allocation Buffer
  • OOM问题定位方法
  • dubbo流程
  • Dubbo推荐使用什么序列化框架,还有哪些?
  • Dubbo默认使用的是什么通信框架,还有哪些?
  • Dubbo有哪几种负载均衡策略,默认是哪种?
  • RPC流程
  • 服务暴露、服务引用、服务调用(TODO)
  • redis单线程为什么执行速度这么快?
  • Redis数据结构底层实现
  • redis事务
  • redis事务的实现特征
  • Redis的同步机制?
  • redis集群模式性能优化
  • Redis集群方案
  • 集群不可用场景
  • redis 最适合的场景
  • 缓存淘汰策略
  • redis过期key删除策略
  • 缓存雪崩以及处理办法
  • 缓存击穿原因以及处理办法
  • redis阻塞原因
  • hot key出现造成集群访问量倾斜解决办法
  • Redis分布式锁
  • Redis如何做持久化
  • 对方追问那如果突然机器掉电会怎样?
  • redis锁续租问题?
  • bgsave的原理是什么?
  • RDB与AOF区别
  • 1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如果将它们全部找出来?
  • 如何使用Redis做异步队列?
  • 可不可以不用sleep呢?
  • 能不能生产一次消费多次呢?
  • pub/sub有什么缺点?
  • redis如何实现延时队列?
  • 为啥redis zset使用跳跃链表而不用红黑树实现?
  • 数据库三范式
  • 数据库主从复制原理
  • 复制方式分类
  • 存储引擎
  • 聚集索引
  • 非聚集索引
  • 使用聚集索引为什么查询速度会变快?
  • 建立聚集索引有什么需要注意的地方吗?
  • InnoDB 表对主键生成策略是什么样的?
  • 非聚集索引最多可以有多少个?
  • BTree 与 Hash 索引有什么区别?
  • 数据库索引优缺点
  • 索引的底层实现是B+树,为何不采用红黑树,B树?
  • 索引失效条件
  • 数据库事务特点
  • 七种事务传播行为
  • 产生死锁的四个必要条件
  • @Transaction
  • XA方案
  • TCC方案
  • 可靠消息最终一致性方案
  • 最大努力通知性(定期校对)
  • Seata(阿里)
  • TCP和UDP的比较
  • TCP三次握手
  • TCP四次挥手
  • 为什么要进行第三次握手
  • Lambda表达式
  • default关键字
  • 新时间日期APILocalDate | LocalTime | LocalDateTime
  • JDK1.7与JDK1.8 ConcurrentHashMap对比
  • JDK1.8使用synchronized来代替重入锁ReentrantLock?
  • JDK1.9新特性
  • 模块系统
  • 集合工厂方法
  • 改进的 Stream API
  • 改进的 Javadoc
  • java的集合框架有哪几种?
  • List你使用过哪些
  • 你知道vector和ArrayList和linkedList的区别嘛
  • hashMap和hashTable和ConcurrentHashMap的区别
  • 说说你了解的hashmap吧
  • concurrentHashMap呢
  • concurrentHashMap的扩容方式
  • hashMap的put方法的过程
  • 为什么修改hashcode方法要修改equals
  • TreeMap了解嘛
  • LinkedHashMap了解嘛

由于篇幅限制无法将全部答案展示出来,所有答案小编已经整理成一个Word文档,需要的小伙伴帮忙点赞转发加关注一下,然后私信【666】即可得到获取方式~

java编辑PDF文件

在本文中,我们将了解如何使用 Java 编辑PDF 文件的内容。 首先,我们将添加新内容。 然后,我们将专注于删除或替换一些预先存在的内容。

我们将使用 iText7 库向 PDF 文件添加内容。 稍后,我们将使用 pdfSweep 插件来删除或替换内容。

请注意,iText 在 AGPL 下获得许可,这可能会限制商业应用程序的分发:iText 许可模型。

首先,让我们将这些依赖项添加到我们的 pom.xml 中:

让我们了解使用 iText7 处理 PDF 的步骤:

首先,我们打开一个 PdfReader 来读取源文件的内容。 如果在读取文件时随时发生错误,这将引发 IOException。

然后,我们打开一个 PdfWriter 到目标文件。 如果此文件不存在或无法创建,则会引发 FileNotFoundException。

之后,我们将打开一个使用 PdfReader 和 PdfWriter 的 PdfDocument。

最后,关闭 PdfDocument 会同时关闭底层 PdfReader 和 PdfWriter。

让我们编写一个 main() 方法来运行我们的整个处理。 为了简单起见,我们将重新抛出任何可能发生的异常:

在下一节中,我们将逐步完成 addContentToDocument() 方法,以便用新内容填充我们的 PDF。 源文档是一个 PDF 文件,左上角仅包含文本“你好,小王子”。 目标文件将由程序创建。

我们现在将向文件添加各种类型的内容。

  • 添加表单

我们将从向文件中添加一个表单开始。 我们的表单将非常简单,并包含一个名为 name 的唯一字段。

此外,我们需要告诉 iText 在哪里放置该字段。 在这种情况下,我们将把它放在以下点:(35,400)。 坐标 (0,0) 指的是文档的左下角。 最后,我们将字段的尺寸设置为 100×30:

此外,我们明确指定 iText 将表单添加到文档的第一页。

  • 添加新页面

现在让我们看看如何向文档添加新页面。 我们将使用 addNewPage() 方法。

如果我们想指定它,这个方法可以接受添加页面的索引。 例如,我们可以在文档的开头添加一个新页面:

完整方法如下:

  • 添加注释

我们现在要为文档添加注释。 具体来说,注释看起来像一个方形的漫画气泡。

我们将把它添加到现在位于文档第二页的表单之上。 因此,我们将其放置在坐标 (40,435) 上。 此外,我们会给它一个简单的名称和内容。 这些只会在将鼠标悬停在注释上时显示:

这是我们第二页中间现在的样子:

  • 添加图片

从现在开始,我们将向页面添加布局元素。 为了做到这一点,我们将无法再直接操作 PdfDocument。 我们宁愿从它创建一个文档并使用它。 此外,我们最终需要关闭文档。 关闭文档会自动关闭基础 PdfDocument,那外层的关闭document就需要注释。

//注释外面的关闭文档

现在,要添加图片,我们需要从它的位置加载它。 我们将使用 ImageDataFactory 类的 create() 方法来执行此操作。 如果无法解析传递的文件 URL,则会引发 MalformedURLException。 在此示例中,我们将使用放置在资源目录中的 rejoice图片:

下一步是在文件中设置图片的属性。 我们将其大小设置为 550×100。 我们将把它放在 PDF 的第一页,在 (10,50) 坐标处。 让我们看看添加图片的代码:

图像会自动重新缩放到给定的大小。 如下图所示:

  • 添加段落

iText 库带来了一些工具来将文本添加到文件中。 字体可以在片段本身上进行参数化,也可以直接在段落元素上进行参数化。

例如,让我们在第一页的顶部添加以下句子:this is a demo from the princess runs to the end。 我们将这句话开头的字体大小设置为 16,将段落的全局字体大小设置为 8:

注意:只能用英文,如果想要用中文,需要手动添加字体包,这里为了方便不做演示

  • 添加表格

最后但并非最不重要的一点是,我们还可以在文件中添加一个表。 例如,我们将定义一个复式表,其中包含两个单元格和两个表头。 我们不会指定任何位置。 所以它会自然地添加到文档顶部,就在我们刚刚添加的段落之后:

现在让我们看看文档第一页的开头:

现在让我们看看如何从 PDF 文件中删除内容。 为简单起见,我们将编写另一个 test 方法。

我们的源 PDF 文件将是 a-modified.pdf 文件,目标将是一个新的 a-cleaned.pdf 文件。 我们将直接处理 PdfDocument 对象。 从现在开始,我们将使用 iText 的 pdfSweep 插件。

  • 从文件中擦除文本

要从文件中擦除给定的文本,我们需要定义一个清理策略。 在此示例中,策略将只是查找与 the 匹配的所有文本。 最后一步是调用 PdfCleaner 的 autoSweepCleanUp() 静态方法。 此方法将创建一个自定义 PdfCleanUpTool,如果在文件处理期间发生任何错误,它将引发 IOException:

如我们所见,源文件中出现的 the 词在结果文件中被黑色矩形覆盖。 例如,此功能适用于数据脱敏:

  • 从文件中擦除其他内容

不幸的是,很难检测到文件中的任何非文本内容。 但是,pdfSweep 提供了擦除文件一部分内容的可能性。 因此,如果我们知道要擦除的内容的位置,我们就可以利用这种可能性。

例如,我们将擦除位于第二页 (35,400) 的大小为 100×35 的矩形的内容。 这意味着我们将摆脱表单和注释的所有内容。 下面是执行所有这些操作的代码:

如下图所示,第二页中的表单被删除了

在本节中,我们将做与前面相同的工作,只是我们将用新文本替换以前的文本,而不是只删除它。

为了更清楚起见,我们将再次使用新的 test() 方法。我们的源文件将是 a-modified.pdf 文件。我们的目标文件将是一个新的 a-fixed.pdf 文件。

之前我们看到删除的文本被黑色背景覆盖。但是,此颜色是可配置的。由于我们知道文件中文本的背景是白色的,我们将强制覆盖为白色,与我们之前擦除的方法的类似。

但是,在调用 autoSweepCleanUp() 之后,我们将查询策略以获取已擦除代码的位置。然后,我们将实例化一个包含替换文本 abc的 PdfCanvas。此外,我们将删除上边距以使其与原始文本更好地对齐。默认对齐确实不太好。让我们看一下生成的代码:

我们可以看一下效果:

在本教程中,我们了解了如何编辑 PDF 文件的内容。 我们已经看到,我们可以添加新内容、删除现有内容,甚至可以将原始文件中的文本替换为新内容。

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。