首页
留言
关于
友链
更多
足迹
Search
1
SpringMVC+Spring+MyBatis整合完整版Web实例(附数据)
2,914 阅读
2
关于在Flutter实现Google地图的方法
1,888 阅读
3
druid报异常 “sql injection violation, part alway true condition not allow”的解决方案
1,381 阅读
4
git删除remote
1,347 阅读
5
MyBatis的TooManyResultsException异常的解决办法
1,151 阅读
发现
技术
生活
户外
登录
Search
标签搜索
Git
JavaScript
Flutter
Oracle
Git学习
Java
MySQL
SQL Server
秦岭户外
IntelliJ IDEA
Spring Boot
Flutter 2.0
对称加密算法
Google地图
Maven
ES6
linux
Tomcat
Redis
Spring
Bai Keyang
累计撰写
288
篇文章
累计收到
277
条评论
首页
栏目
发现
技术
生活
户外
页面
留言
关于
友链
足迹
搜索到
288
篇与
Karry Bai
的结果
2023-03-02
子午峪环穿白石峪
2022年7月3日从子午峪保护站步行进入峪口,从登山口攀爬,环形穿越至白石峪严福寺完成本次行程。路线比较成熟,前段路程拔高稍大,需要注意总里程10.96km全程耗时:06:29:28最高海拔:1205m累计爬升:795m{bilibili bvid="BV1x84y1E7RU" page=""/}
2023年03月02日
31 阅读
0 评论
0 点赞
2023-03-02
冬季G312蓝田段自驾游
冬季G312蓝田段自驾游冬季自驾G312蓝田段,赏冬季美景从S107关中环线进入G312蓝田段,沿途风景一角{bilibili bvid="BV1Ys4y1f7PV" page=""/}
2023年03月02日
43 阅读
0 评论
0 点赞
2023-03-01
你好,2023-终南山·南五台
{mtitle title="周末闲游终南山南五台"/}南五台位于西安南长安区境内约30公里的秦岭北麓,海拔1688米,为秦岭终南山中段的一个支脉,因山上有清凉、文殊、舍身、灵应、观音五个台,也就是山上的五个小峰(即五个山峰),故名五台山;且与西安北部耀县的五台山(药王山)以南而得名。{bilibili bvid="BV1fx4y137zj" page=""/}
2023年03月01日
35 阅读
0 评论
0 点赞
2023-02-22
[Flutter]Dart 运算符 / 与 ~/ 的区别
Dart 运算符 / 与 ~/ 的区别:运算符/:除,返回值为double类型;运算符 ~/:整除,返回值为int类型。int a1 = 6; int a2 = 4; print('除: ' + (a1/a2).toString()); print('整除:' + (a1~/a2).toString());
2023年02月22日
60 阅读
0 评论
0 点赞
2023-02-22
在Flutter中final和const的区别
首先在说这个问题之前,可以先看一段代码:main() { // 同时赋值已经确定好的值const和final是没有区别的 const con = '2020-09-01'; final nal = '2020-09-01'; // 赋予不确定的值const和final就不一样了 // const 在编译的时候值都必须是确定的 const _date = new DateTime.now(); //错误的, 会报错 // final是在运行的时候才赋值 final _date1 = new DateTime.now(); //正确的, 不会报错 }使用final修饰的变量必须进行初始化,一旦被赋值以后,不能被再次赋值,但是这个初始化的值在编译时是不确定的,只有在运行时,才能确定其值例如Flutter官方教程中,有这么一行代码:final wordPair = WordPair.random();const定义时,需要是个明确的值,修饰的变量它会在编译器以至于应用整个生命周期内都是不可变的常量,在内存中也只会创建一次,之后的每次调用都会复用第一次创建的对象。例如:每次调用都会复用第一次创建的对象。例如:main() { foo(); } foo() { const _city = "西安"; var list = const[1,2,3,4,5]; var point = const User("XiaoMing", 17); const num = 1+2; const time = DateTime.now();//错误用法 这样会报错 } class User { final String userName; final int age; const User(this.userName, this.age); }const导致的不可变特性是可以传递的。如果有一个final修饰的成员变量,这个成员变量包含了一个集合,那么这个集合仍然是可变的, 但是如果包含的是const修饰的集合,那么集合内所有东西都是递归不可变的。例如:main() { final list0 = [1,2,3]; list0[0] = 4; print(list0.toString());//打印[4,2,3] var list1 = const[1,2,3]; list1[0] = 4;//这里会报错 }扩展:static修饰符也能用来修饰变量, 被它修饰的成员变量,方法是属于类级别的, 并不属于对象。static变量直到运行期使用时才会进行实例化。
2023年02月22日
79 阅读
0 评论
0 点赞
2023-02-15
flutter配置Android状态栏透明
开发Flutter项目中,在Android平台下让状态栏透明,如下配置:import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; void main () { runApp(const MyApp()); /// 配置如下: /// Android状态栏透明 if (Platform.isAndroid) { SystemUiOverlayStyle systemUiOverlayStyle = const SystemUiOverlayStyle(statusBarColor: Colors.transparent); SystemChrome.setSystemUIOverlayStyle(systemUiOverlayStyle); } } class MyApp extends StatefulWidget { const MyApp({Key? key}) : super(key: key); @override MyAppState createState() => MyAppState(); } class MyAppState extends State<MyApp> with WidgetsBindingObserver { @override void initState() { super.initState(); } @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, home: Scaffold( backgroundColor: Colors.blueAccent, body: SafeArea( child: Column( children: [ Text("测试页面"), ], ), ), ), ); } }
2023年02月15日
88 阅读
0 评论
0 点赞
2023-02-06
解决Maven无法下载ojdbc驱动的问题
先去Oracle官网下载ojdbc的驱动jar。官网下载地址: http://www.oracle.com/technetwork/database/features/jdbc/index-091264.html特别提醒:1、下载ojdbc的时候需要账号,要先注册Oracle账号才能下载2、如果已经安装了Oracle数据库的,可以直接去Oracle的安装目录(Oracleapporacleproduct11.2.0serverjdbclib)获取在下载好的ojdbc的根目录打开终端执行命令:mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc7 -Dversion=12.1.0.2 -Dpackaging=jar -Dfile=ojdbc7.jar执行成功后如下:接下来我们在POM.xml中就可以使用了:<dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc7</artifactId> <version>12.1.0.2</version> </dependency>
2023年02月06日
43 阅读
0 评论
0 点赞
2023-02-06
Linux设置ll命令
在部分Linux系统中是没有ll命令的,对于习惯常常在Linux环境下使用ll命令的人来说即为不方便。要设置ll命令,只需简单的一行命令即可:alias ll='ls -la --color=auto'以上设置完成后即可使用ll。但是当终端重启后ll命令再次失效,因为以上设置的都是当前有效。如果要想一直保持,则需要在~/.bashrc中设置,在.bashrc的最后插入以上命令即可:编辑完成后保存文件。然后 退出终端 ,重新打开终端就可以使用ll命令了:特别提醒:编辑完成后,一定要关闭终端后重启启动终端才行。
2023年02月06日
181 阅读
0 评论
0 点赞
2022-12-28
使用keytool生成应用签名信息
在申请百度地图的AK时,需要 apk 对应的 SHA1 值如何利用Android Studio使用keytool生成签名信息呢?输入下面命令,回车会提示输入密码,密码输入 : androidkeytool -genkey -v -keystore debug.keystore -alias androiddebugkey -keyalg RSA -validity 10000整个步骤操作如下:cd .android ##调试版本使用指令 keytool -genkey -v -keystore debug.keystore -alias androiddebugkey -keyalg RSA -validity 10000 输入密钥库口令: 再次输入新口令: 您的名字与姓氏是什么? [Unknown]: bai 您的组织单位名称是什么? [Unknown]: kcis 您的组织名称是什么? [Unknown]: kcis 您所在的城市或区域名称是什么? [Unknown]: Xi'an 您所在的省/市/自治区名称是什么? [Unknown]: Shaanxi 该单位的双字母国家/地区代码是什么? [Unknown]: China CN=bai, OU=kcis, O=kcis, L=Xi'an, ST=Shaanxi, C=China是否正确? [否]: 是 正在为以下对象生成 2,048 位RSA密钥对和自签名证书 (SHA256withRSA) (有效期为 10,000 天): CN=bai, OU=kcis, O=kcis, L=Xi'an, ST=Shaanxi, C=China 输入 <androiddebugkey> 的密钥口令 (如果和密钥库口令相同, 按回车): 再次输入新口令: [正在存储debug.keystore] Warning: JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore debug.keystore -destkeystore debug.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。 到这里签名信息就生成完了。然后按照百度地图SDK集成文档输入一下指令即可:keytool -list -v -keystore debug.keystore 输入密钥库口令: 密钥库类型: jks 密钥库提供方: SUN 您的密钥库包含 1 个条目 别名: androiddebugkey 创建日期: 2022-12-28 条目类型: PrivateKeyEntry 证书链长度: 1 证书[1]: 所有者: CN=bai, OU=kcis, O=kcis, L=Xi'an, ST=Shaanxi, C=China 发布者: CN=bai, OU=kcis, O=kcis, L=Xi'an, ST=Shaanxi, C=China 序列号: 3f09329e 有效期为 Wed Dec 28 11:12:14 CST 2022 至 Sun May 15 11:12:14 CST 2050 证书指纹: MD5: 44:DE:98:C9:D8:6E:CD:EC:E1:1D:92:02:9E:C6:EB:A1 SHA1: 7E:24:3C:7E:A0:5C:A1:69:AA:D1:89:74:38:30:88:C8:CD:59:FF:BE SHA256: CC:90:23:5B:D1:DF:02:7C:5E:DD:F1:82:07:F3:24:7C:82:6E:16:1D:BF:90:FB:29:FB:3F:0A:5A:5E:7D:6B:A0 签名算法名称: SHA256withRSA 主体公共密钥算法: 2048 位 RSA 密钥 版本: 3 扩展: #1: ObjectId: 2.5.29.14 Criticality=false SubjectKeyIdentifier [ KeyIdentifier [ 0000: 7E C7 C6 EF 92 1F 2C F3 A7 0F E8 2E 0A FA F9 67 ......,........g 0010: 84 BB 3C C5 ..<. ] ] ******************************************* ******************************************* Warning: JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore debug.keystore -destkeystore debug.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。 这样我们就顺利得到申请百度地图AK所需要的签名数据啦
2022年12月28日
98 阅读
0 评论
0 点赞
2022-12-27
Java之IO流[复习]
Java IO知识体系详解知识体系Java IO-分类(传输,操作)知识体系IO框架之知识体系:首先了解下Java IO框架包含什么,同时推荐下如何学习IO框架Java IO-分类(传输,操作)IO理解分类 - 从传输方式上IO理解分类 - 从数据操作上IO理解分类 - 从传输方式上从数据传输方式或者说是运输方式角度看,可以将 IO 类分为:字节流字符流字节流和字符流的区别字节转字符InputStreamReader、OutputStreamWriter字节流和字符流的常用方法字节是个计算机看的,字符才是给人看的字节流字符流字节流和字符流的区别字节流读取单个字节,字符流读取单个字符(一个字符根据编码的不同,对应的字节也不同,如 UTF-8 编码是 3 个字节,中文编码是 2 个字节。)字节流用来处理二进制文件(比如图片、MP3、视频文件),字符流用来处理文本文件(可以看做是特殊的二进制文件,只不过经过了编码,便于人们阅读。)。简而言之,字节是个计算机看的,字符才是给人看的;字节流可以处理一切文件,而字符流只能处理文本。虽然 IO 类很多,但核心的就是 4 个抽象类:InputStream、OutputStream、Reader、Writer。 虽然 IO 类的方法也很多,但核心的也就 2 个:read 和 write。字节转字符InputStreamReader、OutputStreamWriter编码就是把字符转换为字节,而解码是把字节重新组合成字符。如果编码和解码过程使用不同的编码方式那么就出现了乱码。GBK 编码中,中文字符占 2 个字节,英文字符占 1 个字节;UTF-8 编码中,中文字符占 3 个字节,英文字符占 1 个字节;UTF-16be 编码中,中文字符和英文字符都占 2 个字节。UTF-16be 中的 be 指的是 Big Endian,也就是大端。相应地也有 UTF-16le,le 指的是 Little Endian,也就是小端。Java 使用双字节编码 UTF-16be,这不是指 Java 只支持这一种编码方式,而是说 char 这种类型使用 UTF-16be 进行编码。char 类型占 16 位,也就是两个字节,Java 使用这种双字节编码是为了让一个中文或者一个英文都能使用一个 char 来存储。字节流和字符流的常用方法InputStream 类int read():读取数据int read(byte b[], int off, int len):从第 off 位置开始读,读取 len 长度的字节,然后放入数组 b 中long skip(long n):跳过指定个数的字节int available():返回可读的字节数void close():关闭流,释放资源OutputStream 类void write(int b): 写入一个字节,虽然参数是一个 int 类型,但只有低 8 位才会写入,高 24 位会舍弃(这块后面再讲)void write(byte b[], int off, int len): 将数组 b 中的从 off 位置开始,长度为 len 的字节写入void flush(): 强制刷新,将缓冲区的数据写入void close():关闭流Reader 类int read():读取单个字符int read(char cbuf[], int off, int len):从第 off 位置开始读,读取 len 长度的字符,然后放入数组 b 中long skip(long n):跳过指定个数的字符int ready():是否可以读了void close():关闭流,释放资源Writer 类void write(int c): 写入一个字符void write( char cbuf[], int off, int len): 将数组 cbuf 中的从 off 位置开始,长度为 len 的字符写入void flush(): 强制刷新,将缓冲区的数据写入void close():关闭流理解了上面这些方法,基本上 IO 的灵魂也就全部掌握了。IO理解分类 - 从数据操作上你细想一下,IO IO,不就是输入输出(Input/Output)嘛;从数据来源或者说是操作对象角度看,IO 类可以分为:Input:将外部的数据读入内存,比如说把文件从硬盘读取到内存,从网络读取数据到内存等等Output:将内存中的数据写入到外部,比如说把数据从内存写入到文件,把数据从内存输出到网络等等。所有的程序,在执行的时候,都是在内存上进行的,一旦关机,内存中的数据就没了,那如果想要持久化,就需要把内存中的数据输出到外部,比如说文件。文件操作算是 IO 中最典型的操作了,也是最频繁的操作。那其实你可以换个角度来思考,比如说按照 IO 的操作对象来思考,IO 就可以分类为:文件、数组、管道、基本数据类型、缓冲、打印、对象序列化/反序列化,以及转换等。文件数组管道基本数据类型缓冲打印对象序列化/反序列化转换IO理解分类-数据操作上文件文件流也就是直接操作文件的流,可以细分为字节流(FileInputStream 和 FileOuputStream)和字符流(FileReader 和 FileWriter)。 FileInputStream 的例子:int b; FileInputStream fis1 = new FileInputStream("fis.txt"); // 循环读取 while ((b = fis1.read())!=-1) { System.out.println((char)b); } // 关闭资源 fis1.close();FileOutputStream 的例子:FileOutputStream fos = new FileOutputStream("fos.txt"); fos.write("沉默王二".getBytes()); fos.close();FileReader 的例子:int b = 0; FileReader fileReader = new FileReader("read.txt"); // 循环读取 while ((b = fileReader.read())!=-1) { // 自动提升类型提升为 int 类型,所以用 char 强转 System.out.println((char)b); } // 关闭流 fileReader.close();FileWriter 的例子:FileWriter fileWriter = new FileWriter("fw.txt"); char[] chars = "沉默王二".toCharArray(); fileWriter.write(chars, 0, chars.length); fileWriter.close();当掌握了文件的输入输出,其他的自然也就掌握了,都大差不差。数组通常来说,针对文件的读写操作,使用文件流配合缓冲流就够用了,但为了提升效率,频繁地读写文件并不是太好,那么就出现了数组流,有时候也称为内存流。ByteArrayInputStream 的例子:InputStream is =new BufferedInputStream( new ByteArrayInputStream( "沉默王二".getBytes(StandardCharsets.UTF_8))); //操作 byte[] flush =new byte[1024]; int len =0; while(-1!=(len=is.read(flush))){ System.out.println(new String(flush,0,len)); } //释放资源 is.close();ByteArrayOutputStream 的例子:ByteArrayOutputStream bos =new ByteArrayOutputStream(); byte[] info ="沉默王二".getBytes(); bos.write(info, 0, info.length); //获取数据 byte[] dest =bos.toByteArray(); //释放资源 bos.close();管道Java 中的管道和 Unix/Linux 中的管道不同,在 Unix/Linux 中,不同的进程之间可以通过管道来通信,但 Java 中,通信的双方必须在同一个进程中,也就是在同一个 JVM 中,管道为线程之间的通信提供了通信能力。一个线程通过 PipedOutputStream 写入的数据可以被另外一个线程通过相关联的 PipedInputStream 读取出来。final PipedOutputStream pipedOutputStream = new PipedOutputStream(); final PipedInputStream pipedInputStream = new PipedInputStream(pipedOutputStream); Thread thread1 = new Thread(new Runnable() { @Override public void run() { try { pipedOutputStream.write("沉默王二".getBytes(StandardCharsets.UTF_8)); pipedOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } }); Thread thread2 = new Thread(new Runnable() { @Override public void run() { try { byte[] flush =new byte[1024]; int len =0; while(-1!=(len=pipedInputStream.read(flush))){ System.out.println(new String(flush,0,len)); } pipedInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } }); thread1.start(); thread2.start();基本数据类型基本数据类型输入输出流是一个字节流,该流不仅可以读写字节和字符,还可以读写基本数据类型。DataInputStream 提供了一系列可以读基本数据类型的方法:DataInputStream dis = new DataInputStream(new FileInputStream("das.txt")) ; byte b = dis.readByte() ; short s = dis.readShort() ; int i = dis.readInt(); long l = dis.readLong() ; float f = dis.readFloat() ; double d = dis.readDouble() ; boolean bb = dis.readBoolean() ; char ch = dis.readChar() ;DataOutputStream 提供了一系列可以写基本数据类型的方法:DataOutputStream das = new DataOutputStream(new FileOutputStream("das.txt")); das.writeByte(10); das.writeShort(100); das.writeInt(1000); das.writeLong(10000L); das.writeFloat(12.34F); das.writeDouble(12.56); das.writeBoolean(true); das.writeChar('A');缓冲CPU 很快,它比内存快 100 倍,比磁盘快百万倍。那也就意味着,程序和内存交互会很快,和硬盘交互相对就很慢,这样就会导致性能问题。为了减少程序和硬盘的交互,提升程序的效率,就引入了缓冲流,也就是类名前缀带有 Buffer 的那些,比如说 BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter。缓冲流在内存中设置了一个缓冲区,只有缓冲区存储了足够多的带操作的数据后,才会和内存或者硬盘进行交互。简单来说,就是一次多读/写点,少读/写几次,这样程序的性能就会提高。打印恐怕 Java 程序员一生当中最常用的就是打印流了:System.out 其实返回的就是一个 PrintStream 对象,可以用来打印各式各样的对象。System.out.println("沉默王二是真的二!");PrintStream 最终输出的是字节数据,而 PrintWriter 则是扩展了 Writer 接口,所以它的 print()/println() 方法最终输出的是字符数据。使用上几乎和 PrintStream 一模一样。StringWriter buffer = new StringWriter(); try (PrintWriter pw = new PrintWriter(buffer)) { pw.println("沉默王二"); } System.out.println(buffer.toString());对象序列化/反序列化序列化本质上是将一个 Java 对象转成字节数组,然后可以将其保存到文件中,或者通过网络传输到远程。ByteArrayOutputStream buffer = new ByteArrayOutputStream(); try (ObjectOutputStream output = new ObjectOutputStream(buffer)) { output.writeUTF("沉默王二"); } System.out.println(Arrays.toString(buffer.toByteArray()));与其对应的,有序列化,就有反序列化,也就是再将字节数组转成 Java 对象的过程。try (ObjectInputStream input = new ObjectInputStream(new FileInputStream( new File("Person.txt")))) { String s = input.readUTF(); }. 转换 InputStreamReader 是从字节流到字符流的桥连接,它使用指定的字符集读取字节并将它们解码为字符。InputStreamReader isr = new InputStreamReader( new FileInputStream("demo.txt")); char []cha = new char[1024]; int len = isr.read(cha); System.out.println(new String(cha,0,len)); isr.close();OutputStreamWriter 将一个字符流的输出对象变为字节流的输出对象,是字符流通向字节流的桥梁。File f = new File("test.txt") ; Writer out = new OutputStreamWriter(new FileOutputStream(f)) ; // 字节流变为字符流 out.write("hello world!!") ; // 使用字符流输出 out.close() ;
2022年12月27日
85 阅读
0 评论
0 点赞
1
2
...
29