一、简介
二、并发编程的3个基本概念
1.原子性
2.可见性
3.有序性
三、锁的互斥和可见性
四、Java的内存模型JMM以及共享变量的可见性
五、volatile变量的特性
1.保证可见性,不保证原子性
2.禁止指令重排
六、volatile不适用的场景
七、volatile原理
八、单例模式的双重锁为什么要加volatile
1)找到项目下的.idea/workspace.xml
2)打开文件,找到标签:PropertiesComponent
3)添加一行属性:
其它属性代码不要修改,只添加下面一行属性代码
用的Apache PDFBox库 读:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
import java.io.File; import java.io.IOException; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.text.PDFTextStripper; public class PDFReader { public static void main(String[] args) { try { // 加载PDF文件 File file = new File("example.pdf"); PDDocument document = PDDocument.load(file); // 创建PDFTextStripper对象 PDFTextStripper pdfStripper = new PDFTextStripper(); // 从第一页到最后一页提取文本内容 for (int i = 1; i <= document.getNumberOfPages(); i++) { pdfStripper.setStartPage(i); pdfStripper.setEndPage(i); String text = pdfStripper.getText(document); System.out.println("Page " + i + ":"); System.out.println(text); } // 关闭PDF文档 document.close(); } catch (IOException e) { e.printStackTrace(); } } } |
写:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
import java.io.IOException; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.font.PDType1Font; public class PDFGenerator { public static void main(String[] args) { try { // 创建文档对象 PDDocument document = new PDDocument(); // 创建页面 PDPage page = new PDPage(); // 将页面添加到文档 document.addPage(page); // 创建内容流以便向页面添加内容 PDPageContentStream contentStream = new PDPageContentStream(document, page); // 设置字体和字体大小 contentStream.setFont(PDType1Font.HELVETICA, 12); // 在页面上写入文本 contentStream.beginText(); contentStream.newLineAtOffset(100, 700); contentStream.showText("Hello, World!"); contentStream.endText(); // 关闭内容流 contentStream.close(); // 保存文档 document.save("GeneratedPDF.pdf"); // 关闭文档 document.close(); System.out.println("PDF文件已生成成功!"); } catch (IOException e) { e.printStackTrace(); } } } |
View Details
记录一下今天工作的时候升级一个认证服务遇到的小问题,虽然最后解决只有一行代码,却花了差不多3个小时。
初始版本为
springboot 1.5.9.RELEASE
springcloud Dalston.SR1
升级为
springboot 2.0.3.RELEASE
springcloude finchley.RELEASE
升级改造完成之后,服务运行正常,但是请求认证的时候报错:
http://localhost:9000/oauth/token?grant_type=password&scope=app&client_id=client_2&client_secret=123456&username=user&password=123456
回复
{
“error”: “invalid_client”,
“error_description”: “Bad client credentials”
}
客户端通过客户端的id和secret申请授权,这种方式给出的令牌,是针对第三方应用的,而不是针对用户的,即有可能多个用户共享同一个令牌。
View Details首先我们得了解什么是Oauth2.0,简单来说Oauth2.0它是一个授权协议。我们可能会听说过,使用Oauth2.0来实现单点登录SSO,以及第三方登录。那个什么是授权?
举个通俗易懂的例子,就是第三方人员A要想进入B公司的大厦进行业务交流的时候,因为A并不是B公司的员工,出于安全的缘故,所以他不能够自由的出入B公司的大厦。那个A到了B公司前台的时候,A得去前台和B公司前台工作人员说明来意,并且出示邀请(访问)证明,此时B公司前台工作人员就会给你一张临时工牌让你进入大厦。
在这个例子当中,A没有工牌所以是无法进入B公司大厦里进行业务交流,B公司前台给A一张临时工牌,这个操作就相当于授权。
总的来说,OAuth 2.0 这种授权协议,就是保证第三方(软件)只有在获得授权之后,才可以进一步访问授权者的数据。
View Details开发中使用RestTemplate来进行访问,设置请求头的方法: 方法一:单独设置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class TestRestTemplate { @Autowired private RestTemplate restTemplate; public void postObject(String id){ String url="http://www.baidu.com"; MultiValueMap<String, String> map = new LinkedMultiValueMap<>(); map.add("id",id); HttpHeaders header = new HttpHeaders(); // 需求需要传参为form-data格式 header.setContentType(MediaType.MULTIPART_FORM_DATA); HttpEntity<MultiValueMap<String, String>> httpEntity = new HttpEntity<>(map, header); JSONObject response = restTemplate.postForObject(url, httpEntity, JSONObject.class); } } |
方法二:公共设置,使用interceptor拦截器设置 1.添加拦截器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public class HeaderRequestInterceptor implements ClientHttpRequestInterceptor { private final String headerName; private final String headerValue; public HeaderRequestInterceptor(String headerName, String headerValue) { this.headerName = headerName; this.headerValue = headerValue; } @Override public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { request.getHeaders().set(headerName, headerValue); return execution.execute(request, body); } |
2.配置RestTemplate Bean
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
@Configuration public class RestTemplateConfig { @Bean public RestTemplate restTemplate() { List<ClientHttpRequestInterceptor> interceptors = new ArrayList<>(); interceptors.add(new HeaderRequestInterceptor("token", "123")); RestTemplate restTemplate = new RestTemplate(); restTemplate.setInterceptors(interceptors); return restTemplate; } } |
3.使用RestTemplate Bean
1 2 |
@Autowired private RestTemplate restTemplate; |
from:https://www.cnblogs.com/z-Z-/p/15932021.html
View DetailsOCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程;
现在有很多软件都支持这个功能,比如钉钉就支持扫描图片后直接转成文字。
在OCR识别领域,有一个开源的项目——Tesseract,Tesseract是一個光学字符识别引擎。Tesseract是基于Apache许可证的自由软件,自2006 年起由Google赞助开发。2006年,Tesseract被认为是最精准的开源光学字符识别引擎之一。
View DetailsOCR是什么?
光学字符识别(Optical Character Recognition, OCR)是指对文本资料的图像文件进行分析识别处理,获取文字及版面信息的过程。亦即将图像中的文字进行识别,并以文本的形式返回。
目前发展现状
ocr的发展已经有了非常多的积累,一般人或者企业使用, 都是直接使用第三方的服务,目前提供第三方服务的大企业也非常多,百度,阿里云,腾讯等等,都提供了非常方便的api接口,可以进行调用,识别的速度、精确度和效果也都是非常不错的。唯一的缺点就是api的调用是需要收费的,对于调用频次不高的个人和企业,这个费用还是非常低的。
OCR技术
OCR技术是光学字符识别的缩写(Optical Character Recognition),利用文字识别技术将图像信息转化为文本信息。应用于银行票据、大量文字资料、档案卷宗、文案的录入和处理领域,例如:自动识别身份证号码,将AI引入审核场景,与风控规则相结合,减少人为对图片的审核,大大提高审核效率。
OCR开发包
由于图像技术门槛较高,特别是中文语言库需要大量的训练才能达到较高的识别率。目前很多OCR软件,一般都是借用大公司的API接口实现的,如百度OCR接口。在线接口识别率比较高,但受限于网络和调用次数,有些场景须考虑离线使用。
开源的OCR识别框架 Tesseract-OCR (https://github.com/tesseract-ocr ),由HP实验室开发,后由Google维护的开源OCR引擎,可以不断的训练语言库,使图像转换文本的能力不断增强。 SDK包含libtesseract、命令行程序,支持跨平台开发,支持Java,Python等语言调用,建议选择4.0以后版本,准确率有较大提升,需要识别中文信息可单独添加中文词库。
View Details