Java基础知识三

标签: Java 分类: Java 创建时间:2020-07-06 09:48:52 更新时间:2024-11-15 10:49:43

1.验证url合法性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static boolean isValidUrl(String urlString){
URI uri = null;
try {
uri = new URI(urlString);
} catch (URISyntaxException e) {
e.printStackTrace();
return false;
}

if(uri.getHost() == null){
return false;
}
if(uri.getScheme().equalsIgnoreCase("http") || uri.getScheme().equalsIgnoreCase("https")){
return true;
}
return false;
}
参考文章:
1.如何检查URL的合法性? (我是用了这篇文章的代码)
2.用Java判断一个URL是否有效的两种方法
3.判断一个url是否合法 (这个使用了正则表达式的方式)

2.java解析url

java解析url中的参数,无外乎哪几种方法,但是还是挺有用的。谷歌提供了一个工具Guava,里面就有一个

3.Lambda表达式

例如
(1) 表达式: person -> person.getAge();可以替换成 Person::getAge

(2) 表达式: () -> new HashMap<>();可以替换成 HashMap::new

参考文章:
1.Java8中的[方法引用]“双冒号”——走进Java Lambda(四)
2.Lambda表达式将数组/ String列表转换为数组/整数列表 (使用Lambda表达式将String类型的List转为Integer类型的list,这篇文章还有其他的一些方法,值得借鉴)

4.list去重

1
2
// 使用stream的distinct方法实现去重,但是需要对象实现hashcode equals 方法
list.stream().distinct()
参考文章:
1.Java List去重的6种方法
2.List对象去重的几种方法
3.Lombok 的 @EqualsAndHashCode(callSuper = false) 的使用 (使用自动生成的eauals方法,无法实现去重的功能)
4.Java List去掉重复对象-java8 (讲了三种方法,其中一种是根据对象的属性进行去重)
5.Java 8 Stream.distinct() 列表去重示例
6.浅谈Java中的hashcode方法 (讲了为什么在重写equals方法的同时,必须重写hashCode方法)

5.重复读取InputStream

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
public class StreamOperateUtil {
public static void main(String[] args) throws FileNotFoundException {

InputStream input = new FileInputStream("c:\\test.txt");
//InputStream input = httpconn.getInputStream(); //这里可以写你获取到的流

ByteArrayOutputStream baos = cloneInputStream(input);

// 打开两个新的输入流
InputStream stream1 = new ByteArrayInputStream(baos.toByteArray());
InputStream stream2 = new ByteArrayInputStream(baos.toByteArray());

}

private static ByteArrayOutputStream cloneInputStream(InputStream input) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = input.read(buffer)) > -1) {
baos.write(buffer, 0, len);
}
baos.flush();
return baos;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}

}
参考文章:
1.Java实现inputstream流的复制 代码从这里拷过来的
2.ByteArrayOutputStream或ByteArrayInputStream不需要关闭流原因分析 ByteArrayOutputStream或ByteArrayInputStream是内存读写流,不同于指向硬盘的流,它内部是使用字节数组读内存的,这个字节数组是它的成员变量,当这个数组不再使用变成垃圾的时候,Java的垃圾回收机制会将它回收。所以不需要关流。
3.InputStreamReader和BufferedReader用法及真实案例
4.重复读取InputStream的方法 在InputStream读取的时候,会有一个pos指针,他指示每次读取之后下一次要读取的起始位置,当读到最后一个字符的时候,pos指针不会重置。
5.InputStream重新读取 rest方法也是可以用的,但只能在BufferedInputStream中使用,并且还要搭配mark使用,bis.mark(is.available()+1)
6.BufferedReader读取文件以后,怎么将文件指针移到文件开头 也是使用了 reader.mark((int)file.length());

5.文件预览

刚好需要获取 阿里云存储中的 oss 进行图片预览,于是有了这个记录。

参考文章:
1.JAVA读取文件流,设置浏览器下载或直接预览 这里正好也是使用的oss进行的操作。

6.base64文件操作

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
 /**
* 将定位点 base64 图片转存到 minio 上
*/
InputStream in = null;
String base64=pin.getDwtp();
try {
//截取base64头部,获取文件类型
String fileType = Base64FileTypeEnum.getFileType(base64.substring(0, base64.indexOf(",")));
//去掉头部,防止转换文件后打开显示文件损坏
String s = base64.substring(base64.indexOf(",")+1);
byte[] bytes = Base64.decode(s);
// 上传
in =new ByteArrayInputStream(bytes);
// 执行上传
String temp=MinioUtil.upload(in,"pin/"+uuid+"/定位图片"+fileType);
pin.setDwtp(temp);

// 写到文件中
byte[] b =Base64.decode(imgStr);
for (int i = 0; i < b.length; ++i) {
if (b[i] < 0) {// 调整异常数据
b[i] += 256;
}
}
// 生成jpeg图片
String imgFilePath = "D:\\tanbing2.jpg";// 新生成的图片
OutputStream out = new FileOutputStream(imgFilePath);
out.write(b);
out.flush();
out.close();

} catch (Exception e) {
log.error("定位点图片转换失败", e);
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
参考文章:
【1】.byte数组和File,InputStream互转
【2】.java base64对各种文件进行编码、解码,通过ByteArrayInputStream和ByteArrayOutputStream方式实现
【3】.解决jdk版本不兼容导致的Base64加密问题java.lang.NoClassDefFoundError: sun/misc/BASE64Encoder 这里倒是用了 commons-codec 依赖代替了 sun.misc.BASE64Decoder
【4】.base64转file文件 这里用的是 sun.misc.BASE64Decoder,但是这里有一个地方有了 Base64FileTypeEnum
【5】.java使用hutool工具类实现base64字符串image的压缩 进行了图片的压缩
【6】.java:base64字符串转换成图片 用了 sun.misc.BASE64Decoder 。
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。