前言

最近想随机生成一串包含数字和字母的字符串.但是我发现把int类型的数字通过强制类型转换为char类型字符的时候出现了乱码.

原因

字符'0'ASCII编码值是48,如果直接通过类似如下的强制类型转换:

1
char ch=(int) 0;

得到的字符不是'0',而是其他字符。

数字0到9转为’0’到’9’字符的正确做法

先计算出正确的ASCII码在转为字符

使用自动类型转换进行计算

在char类型和int类型进行计算时,会自动把char类型转为int类型,所以可以先把字符'0'数字进行计算得到正确的ASCII编码值,然后再强制类型转为字符.如下所示:

1
2
int i=2;
char c = (char)('0' + i);

直接计算

当然换成如下写法也是可以的.

1
2
int i=2;
char c = (char)(48 + i);

Character.forDigit(数字,进制)方法进行转换

1
2
int i=2;
char c = Character.forDigit(i,10);

快捷键支持

安装Markdown All in One插件,该插件提供了快捷键支持.

加粗

Ctrl+B

切换代办列表

Alt+C

格式化表格

Alt+Shitf+F

快捷键表格

快捷键 功能
Ctrl + B 切换粗体
Ctrl + I 切换斜体
Ctrl + Shift + ] 提升标题
Ctrl + Shift + [ 降低标题
Ctrl + M 切换公式
Alt + C 勾选或者取消勾选任务列表
Ctrl + Shift + V 切换预览
Ctrl + K V 将预览切换到侧边

小结

快捷键支持并不完全.还是算了.

问题描述

今天在idea中导入一个项目的时候出现了乱码,乱码的原因时因为这个项目的编码是GBK,但是我设置idea的编码为UTF-8
我知道怎么在idea把一个文件从gbk转为utf-8.但是我还不知道怎么快速把转换整个项目得我编码。
倒是可以手动一个文件一个文件的该,但是我懒得手动改.所以我决定写个程序来实现。

需求分析

  • 可以转换一个文件的编码
  • 可以转换整个目录(项目)的编码

实现思路

  • 通过IO流以一种编码方式从源文件中读入,然后以另一种编码写到临时文件中.
  • 然后删除源文件,把临时文件重命名为源文件即可。

编码实现

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
package args.java.file;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;

/**
* 项目编码转换器,可以把一个目录下的所有文件从一个编码(如GBK)转换成另一个编码(如UTF-8).<br>
*/
public class ConvertProjectEncode
{
/**
* 转换整个目录的编码.
* @param dirFile 目录对应的File对象.
* @param fromCharset 原来的文件编码.
* @param toCharset 要转成的编码.
*/
public static void convertDirEncode(File dirFile, String fromCharset,
String toCharset)
{
File[] dirFileList = dirFile.listFiles();
// 遍历整个目录列表
for (int i = 0; i < dirFileList.length; i++)
{
// 如果是目录
if (dirFileList[i].isDirectory())
{
// 递归处理下一级目录
convertDirEncode(dirFileList[i], fromCharset, toCharset);
}
// 如果是文件
else if (dirFileList[i].isFile())
{
// 转换文件的编码
convertFileEncode(dirFileList[i], fromCharset, toCharset);
}
}
}

/**
* 转换一个文件的编码.
* @param file
* @param fromCharset
* @param toCharset
*/
public static void convertFileEncode(File file, String fromCharset,
String toCharset)
{
// 生成临时文件
File tempFile = createTempFile(file);
// 把源文件复制到临时文件
copyToTempFileByNewEncode(file, fromCharset, tempFile, toCharset);
// 删除源文件,并把临时文件重名为源文件
if (file.delete() && tempFile.renameTo(file))
{
System.out.println("文件:" + file + "由 " + fromCharset + " 转为 "
+ toCharset + " 成功!");
}
}

/**
* 从源文件以fromCharset编码读取,以toCharset编码写入临时文件.
* @param file
* @param fromCharset
* @param toCharset
* @param tempFile
*/
public static void copyToTempFileByNewEncode(File file, String fromCharset,
File tempFile, String toCharset)
{
char[] cbuf = new char[1024];
// 读入文件缓存
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(new FileInputStream(file), fromCharset));

BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(new FileOutputStream(tempFile),
toCharset));)
{

int size = -1;
// 从源文件中读出
while ((size = reader.read(cbuf)) != -1)
{
// 写入临时文件
writer.write(cbuf, 0, size);
}

} catch (UnsupportedEncodingException e)
{
e.printStackTrace();
} catch (FileNotFoundException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
}
/**
* 创建一个文件的副本.
* @param file
*/
private static File createTempFile(File file)
{
// 源文件名
String fileName = file.getName();
// 临时文件名
int lastIndexOfDot = fileName.lastIndexOf(".");
String tempFileName = fileName.substring(0, lastIndexOfDot) + "_Temp"
+ fileName.substring(lastIndexOfDot);
File tempFile = new File(file.getParent(), tempFileName);
return tempFile;
}
/**
* 把gbk编码的目录或者文件转换为utf-8编码的.
* @param file
*/
public static void gbkToUtf8(File file)
{
if (file.isDirectory())
{
convertDirEncode(file, "gbk", "utf-8");
} else if (file.isFile())
{
convertFileEncode(file, "gbk", "utf-8");
}
}
/**
* 把utf-8编码的目录或者文件转换为gbk编码的.
* @param file
*/
public static void utf8ToGbk(File file)
{
if (file.isDirectory())
{
convertDirEncode(file, "utf-8", "gbk");
} else if (file.isFile())
{
convertFileEncode(file, "utf-8", "gbk");
}
}
public static void main(String[] args)
{
File file = new File("G:\\Desktop\\测试编码转换\\");
// gbkToUtf8(file);
utf8ToGbk(file);
}

}

原文链接

https://blog.csdn.net/shahuhu000/article/details/83965642#commentBox

问题描述

最近发现使用git clone的速度比较慢,于是找到了办法分享给大家:

分析原因

git clone特别慢是因为github.global.ssl.fastly.net域名被限制了。只要找到这个域名对应的ip地址,然后在hosts文件中加上ip 域名的映射,刷新DNS缓存便可。

解决方案

查找域名对应IP地址

在网站https://www.ipaddress.com/分别搜索:

1
2
github.global.ssl.fastly.net
github.com

得到域名对应的IP地址如下:

Name Type Data
github.global.ssl.fastly.net A 151.101.185.194
Name Type Data
github.com A 192.30.253.112
github.com A 192.30.253.113

添加IP和域名到hosts文件

打开hosts文件:

  • Windows上的hosts文件路径在C:\Windows\System32\drivers\etc\hosts
  • Linux上的hosts文件路径在:sudo vim /etc/hosts

hosts文件末尾添加IP地址和对应的域名,以空格隔开,如下所示:

1
2
192.30.253.112 github.com
151.101.185.194 github.global.ssl.fastly.net

保存更新DNS

  • Winodws上的做法:打开CMD,输入ipconfig /flushdns
  • Linux上的做法:在终端输入sudo /etc/init.d/networking restart

测试git clone

github.com有两个IP地址:192.30.253.112192.30.253.113,哪个快就用哪个,我这里测试得到192.30.253.112稍微快点.

idea 2019.2导出可执行Jar

项目结构

实例项目结构如下,现在我想导出module01中的Test类.
这里有一张图片

导出可执行jar步骤

导出可执行jar需要的设置

打开Project Structure

依次点击File->Project Structure打开Project Structure对话框:
这里有一张图片
这里有一张图片

打开Create jar from modules对话框

然后依次点击:Artifacts->加号->JAR->From modules with dependencies...打开Create jar from modules对话框
这里有一张图片

选择模块 选择主类

  1. Module选择框中选择要导出的模块,
  2. Main Class选择框中选择要主类.
  3. 其他的默认,然后点击OK即可.
    这里有一张图片
  4. 继续点击OK:
    这里有一张图片

这时候会在模块根目录下生成一个MANIFEST.ME文件,如下所示:
这里有一张图片

生成可执行Jar

点击Build->Build artifacts...
这里有一张图片
然后在弹出的对话框中选择Build:
这里有一张图片

运行可执行jar

最后会在out目录下的artifacts目录下生成jar文件,如下所示:
这里有一张图片
打开jar文件所在的目录,然后在该目录下打开cmd,使用java -jar xxxx.jar命令运行该jar包:
这里有一张图片
运行效果如下所示:
这里有一张图片

idea快捷键

idea向上/向下插入空行

注意下面的快捷不是默认的快捷键,我已经修改过了,所以我给出了快捷键对应的功能的英文名称,可以根据功能名查找对应的快捷键,然后自己修改即可.

功能 描述 快捷
Start New Line Before Current 向上插入空行 ctrl+alt+enter
Start New Line 向下插入空行 shift+enter
Reformat Code 格式化代码 Ctrl+Alt+L
Duplicate Entire Lines 复制向下复制一行代码 Ctrl+向下箭头
Move Line Up 移动代码到上一行 alt+向上箭头
Move Line down 移动代码到下一行 alt+向下箭头
Expand 展开代码 ctrl+加号
Collapse 折叠代码 ctrl+减号
Select Opposite Diff Pane 向前切换窗口 ctrl+tab,如果打开了多个代码可以通过,通过上下箭头选择
Select Position In Opposite Diff Pane 向后切换窗口 shift+ctrl+tab

idea中使用eclipse快捷键

功能 描述 快捷键
Delete Line 删除一行 ctrl+d

批处理 命令返回值

批处理命令的返回值会保存在errorlevel变量中。一般而言:

  • 如果命令执行成功,则返回0
  • 如果命令执行失败,则返回1

批处理 延时命令

前言

因为我偶尔要在浏览器上看些视频,而播放视频有时候需要Flash,但是要命的是Flash带广告插件,经过我的排查,我发现广告是FlashHelperService.exe这个服务造成的,可以通过如下命令杀死这个进程:

1
taskkill /im FlashHelperService.exe /f

但是还是没有用,因为不知道什么时候FlashHelperService.exe这个服务又会偷偷运行,我需要反复杀进程,一两次还可以,多了真是烦躁.
于是我想着写个批处理脚本来定时杀进程

timeout命令

timeout是延时等待命令,该命令帮助文档如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
timeout [/t] timeout [/nobreak] 
描述:
这个工具接受超时参数,等候一段指定的时间(秒)或等按任意键。它还接受
一个参数,忽视按键。
参数列表:
/t timeout 指定等候的秒数。有效范围从 -199999 秒。
/nobreak 忽略按键并等待指定的时间。
/? 显示此帮助消息。
注意: 超时值 -1 表示无限期地等待按键。
示例:
timeout /?
timeout /t 10
timeout /t 300 /nobreak
timeout /t -1

从帮助文档可以看出:timeout /t 10就是延迟10秒的意思.

定时杀死进程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@echo off
:again
:: 查找FlashHelperService.exe这个进程
tasklist | findstr /i FlashHelperService.exe
:: 如果返回值大于或者等于1
IF ERRORLEVEL 1 (
:: 返回值大于0表示上述命令失败,也就是找不到FlashHelperService.exe这个进程
echo ERRORLEVEL=%errorlevel%,找不到FlashHelperService.exe进程
) ELSE (
:: 返回值为0表示上述命令成功,也就是找到FlashHelperService.exe这个进程
echo ERRORLEVEL=%errorlevel%,找到FlashHelperService.exe进程
echo 杀死这个该死的进程.%date%%time%>>杀死FlashHelp日志.txt
:: 打开日志,让我知道
notepad 杀死FlashHelp日志.txt
taskkill /im FlashHelperService.exe /f
)
:sleep
:: 延时60*15=5400秒,也就是15分钟运行一次.
timeout /t 5400
:: 清屏
cls
:: 循环继续开始
goto again

使用VSCode快速打开一个给定的文件

创建一个.bat文件,粘贴如下命令,然后配置该文件所在的目录添加到path环境变量中.然后启动运行框(Win+R),输入该赔处理文件名称即可运行该批处理文件.

1
2
3
4
5
6
:: 关闭回显
@echo off
:: 输入文件路径
set /P input="输入要打开的文件的路径:"
:: 使用vscode打开该文件
start F:\Program" "Files\Microsoft" "VS" "Code\Microsoft" "VS" "Code\Code.exe "%input%"

最后一行代码是关键代码,注意路径之间如果有空格则要用双引号包裹起来.

VSCode 运行Java

安装插件

依次点击查看,扩展,然后在搜索框中输入Java Extension Pack,然后安装这个插件,安装完毕后重启VSCode.

设置允许参数

打开要运行的java文件.然后点击查看,调试,点击添加配置,然后选择环境为Java,这个时候会生成一个launch.json的文件,如下所示:

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
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "java",
"name": "Debug (Launch)-CollectionEach",
"request": "launch",
"cwd": "${workspaceFolder}",
"console": "internalConsole",
"stopOnEntry": false,
"mainClass": "CollectionEach",
"args": ""
},
{
"type": "java",
"name": "Debug (Launch)-ForeachTest",
"request": "launch",
"cwd": "${workspaceFolder}",
"console": "internalConsole",
"stopOnEntry": false,
"mainClass": "ForeachTest",
"args": ""
},
{
"type": "java",
"name": "Debug (Launch)-IntStreamTest",
"request": "launch",
"cwd": "${workspaceFolder}",
"console": "internalConsole",
"stopOnEntry": false,
"mainClass": "IntStreamTest",
"args": ""
},
{
"type": "java",
"name": "Debug (Attach)",
"request": "attach",
"hostName": "localhost",
"port": 0
}
]
}

其中每一项配置对应一个java文件.例如,CollectionEach.java对应的配置如下:

1
2
3
4
5
6
7
8
9
10
{
"type": "java",
"name": "Debug (Launch)-CollectionEach",
"request": "launch",
"cwd": "${workspaceFolder}",
"console": "internalConsole",
"stopOnEntry": false,
"mainClass": "CollectionEach",
"args": ""
},
  • 其中mainClass表示main方法所在的类名.
  • args表示命令行参数.
  • 其他配置我还不懂,先这样.

开始调试

调试各项功能,如下图所示:
这里有一张图片