贼拉正经的技术博客

A

文章

Java 困扰三周の问题:使用byte[]或skip()方法读取字节流Stream文件尾部多/少/缺字节解决方法

前言 最近在造一个最强兼容性的FTP服务端轮子,但在使用InputStream、OutputStream及它的子类时,我遇到了很奇怪也很严重的问题:数据尾部随机缺少/多出数据。这个问题简直太致命了。 问题复现 先出一段代码,我之前操作数据流的步骤如下(请注意看注释): // 获取文件输出流FileOutputStream和网络输入流InputStream FileOutputStream fileOutputStream = new FileOutputStream(file); InputStream inputStream = socket.getInputStream(); // 新建一个字节数组 byte[] bytes = new byte[8192]; // 从网络输入流inputStream,读取字节并写入到字节数组byte[] bytes while ((inputStream.read(bytes)) != -1) { // 写入到本地文件中 fileOutputStream.write(bytes); } // 以防万一,刷新一下缓存 fileOutputStrea....

大白话之Java Stream流:将类数组流化,便捷批量修改,通俗讲解!

前言 Stream大意概括 将一个列表(List)中的所有类铺平转换成一条流水线,按要求将流水线上的所有类一个一个地处理。像极了SQL语句。 本篇文章将用通俗易懂的语言为你讲解流操作。如果你有一部分卡住看不懂,跳过去就好,再回去看就会了。 -📚-需要先了解的知识-📚- 语言内容链接 JavaList、ArrayList的使用、基本原理及区别null JavaLambda表达式的使用及基本原理null -⭐-评分-⭐- 知识等级实用性罕见性 进阶实用较少见 原理图 其实整个过程跟流水线差不多。让我们看看由灵魂画手A先生绘制的原理图: 没看懂没关系,做完第一个实践再回来看看。 实践 跳过那些复杂的理论,打开你的IDE,新建一个类名为Arr,把下面的代码复制进去,反复分析代码,最后带着你的疑问再继续: import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; public class ....

大白话之Java多线程join方法:开局一张图,试学一分钟,你就费和我一样,理解介个方法

前言 有次偶尔接触到了Thread.join()方法,便到网上去查阅相关资料,但也是看得我一头雾水(天下文章一般抄)。在我很久的理解之后,便想将我理解的join()方法以一张图的方式解释出来。 要学习本篇文章,你需要理解以下知识: 多线程 & Thread (点我学习) 仔细看 开局扔张图: 我绘制的这张图以时间线的形式解释了主线程和各个被实例化的John线程的运行过程。 别着急,多看两遍! 我们可以看到,在主线程调用了join()方法后,指定的线程会被抓回来在后边老老实实地排队。 猜一下 问:请回答未执行join()方法和执行了join()方法的运行结果有什么不同(可能有几种结果、运行的时间、输出的顺序)? 💡—!> 答: 类型可能结果数量运行速度输出顺序时间复杂度(最好) 不使用join()6种快(多线程)乱序O(1) 使用join()1种慢(单线程)顺序O(n) Q&A 看完后,你可能还会有些疑问: Q:为什么不使用join()的可能结果数量是6种?输出顺序为什么是乱序? A:由于多线程的原因,虽然start()顺序执行了线程1/2/3,....

大白话之AutoClosable接口 | try-with-resources:JDK1.7的新特性,提高重复回收效率

前言 无论是使用文件IO流,还是网络Socket流,都免不了调用close()将流关闭。如果需要操作的流过多,就会导致混乱。 一旦忘记将关闭方法放到finally中,很有可能出现流未被关闭,占用大量内存空间的问题。 流程简化 对比 try-catch-finally AC ac = null; AC2 ac2 = null; try { ac = new AC(); ac2 = new AC2(); } catch (Exception e) { } finally { ac.close(); ac2.close(); } try-with-resources try (AC ac = new AC(); AC2 ac2 = new AC2()) { } catch (Exception e) { } 可以很明显的看到,try-with-resources会自动调用类中的close()方法,简化了流程,提高了代码的整洁度。 AutoCloseable AutoCloseable是Java的内置接口,继承这个接口并且按要求新建close()方法,该类就能被try-with-res....

大白话之必会Java Atomic | 线程一点也不安全(二):Atomic的ABA问题会导致什么情况?如何解决?

前言 第一章还没看过?点我可以穿越 阅读本篇文章,你需要了解以下知识: Atomic是什么?(点此跳转) 单向链表的原理 从上一章的内容,我们可以了解到,Atomic可以基本解决线程同步安全的问题。而本章我们将讨论Atomic的缺点与它的原子性。 ABA问题 什么是ABA问题?首先我们都知道,Atomic的CAS模型,会先读取变量的值,作为预期旧值,然后再基于旧值产生操作生成新值,再确认变量是否为预期旧值,如果是,修改为新值。 我们以单向链表来演示ABA会导致的问题: 解决ABA问题 现在我们知道了,由于Atomic仅判断了旧值,但并没有意识到整个链表已经被修改过一次了。所以我们要引入一个新的概念: 版本 Atomic在修改值时,保存的不仅再是旧值,还有一个版本号。在每次更改后,版本号都会变化,这样就不会再产生ABA问题了。我们看图: AtomicStampedReference Atomic的开发者自然也意识到了这个问题,并后续开发了AtomicStampedReference来修复这个问题。我们用一段简单的代码来实现: import java.util.concurrent....

大白话之必会Java Atomic | 线程一点也不安全(一):比自增和synchronized更快速、靠谱的原子操作(调用C语言)

前言 阅读本篇文章,你需要对下方知识有所了解: synchronized关键词的作用 线程池的作用(这里) 不靠谱和慢动作 在多线程环境下: 操作靠谱程度执行速度 i++ 自增运算没戏不赖 synchronized贼棒太废 不靠谱的自增 操作类 假如我们现在有一个变量:num 我们这个变量设置两个方法: 方法返回值作用 plus()void将num自增(+1) getNum()Integer返回num的值 代码如下: class Num { Integer num = 0; public void plus() { num++; } public Integer getNum() { return num; } } 主类 然后在另一个类主方法中新建一个缓存线程池: ExecutorService executorService = Executors.newCachedThreadPool(); 当我们执行executorService.execute(new Runnable() {})时,缓存线程池会将指定的对象以非阻塞的方式提交到队列中。 随后再写....

刨根问底 | 大白话:在使用注解后,框架是怎么知道你哪个方法使用了注解的?用@RequestMapping注解举例详解!

前言 阅读本篇文章,你需要理解以下的知识: 重要:反射 (参考) Java enum 接口的使用 了解注解是什么、该什么时候使用 最好接触过Spring(因为用@RequestMapping举例) 先说说注解 如果你熟悉Spring框架,你一定使用过这个注解: @RequestMapping(value = "/admin/index.html", method = RequestMethod.GET) 这条注释的意思是: 用户访问"/admin/index.html"页面,则执行下方方法 限制用户只能使用"GET"方式访问 那么Spring在启动后是如何知道你用了这个注解,并且调用这个注解指定的方法的呢? 让我们先大体猜测一下: 我们可以配置Spring扫描的@Controller所在目录 Spring扫描目录,并逐个扫描@Controller类中的注解 解析所有扫描到的注解,并通过反射,执行指定注释下的方法 实例 打开你的IDE,新建一个类Main.java,并复制下方语句: import java.lang.annotation.ElementType; impor....

大白话之fail-fast | fail-safe:为什么会有这个机制?它有什么作用?

前言 阅读本篇文章,你需要了解下列知识: 多线程的实现(看过来) Iterator的使用 ArrayList的使用和如何实现Iterator 为什么会有这个机制? 举个栗子 有一杯水、两个人(黄渤和红雷) 黄渤拿起了水杯,开始喝水 红雷到达案发现场,想抢走水杯喝水 黄渤很生气,并锤了红雷一顿 映射关系 将上面的栗子翻译一下: 有一个ArrayList、两个线程(Thread1和Thread2) Thread1请求并开始使用Iterator遍历ArrayList Thread2随后紧跟请求对ArrayList进行修改 由于Thread1正在遍历ArrayList,ArrayList对Thread2扔出ConcurrentModificationException 继承关系 Tip 如果下面的知识让你难以搞懂,可以直接跳过,在深入学习接口和继承后,再回来看一遍。 看起来有些困难?没关系。 ArrayList继承了Iterable接口,实现了基于Iterator的遍历功能。 ArrayList实现Iterator的部分源码如下: /** * An optimized ver....

大白话 | 课堂实践:使用Iterator对数组进行遍历

前言 阅读本篇文章,你需要对以下知识有所了解: 接口(这儿有) Iterator的使用 Java 匿名内部类 构思 我们都知道,Iterator是一种迭代器,它的接口中有四种方法(JDK 1.8): public interface Iterator<E> { boolean hasNext(); E next(); default void remove() { throw new UnsupportedOperationException("remove"); } default void forEachRemaining(Consumer<? super E> action) { Objects.requireNonNull(action);while (hasNext()) action.accept(next()); } } 方法返回值作用 hasNext()boolean查找是否还有下一个元素,如果有,返回true,反则返回false next()Object返回下一个元素 remove()void删除当前指向的元素 forEachRe....

大白话之Java面向接口编程:最“正经”的中文实例讲解,看不懂来打我!

前言 作为一个正经博主,我会用最纯洁易懂的方式让你理解面向接口编程。 阅读本篇文章,你需要对以下知识有所了解: 面向对象编程基础知识 接口(这儿有) 实例 废话少说。打开你的IDE(没有?去下!),新建一个类,命名为Main,复制下方代码: interface 动作 { void 结婚(); void 生孩子(); } class 如花 implements 动作 { @Override public void 结婚() { System.out.println("为什么?"); } @Override public void 生孩子() { System.out.println("凭什么?"); } } class 美女 implements 动作 { @Override public void 结婚() { System.out.println("就现在!"); } @Override public void 生孩子() { System.out.println("就今晚!"); } } class 帅气的我 { private 动作 小姐姐; public 动作 我女朋友是谁....

大白话之Java反射-初学最迷的概念:能干啥?咋用?

前言 初学时,反射、网络编程、IO是我最不能理解的三大模块。 当时查资料,给我的感觉是:写文章的都觉得我已经会了。 如今,我用实例尽可能简单地讲述反射这个东西。 能干啥? 人类文明分为三个阶段: 女娲创造人类 人类文明建立,地球产生秩序 人类灭亡 实例化 平常我们实例化一个类,都是用: Main main = new Main(); 那如果要读取这个类中的公共变量,我们需要: public class Main { public String value = "HelloWorld!"; } public class Test { public static void main(String[] args) { Main main = new Main(); System.out.println(main.value); } } 那么我们如果将这个变量设置为私有呢? public class Main { private String value = "HelloWorld!"; } 很明显,我们无法获得该变量的值,因为变量的作用域止步于自己的类中。 那么如果我们使用反射,我....

从 SpringMVC 转为使用 SpringBoot —— 手把手带你使用 Intellij IDEA 最快速地搭建 SpringBoot+MyBatis(无 XML)+Thymeleaf

序 最近打算从SpringMVC的学习过渡到SpringBoot的学习,一直听说SpringBoot十分方便,便想探个究竟。 提示 篇幅可能较长,但这可能是最全最简单的一篇教程了,请抱着不厌其烦的态度去学习。无论你有没有SpringMVC的搭建基础,你都可以跟着本教程将SpringBoot正常驱动起来。 逐步重启测试能保证某段配置过程不出问题,请不要忽略掉文中多次要求重启的要求。 新建项目 File -> New - >Project... 选择Spring Initlalizr Spring Initializr -> 在右侧Project SDK选择你配置的SDK(推荐JDK1.8) -> Next 如果你的IDEA中没有"Spring Initializr",说明你的IDEA是社区版(Community Editon)的,请更换版本为ULTIMATE。 配置项目属性 修改: Group:团队名,通常填写为com.xxx Artifact:包名,通常填写该项目的名称 Name:项目名称 Description:项目描述 其它选项会自动....

一个最简单的实例理解Semaphore在Java中的作用

前言 阅读本篇文章,你需要先理解以下知识: Java基础知识 Thread多线程(点我跳转) 击鼓传花的玩法 你有没有和小伙伴们玩过击鼓传花这个游戏?多个人同时只有“一朵花”的情况下,只有一个人最后会“中奖”。Semaphore就像击鼓手一样控制着这朵“花”究竟“花落谁家”。 当然了,Semaphore不只支持调度一朵花。 它在Java中常被用于线程的调度,当有多个线程访问同一个资源时,我们可以让线程尝试从Semaphore获取一个许可证,如果该线程尝试访问的对象正在被其它线程占用,该线程将无法获取许可证,即循环等待重新获取。 Semaphore并不难理解,请不要被下面一大串代码所劝退,认真试验下去。 拷贝 等等! 在拷贝之前你要知道,下面的代码有3中测试模式,将test的值改为1/2/3会开启不同的代码段,它们的难度是不一样的。 好的。现在打开你的IDE,新建一个项目或类,将类命名为SemaphoreTest,并将下面的代码替换到你的项目中: import java.util.concurrent.Semaphore; import java.util.concurrent.Ti....

一个实例理解Java Runnable多线程用处与用法

前言 阅读本篇文章,你需要先理解以下知识: Thread多线程(点我跳转) 接口(interface)是什么 (点我跳转) 回顾 在阅读上一篇“Java Thread多线程”后,相信你学会了使用extends来调用,但它是有缺陷的。 extends的缺点 Java的每个类只能使用extends继承一个类,如果在继承了Thread类后又想继承其它类,这是不可能的。 所以,有没有办法让Thread不继承而拥有线程属性呢?有的。 使用implements 在Java中,implements用于继承接口。每个类可以implements的接口是没有数量限制的,所以使用implements可以让该类避免继承被占用。 拷贝 使用你的IDE新建一个项目或类并命名为RunnableDemo,然后将下面的代码替换进去: public class RunnableDemo { public static void main(String[] args) { runnableThread1 runnableThread1 = new runnableThread1(); Thread thread = n....

实例带你获取多线程Thread的返回值之 (贰) - Callable配合线程池返回数据

前言 阅读本篇文章,你需要先理解以下知识: 第一章:Callable的使用(点我跳转) 多线程Thread的基本使用 (点我跳转) 线程池基本知识 (点我跳转) extends和implements 重写Override try catch错误处理 Java基础知识 回顾 在上一章(点我跳转)我们了解了Callable的基本使用,本次我们将把Callable运用到线程池(点我跳转)中。 拷贝 用你的IDE新建一个项目或类,并将类命名为TestThreadPool,然后将下面的代码替换到类中: import java.util.ArrayList; import java.util.List; import java.util.concurrent.*; public class TestThreadPool { ExecutorService executorService = Executors.newFixedThreadPool(2); public static void main(String[] args) { //实例化类 TestThreadPool testThr....

A

© 2020 贼拉正经的技术博客

Powered by 菠萝博客 Bolo
Theme bolo-sakura by Mashiro
浏览 134869 文章 40 评论 118

GitHub: AdlerED
WeChat: 1101635162

京ICP备18063791号
  

www.stackoverflow.wiki-MySSL安全签章

主题 | Theme