旧版本的navicat无法连接mysql8.0

问题描述

最新安装了最新的MySQL8.0,但是使用navicat9.1无法连接,报错如下:

1
Client does not support authentication protocol requested by server; consider upgrading MySQL client

原因

应该是MySQL8.0的加密方式改变了,但是比较老版本的navicate没有来得及支持,因此需要将mysql设置为支持传统的那种密码加密。

解决方案

登入MySQL的命令行界面,然后输入:

1
2
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'you_password';
FLUSH PRIVILEGES;

修改上面的you_password为你数据库root用户的密码即可.

参考链接

https://blog.csdn.net/m_amazing/article/details/84313789

问题描述

今天使用如下的子查询时:

1
2
3
4
5
6
select dept_name,avg_salary
from ( select dept_name, avg(salary) as avg_salary
from instructor
group by dept_name
)
where avg_salary>42000;

报了:Every derived table must have its own alias这个错误

1
2
3
4
5
6
7
mysql> select dept_name,avg_salary
from ( select dept_name, avg(salary) as avg_salary
from instructor
group by dept_name
)
where avg_salary>42000;
1248 - Every derived table must have its own alias

解决方案

Every derived table must have its own alias翻译成中文就是:每个派生表都必须有自己的别名
所以给子查询取一个别名即可:

1
2
3
4
5
6
select dept_name,avg_salary
from ( select dept_name, avg(salary) as avg_salary
from instructor
group by dept_name
) as I
where avg_salary>42000;

这样就能正常执行了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> select dept_name,avg_salary
from ( select dept_name, avg(salary) as avg_salary
from instructor
group by dept_name
) as I
where avg_salary>42000;
+------------+--------------+
| dept_name | avg_salary |
+------------+--------------+
| Biology | 72000 |
| Comp. Sci. | 77333.333333 |
| Elec. Eng. | 80000 |
| Finance | 85000 |
| History | 61000 |
| Physics | 91000 |
+------------+--------------+
6 rows in set

cmd切换到 新版控制台 后没有显示文字怎么办

问题描述

今天从旧版控制台切换到新版控制台后,弹出的cmd是个黑框框,上面没有文字,好奇怪.

在这里插入图片描述

解决方案

在cmd窗体顶部右键,选择属性
在这里插入图片描述然后切换到终端选项卡,在终端颜色那一块,取消勾选使用单独的前景即可。

在这里插入图片描述这样就有文字了。
在这里插入图片描述

如何切换VScode里面的java版本

最近用VScode打开新版本的java代码,发现无法通过编译,这肯定是因为我用的旧版本的java

1. 电脑使用新版本的java

排查后发现是java版本不对,然后我把电脑上java版本切换为新版,然后发现,通过其他编译可以正常编译运行,但是VSCode里面就是无法编译运行,个人猜测VScode里面使用的还是旧版本的java,网上找了一通没有找到该怎么切换VScode里面的java版本.

2. 重装VScode里面的java环境

保证现在电脑里用的是新版本的java,然后卸载VScode里面的java环境(Java Extension Pack),然后重启VScode,再重新安装Java插件(Java Extension Pack),这个使用插件就会使用电脑里的新版本的java.

总结

这样做就是重装插件比较耗时,不过还算能用,有人知道怎么切换VScode里面的java版本的话教教我.

安装了多个java 如何切换java版本

问题描述

平常用的是java8,最近在学习java的新特性。这就需要从java8往更高的java版本切换。由于还在使用java8,测试完新特性后我需要再切换回java8.

如何切换

安装java的时候我们会配置JAVA_HOME这个环境变量.所有要切换java版本,只需要修改JAVA_HOME即可,在JAVA_HOME里面写上java8的安装目录,那就使用的是java8,JAVA_HOME里面写上java9的安装目录,则使用的是java9

解决方案

手动切换

手动修改,JAVA_HOME中的地址即可,这里不介绍。

在cmd中临时切换java版本

例如现在在cmd中,临时需要用到java9的jshell,可以输入如下命令进行设置:

1
set path=E:\java\java9\jdk-9\bin;%path%

其中:

1
E:\java\java9\jdk-9\bin

是jdk9的安装路径.

批处理实现

因为手动修改JAVA_HOME,太过繁琐,所以通过一个批处理程序来实现.

新增环境变量

新增JAVA_HOME_8,JAVA_HOME_9,JAVA_HOME_11分别写入java8,java9,java11的安装目录,这和配置JAVA_HOME一样.

批处理脚本

创建一个名为快捷方式的目录。

TJava.bat

在这个快捷方式目录下新建TJava.bat,写入如下命令:

1
2
3
@echo off
java -version
pause

运行这个批处理就可以看到当前用的是哪个java版本了.这里使用批处理是为了快速运行这个java -version命令,不用手动操作。

CJavaBat.bat

然后在快捷方式下,创建批处理脚本CJavaBat.bat,开头的Cchange的意思.

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
@echo off
@echo ------------------------------------------------
@echo 当前Java版本为:
call TJava.bat
@echo ------------------------------------------------
@echo 输入要使用的java版本对应的选项:
@echo 选项 含义
@echo 8 切换环境为JDK8
@echo 9 切换环境为JDK9
@echo 11 切换环境为JDK11
@echo ------------------------------------------------
set /P choose=请输入选择:
IF "%choose%" EQU "8" (
REM 修改JAVA_HOME环境变量为%JAVA_HOME_8%,
setx "JAVA_HOME" "%%JAVA_HOME_8%%" /m
echo 已经修改 "JAVA_HOME" 为 %%JAVA_HOME_8%%
) ELSE IF "%choose%" EQU "9" (
setx "JAVA_HOME" "%%JAVA_HOME_9%%" /m
echo 已经修改 "JAVA_HOME" 为 %%JAVA_HOME_9%%
REM setx "Path" "%cd%;%path%" /m
) ELSE IF "%choose%" EQU "11" (
setx "JAVA_HOME" "%%JAVA_HOME_11%%" /m
echo 已经修改 "JAVA_HOME" 为 %%JAVA_HOME_11%%
)
pause

上面程序中的setx命令就是用来修改环境变量的.语法格式为:setx 环境变量名 环境变量值 /msetx设置环境变量需要管理员权限,以管理员身份,运行上面的CJavaBat.bat就可以修改JAVA_HOME环境变量的内容,从而切换Java版本。

CJavaBat.bat设置管理员权限

创建CJavaBat.bat的快捷方式,然后将这个快捷方式重命名为CJava,注意一定要修改名字。
然后在快捷方式上面右键。选择属性,在快捷方式选项卡上,点击高级,然后勾选上用管理员身份运行
这样以后直接点击CJava这个快捷方式就可以以管理身份运行CJavaBat.bat这个批处理脚本了。
在这里插入图片描述在这里插入图片描述

配置CJava到Path环境变量

将这个快捷方式目录配置到Path环境变量中,这样系统会在这个目录下查找程序,

通过Win+R运行CJava

然后就可以按下Win+R来启动运行,结束输入CJava,即可启动程序。

CJava程序说明

CJava中输入选项:8,则切换到Java8,输入9,则切换到Java9,输入11则切换到java11,依次类推,可以拓展上面的程序,以支持切换更多的java版本。

CJava运行效果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
------------------------------------------------
当前Java版本为:
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
请按任意键继续. . .
------------------------------------------------
输入要使用的java版本对应的选项:
选项 含义
8 切换环境为JDK8
9 切换环境为JDK9
11 切换环境为JDK11
------------------------------------------------
请输入选择:11
成功: 指定的值已得到保存。
已经修改 "JAVA_HOME" 为 %JAVA_HOME_11%
请按任意键继续. . .

可以看到切换之前是Java8,切换后为Java11

查看是否切换成功

运行上面创建TJava.bat,查看运行效果:

1
2
3
4
java version "11.0.4" 2019-07-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.4+10-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.4+10-LTS, mixed mode)
请按任意键继续. . .

可以看到现在已经成功切换为Java11

解决 String concatenation as argument to ‘StringBuffer.append()’ call 警告

问题描述

最近带idea中老是收到下面这个警告:

1
Warning:(20, 16) String concatenation as argument to 'StringBuffer.append()' call

出现警告的代码:

1
sb.append("<property name=\"" + group1 + "\" value=\"${" + group1+ "}\"/>\r\n");

分析原因

其实这个提示是表示方法使用不恰当,因为StringBuffer对象的append方法目的就是做对象拼接用的,里面再通过”+“来拼接就不得当,这是编译器对Java的代码规范。

解决方案

1. 全部使用append方法

替换+号为).append(

因为append方法的返回值还是StringBuffer,所以可以链式调用,我们可以通过链式调用来替换掉里面的加号。
也就是,将:

1
sb.append("<property name=\"" + group1 + "\" value=\"${" + group1+ "}\"/>\r\n");

替换成:

1
sb.append("<property name=\"").append(group1).append("\" value=\"${").append(group1).append("}\"/>\r\n");

使用IDE的查找替换功能进行替换

当然,手动替换可能有些繁琐,需要使用查找替换功能,

  1. 查找:+
  2. 替换为:).append(即可。

写代码实现替换

核心代码如下:

1
2
3
4
5
6
7
8
9
/**
* 把StringBuffer或StringBuilder中的字符串连接符<code>+</code>替换append()方法
*
* @return 替换后的字符串.
*/
public String StringConnectorToAppend(String stringBufferAppendCode) {
String returnValue = "// " + stringBufferAppendCode + "\n";
return returnValue + stringBufferAppendCode.replaceAll("\\s*\\+\\s*", ").append(");
}

2. 忽略

这个不替换也能运行,而且替换后代码长度变长了,不好阅读,可以选择忽略.

idea Shift+Alt+I快捷键是弹出TouchPad Driver Diagnostics的问题

原因

Shift+Alt+LSynaptics(新思)触摸板驱动中用于触摸板测试的快捷键

解决方案:禁用触控板

以管理员身份运行cmd,输入如下命令:

1
reg add HKEY_LoCAL_MACHINE\sYsTEM\CurrentControlset\services\synTP\Parameters\Debug /v DumpKernel /d 00000000 /t REG_DwoRD /f

重启电脑后生效

运行后,不会立即生效,需要重启电脑才会生效.

解决 命令行程序 中文英文不对齐的情况

问题描述

我用java写了个命令行的工具程序,在程序中我会输出一些提示语句,这些输出语句中有中文,但是奇怪的是中文老是对不齐,强迫症的我看起来很不舒服.
这里有一张图片

原因

之所以加入空格后中文无法对齐,是因为你用的是半角空格,全角空格的宽度小于一个中文的宽度.又大于中文宽度的一半,所以使用半角空格永远也无法让中文对齐。

使用全角空格来对齐中文

换成全角的空格就可以,全角的空格占用的宽度和和一个中文占的宽度一样,所以加上全角空格后就可以让中文对齐!

如何输入全角空格

这个就要看具体的输入法了,我用的是搜狗输入法,下面介绍搜狗输入法如何切换全角半角:

  1. 先切换到中文状态,然后随便输入点拼音,这时候弹出工具条,
  2. 在弹出的工具条上右键,
  3. 然后点击上面的全半角切换即可:

这里有一张图片

效果

然后输入全角空格就行了,这样中文就对齐了:
这里有一张图片
这样打包成可执行程序,在cmd中运行也是对齐的:
这里有一张图片

ProcessBuilder API整理

内部类

方法 描述
static class ProcessBuilder.Redirect 表示子进程的输入源或者输出的目的

构造器

方法 描述
ProcessBuilder​(String... command) 使用操作系统程序 和参数创建一个进程生成器
ProcessBuilder​(List<String> command) 使用操作系统程序和参数创建一个进程生成器

方法

取出或设置程序和参数的方法

方法 描述
List<String> command() 返回操作系统程序和该程序的参数。
ProcessBuilder command(List<String> command) 设置这个进程生成器的 操作系统程序 和 参数。
ProcessBuilder command(String... command) 置这个进程生成器的 操作系统程序 和 参数。

取出或设置工作目录的方法

方法 描述
File directory() 返回此进程生成器的工作目录。
ProcessBuilder directory(File directory) 设置进程生成器的工作目录。

设置标准IO的方法

方法 描述
ProcessBuilder redirectOutput(File file) 使用文件作为标准输出
ProcessBuilder redirectOutput(ProcessBuilder.Redirect destination) 使用Redirect对象作为标准输出
ProcessBuilder redirectInput(File file) 重定向标准输入到文件中
ProcessBuilder redirectInput(ProcessBuilder.Redirect source) 重定向标准输入
ProcessBuilder redirectError(File file) 将标出错误输出设置到文件中
ProcessBuilder redirectError(ProcessBuilder.Redirect destination) 设置标准错误输出的目标

取出标准IO的方法

方法 描述
ProcessBuilder.Redirect redirectInput() 返回表示标准输入的Redirect实例
ProcessBuilder.Redirect redirectError() 返回表示标准错误输出的Redirect实例
ProcessBuilder.Redirect redirectOutput() 返回表示标出输出的目标的Redirect实例

合并标准输出相关的方法

方法 描述
ProcessBuilder inheritIO() 子进程和父进程使用相同的标准输入,标准输出,标准错误输出
ProcessBuilder redirectErrorStream(boolean redirectErrorStream) 设置redirectErrorStream属性
boolean redirectErrorStream() 判断进程生成器是否合并了标准错误输出和标准输出。

其他方法

方法 描述
Map<String,String> environment() 返回保存进程生成器的环境变量的Map集合

启动进程方法

方法 描述
Process start() 使用进程生成器中设置的属性启动新一个新的进程

Process类API整理

杀死子进程

方法 描述
abstract void destroy() 杀死子流程
Process destroyForcibly() 杀死子流程

获取子进程的IO

方法 描述
abstract InputStream getErrorStream() 返回连接到子进程的错误输出的输入流
abstract InputStream getInputStream() 返回连接到子进程的正常输出的输入流.
abstract OutputStream getOutputStream() 返回连接到子进程的正常输入的输出流

其他方法

方法 描述
abstract int exitValue() 返回子进程的退出值
boolean isAlive() 测试子流程是否有效

等待子进程

方法 描述
abstract int waitFor() 使当前线程等待Process对象表示的进程终止
boolean waitFor(long timeout, TimeUnit unit) 使当前线程在必要时等待,直到此Process对象代表的子进程终止或经过指定的等待时间为止。

实例