-
2021-03-05 13:18:15
1、首先看一下File中参数的集中形式
①//构造函数File(String pathname)
File f1 = new File("c:\\1.txt");
②//File(String parent,String child)
File f2 = new File("c:\\abc","2.txt");
③//File(File parent,String child)
File f3 =new File("c:"+File.separator+"abc");//separator 是跨平台分隔符
File f4 =new File(f3,"3.txt");
2、File f1 可以定义绝对路径,也可以定义相对路径
3、区分相对和绝对
①绝对路径:
a.带盘符,如E:/book.xml
b.以http开头,http://img.baidu.com/img/book.jpg
②相对路径:
a.带"/"开头,如/book.xml
b.不带"/"开头,如book.xml
4、相对和绝对的校验方式:
public String filter3(String param){
if(param!=null || param!=""){
if(":".equals(param.indexOf(1,2))){//是绝对路径
param = param.replaceAll("../", "").replaceAll("./", "");
String params [] = param.substring(2,param.length()).split("/");
String aa = "";
if(params.length>0){
for(int i=0;i
//正则表达式:/ * : < > ?
Pattern pattern = Pattern.compile("[\\s\\\\/:\\*\\?\\\"<>\\|]");
Matcher matcher = pattern.matcher(params[i]);
aa += matcher.replaceAll("") + "/" ;
}
}
param = param.substring(0,2) + aa ;
param = param.substring(0,param.length()-1);
}else if("http:".equals(param.toLowerCase().indexOf(0,5))){
param = param.replaceAll("../", "").replaceAll("./", "");
String params [] = param.substring(5,param.length()).split("/");
String aa = "";
if(params.length>0){
for(int i=0;i
//正则表达式:/ * : < > ?
Pattern pattern = Pattern.compile("[\\s\\\\/:\\*\\?\\\"<>\\|]");
Matcher matcher = pattern.matcher(params[i]);
aa += matcher.replaceAll("") + "/" ;
}
}
param = param.substring(0,5) + aa ;
param = param.substring(0,param.length()-1);
}else{//是相对路径
param = param.replaceAll(":", "");
String params [] = param.substring(5,param.length()).split("/");
String aa = "";
if(params.length>0){
for(int i=0;i
//正则表达式:/ * : < > ?
Pattern pattern = Pattern.compile("[\\s\\\\/:\\*\\?\\\"<>\\|]");
Matcher matcher = pattern.matcher(params[i]);
aa += matcher.replaceAll("") + "/" ;
}
}
param = param.substring(0,5) + aa ;
param = param.substring(0,param.length()-1);
}
}
return param;
}
更多相关内容 -
VS CODE中配置JAVA格式化细节
2021-03-11 13:52:48VS CODE版本:1.46由于VS CODE是使用“Language Support for Java(TM) by Red Hatredhat.java预览版”进行格式化的,所以需要在这个插件里设置格式。在“(用户名)\.vscode\extensions\redhat.java-0.62.0\formatters...VS CODE版本:1.46
由于VS CODE是使用“Language Support for Java(TM) by Red Hatredhat.java预览版”进行格式化的,所以需要在这个插件里设置格式。
在“(用户名)\.vscode\extensions\redhat.java-0.62.0\formatters\eclipse-formatter.xml”中可以设置格式化细节。
找到对应内容,设置即可。
如:
else新起一行:
花括号换行:
设置完毕后,需要让这个插件使用本xml进行格式化。
在用户设置中进行设置(如果已经打开工作区,也需要在工作区中设置)。
需要注意插件偷偷升级后,路径会发生变化。
(或在settings.json中设置,一样的)
"java.format.settings.url": "C:\\Users\\XXX\\.vscode\\extensions\\redhat.java-0.62.0\\formatters\\eclipse-formatter.xml"
然后就可以按照自己设置好的格式,去格式化java代码了。
如果遇到缓存有问题,导致智能提示不准确的问题,命令板(ctrl+shift+P)中,清理java的语言服务工作区即可(会提示后,重启vs code)。如下图:
-
java文件路径中的两个反斜杠“\\“是什么意思
2022-03-14 16:38:32 -
Java图形实现json格式化
2013-12-31 18:03:00类似于Json的在线解析。使用Java图形实现Json的本地格式化,是一个本地Json格式化的工具,提供源码下载。 -
Java字符串模板格式化汇总8法(附性能对比)
2019-12-19 09:27:38Java字符串模板格式化汇总8法(附性能对比) 结论: 1.循环中,不要用+进行字符串拼接,而用StringBuilder.append()方法 2.非循环中,字符串拼接使用+性能最高,其次是StringBuilder.append()方法 1. ++ ...Java字符串模板格式化汇总8法(附性能对比)
结论:
1. 循环中, 不要用+进行字符串拼接, 而用StringBuilder.append()方法
2. 非循环中, 字符串拼接使用+性能最高, 其次是StringBuilder.append()方法
1. ++
对于初学JAVA的蒙童,大约都会使用这招
@Test public void testAdd(){ Date now = new Date(); String yearMonth = DateUtil.toString(now, DatePattern.YEAR_AND_MONTH); String expressDeliveryType = "sf"; String fileName = DateUtil.toString(now, DatePattern.TIMESTAMP); String template = "/home/expressdelivery/" + yearMonth + "/" + expressDeliveryType + "/vipQuery_" + fileName + ".log"; System.out.println(template); }
输出 :
/home/expressdelivery/2017-07/sf/vipQuery_20170723042314.log
2. StringBuffer / StringBuilder
@Test public void testStringBuilder(){ Date now = new Date(); String yearMonth = DateUtil.toString(now, DatePattern.YEAR_AND_MONTH); String expressDeliveryType = "sf"; String fileName = DateUtil.toString(now, DatePattern.TIMESTAMP); StringBuilder sb = new StringBuilder(); sb.append("/home/expressdelivery/"); sb.append(yearMonth); sb.append("/"); sb.append(expressDeliveryType); sb.append("/vipQuery_"); sb.append(fileName); sb.append(".log"); String template = sb.toString(); System.out.println(template); }
输出 :
/home/expressdelivery/2017-07/sf/vipQuery_20170723042603.log
缺点:
-
代码太长了
3. StringUtil.format(String, Object…)
使用
com.feilong.core.lang.StringUtil.format(String, Object…)
内部封装了
String.format(String, Object)
@Test public void testStringFormat(){ Date now = new Date(); String yearMonth = DateUtil.toString(now, DatePattern.YEAR_AND_MONTH); String expressDeliveryType = "sf"; String fileName = DateUtil.toString(now, DatePattern.TIMESTAMP); String template = StringUtil.format("/home/expressdelivery/%s/%s/vipQuery_%s.log", yearMonth, expressDeliveryType, fileName); System.out.println(template); }
输出 :
/home/expressdelivery/2017-07/sf/vipQuery_20170723043153.log
4. MessageFormatUtil.format(String, Object…)
使用
com.feilong.core.text.MessageFormatUtil.format(String, Object…)
内部封装了
java.text.MessageFormat.format(String, Object…)
@Test public void testMessageFormat(){ Date now = new Date(); String yearMonth = DateUtil.toString(now, DatePattern.YEAR_AND_MONTH); String expressDeliveryType = "sf"; String fileName = DateUtil.toString(now, DatePattern.TIMESTAMP); String template = MessageFormatUtil .format("/home/expressdelivery/{0}/{1}/vipQuery_{2}.log", yearMonth, expressDeliveryType, fileName); System.out.println(template); }
输出 :
/home/expressdelivery/2017-07/sf/vipQuery_20170723043153.log
5. Slf4jUtil.format(String, Object…)
使用
com.feilong.tools.slf4j.Slf4jUtil.format(String, Object…)
借助 slf4j 日志占位符
@Test public void testSlf4jFormat(){ Date now = new Date(); String yearMonth = DateUtil.toString(now, DatePattern.YEAR_AND_MONTH); String expressDeliveryType = "sf"; String fileName = DateUtil.toString(now, DatePattern.TIMESTAMP); String template = Slf4jUtil.format("/home/expressdelivery/{}/{}/vipQuery_{}.log", yearMonth, expressDeliveryType, fileName); System.out.println(template); }
输出:
/home/expressdelivery/2017-07/sf/vipQuery_20170723144236.log
6. StringUtil.replace(CharSequence, Map<String, V>)
使用
com.feilong.core.lang.StringUtil.replace(CharSequence, Map<String, V>)
内部封装了 apache commons-lang3
org.apache.commons.lang3.text.StrSubstitutor
, 现在叫 commons-text使用给定的字符串 templateString 作为模板,解析匹配的变量 .
@Test public void testReplace(){ Date date = new Date(); Map<String, String> map = new HashMap<>(); map.put("yearMonth", DateUtil.toString(date, YEAR_AND_MONTH)); map.put("expressDeliveryType", "sf"); map.put("fileName", DateUtil.toString(date, TIMESTAMP)); String template = StringUtil.replace("/home/expressdelivery/${yearMonth}/${expressDeliveryType}/vipQuery_${fileName}.log", map); System.out.println(template); }
输出:
/home/expressdelivery/2017-07/sf/vipQuery_20170723144608.log
优点:
-
模块可以定义变量名字了,不怕混乱
Note
此方法只能替换字符串,而不能像el表达式一样使用对象属性之类的来替换 7. VelocityUtil.parseString(String, Map<String, ?>)
使用
com.feilong.tools.velocity.VelocityUtil.parseString(String, Map<String, ?>)
该方法需要 jar
<dependency> <groupId>com.feilong.platform.tools</groupId> <artifactId>feilong-tools-velocity</artifactId> <version>${version.feilong-platform}</version> </dependency>
@Test public void testVelocityParseString(){ Date date = new Date(); Map<String, String> map = new HashMap<>(); map.put("yearMonth", DateUtil.toString(date, YEAR_AND_MONTH)); map.put("expressDeliveryType", "sf"); map.put("fileName", DateUtil.toString(date, TIMESTAMP)); VelocityUtil velocityUtil = new VelocityUtil(); String template = velocityUtil .parseString("/home/expressdelivery/${yearMonth}/${expressDeliveryType}/vipQuery_${fileName}.log", map); System.out.println(template); }
输出
/home/expressdelivery/2017-07/sf/vipQuery_20170723145856.log
8. VelocityUtil.parseTemplateWithClasspathResourceLoader(String, Map<String, ?>)
使用
com.feilong.tools.velocity.VelocityUtil.parseTemplateWithClasspathResourceLoader(String, Map<String, ?>)
该方法需要 jar
<dependency> <groupId>com.feilong.platform.tools</groupId> <artifactId>feilong-tools-velocity</artifactId> <version>${version.feilong-platform}</version> </dependency>
该方法适合于 字符串模板独立成文件, 方便维护
路径是classpath 下面, 比如 velocity/path.vm
此时代码需要如此调用:
@Test public void testVelocityParseTemplateWithClasspathResourceLoader(){ Date date = new Date(); Map<String, String> map = new HashMap<>(); map.put("yearMonth", DateUtil.toString(date, YEAR_AND_MONTH)); map.put("expressDeliveryType", "sf"); map.put("fileName", DateUtil.toString(date, TIMESTAMP)); VelocityUtil velocityUtil = new VelocityUtil(); String template = velocityUtil.parseTemplateWithClasspathResourceLoader("velocity/path.vm", map); System.out.println(template); }
输出 :
/home/expressdelivery/2017-07/sf/vipQuery_20170723150443.log
9. 性能对比
上图是 分别循环 100000, 500000, 1000000, 2000000 统计出来的数据
在性能上 String format 是最差的
字符串 ++ 最快, StringBuilder 次之 , slf4j 的格式化再次之
测试硬件概览:
型号名称: MacBook Pro 处理器名称: Intel Core i5 处理器速度: 2.9 GHz 内存: 16 GB
10. 参考
-
commons-lang3 官方地址: http://commons.apache.org/proper/commons-lang/download_lang.cgi
转载:
Java字符串模板格式化汇总8法(附性能对比) - 飞天奔月的个人空间 - OSCHINA
https://my.oschina.net/venusdrogon/blog/1486633========================================================================
========================================================================
========================================================================
字符串连接你用+还是用StringBuilder - 掘金
https://juejin.im/post/5b2af17de51d4558c713507c#heading-2字符串连接你用+还是用StringBuilder
前言
据我所知字符串确实已经成为 Java 开发人员最常用的类了,而且是大量使用。我们都知道,String 其实是封装了字符,所以俩字符串连接就是将字符串对象里面的字符连起来。很多人习惯使用
+
来连接字符串,也有人会用 StringBuilder 的append
方法。"+"编译后
看看如果我们在程序中直接使用
+
来连接字符串的情况,用下面一个简单的例子来说明,进行两个字符串连接操作,即s3 = s1 + s2
。public class TestString { public static void main(String[] args) { String s1 = "www"; String s2 = "ccc"; String s3 = s1 + s2; } } 复制代码
接着
javap -c TestString.class
看一下编译后的情况,可以看到编译器其实是对+
进行了转换的,转成了 StringBuilder 对象来操作了,首先使用 s1 创建 StringBuilder 对象,然后用append
方法连接 s2,最后调用toString
方法完成。public class com.seaboat.string.TestString { public com.seaboat.string.TestString(); Code: 0: aload_0 1: invokespecial #8 // Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: ldc #16 // String www 2: astore_1 3: ldc #18 // String ccc 5: astore_2 6: new #20 // class java/lang/StringBuilder 9: dup 10: aload_1 11: invokestatic #22 // Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String; 14: invokespecial #28 // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V 17: aload_2 18: invokevirtual #31 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 21: invokevirtual #35 // Method java/lang/StringBuilder.toString:()Ljava/lang/String; 24: astore_3 25: return } 复制代码
"+"与"append"等价吗
前面可以看到
+
在编译器作用下都会转成 StringBuilder 的append
方法执行,所以如果抛开运行效率来说,它们其实本质是一样的。本质一样是否就能说明它们时等价的呢?或者说能否为了方便直接用
+
来连接字符串,剩下的事就交给编译器了?继续看个例子,在这个例子中有个 for 循环进行字符串连接操作。public class TestString2 { public static void main(String[] args) { String s = "www"; for (int i = 0; i < 10; i++) s += i; } } 复制代码
编译后的情况如下,不熟悉指令没关系,我们只看重要的部分,
if_icmplt 8
,这个就是 for 循环的条件判断,小于10则不断跳到8的位置,8后面其实就是创建 StringBuilder 对象,并以本地变量s的值初始化该对象,接着再将本地变量iappend
到 StringBuilder 对象中,最后调用toString
方法将所得值存到本地变量s。这样来看循环中每次都要创建 StringBuilder 对象,而且要调用
toString
方法,这样的执行效率显然比较低,而且增加了 GC 的压力。public class com.seaboat.string.TestString2 { public com.seaboat.string.TestString2(); Code: 0: aload_0 1: invokespecial #8 // Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: ldc #16 // String www 2: astore_1 3: iconst_0 4: istore_2 5: goto 30 8: new #18 // class java/lang/StringBuilder 11: dup 12: aload_1 13: invokestatic #20 // Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String; 16: invokespecial #26 // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V 19: iload_2 20: invokevirtual #29 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder; 23: invokevirtual #33 // Method java/lang/StringBuilder.toString:()Ljava/lang/String; 26: astore_1 27: iinc 2, 1 30: iload_2 31: bipush 10 33: if_icmplt 8 36: return } 复制代码
友好写法
把事情都丢给编译器是不友好的,为了能让程序执行更加高效,最好是我们自己来控制 StringBuilder 的实例,比如下面,只创建一个 StringBuilder 实例,后面用
append
方法连接字符串。public class TestString3 { public static void main(String[] args) { StringBuilder sb = new StringBuilder("www"); for (int i = 0; i < 10; i++) sb.append(i); } } 复制代码
编译后的情况如下,首先创建一个 StringBuilder 对象,使用字符串"www"来实例化该对象,接着循环调用
append
方法将本地变量i添加到 StringBuilder 对象中。public class com.seaboat.string.TestString3 { public com.seaboat.string.TestString3(); Code: 0: aload_0 1: invokespecial #8 // Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: new #16 // class java/lang/StringBuilder 3: dup 4: ldc #18 // String www 6: invokespecial #20 // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V 9: astore_1 10: iconst_0 11: istore_2 12: goto 24 15: aload_1 16: iload_2 17: invokevirtual #23 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder; 20: pop 21: iinc 2, 1 24: iload_2 25: bipush 10 27: if_icmplt 15 30: return } 复制代码
-
-
java 代码格式化
2015-10-25 21:02:11所以在阅读代码的时候,有一个统一的格式的话就好多了,下面介绍一下使用eclipse代码xml文件来达到格式化文件中的代码的例子,首先我们需要拥有一个统一的格式化代码的xml文件,该文件的地址我已经上传,可以下载: ... -
文件写入,项目相对路径,java反射,模板数据写入
2012-05-28 16:16:39格式化文件操作,将数据按照模板写入新文件,正则表达式替换模板指定内容,文件读写,stateprocess.java 项目运行文件 -
Java NIO文件路径管理:Path类和Paths类
2018-12-13 17:45:49本文章主要包括如下几个章节:类介绍、Path实例获取和文件路径管理。文件路径管理中,主要介绍了Path中定义的主要方法。 1、类的介绍 Path接口 是JDK1.7中定义的接口,主要用来在文件系统中定位文件,通常表示... -
java中的相对路径和绝对路径以及一些引申
2017-03-21 20:17:44java中的相对路径和绝对路径使用 -
IDEA 代码格式化,快捷键
2019-01-31 17:08:33一键格式化代碼: Ctrl+Alt+L 全局搜索替换:ctrl+shift+r 强大的搜索功能,shift+shift (无论您想要搜啥都能找到) ctrl+shift+R==搜索类 CTRL+N:按照类名搜索类 【常规】 Ctrl+Shift + Enter,语句完成 “!”,... -
Hadoop格式化namenode时候,出现Java异常:URI has an authority component问题的解决
2017-07-06 10:26:37将其改为具体的hadoop文件路径,想必这个大家也都知道,是在core-site.xml中配置的,默认的路径是在tmp文件夹下的,我们都会更改这个路径,很重要,也很基础的。 对于我的机器,改为 < property > < name >dfs... -
JavaScript前台页面使用jsjava对后台传过来的日期进行格式化
2016-08-11 12:14:49javascript日期格式化 -
iOS开发笔记之八十四——OC代码自动格式化的探究
2021-04-13 19:23:26所以想着是不是可以有一套自动化工具,可以敲个脚本就把代码给格式化了(至少可以把缩进给解决了);下面是我调研的几种思路和方案,它们主要是: Control+i的命令化(不可行或者说没搞定) 利用Vim的格式化功能... -
Java File 类的文件名和路径相关函数
2015-11-23 10:55:09Java File类的对文件名和路径处理的主要函数及其使用注意事项 -
java开发的格式与书写规范
2021-10-19 10:15:55下载好eclipse格式化文件 按住ctrl + alt + S,重启后会发现出现eclipse code formatter 选项,点击进入 按照图片进行配置,路径选择文件夹内eclipse-codestyle文件。 注意:每次保存需要 ctr -
基于JAVA实现的WEB端UI自动化 -自动化测试简单介绍
2021-10-13 23:25:24环境要求较高,至少得1G内存才能比较顺畅使用,512内存比较卡, 速度慢 参数化只支持使用XML格式文件来存储测试数据 回放速度超级慢 附:所以才有了Selenium开发以后的强势和很多之前RFT使用者可以快速上手。... -
Java IO篇:序列化与反序列化
2022-01-12 03:22:50所以序列化就是把 Java 对象变成二进制形式,本质上就是一个byte[]数组。将对象序列化之后,就可以写入磁盘进行保存或者通过网络中输出给远程服务了。反之,反序列化可以从网络或者磁盘中读取的字节数组,反序列化成... -
java获取当前类的绝对路径
2015-08-11 13:55:551.如何获得当前文件路径 常用: (1).Test.class.getResource("") 得到的是当前类FileTest.class文件的URI目录。不包括自己! (2).Test.class.getResource("/") 得到的是当前的classpath的绝对URI路径... -
java反序列化漏洞利用工具
2021-02-25 18:44:20java反序列化漏洞已经被曝出一段时间了,其强大的破坏力让我们防不胜防!有没有合理的方法扫描、解决这些漏洞呢?小编给大家带来Java反序列化终极测试工具,直接将Jboss、Websphere和weblogic的反序列化漏洞的利用... -
JAVA上百实例源码以及开源项目源代码
2018-12-11 17:07:42支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印 util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,... -
java-web遗传算法最短路径规划
2017-08-26 22:16:13使用遗传算法,使用D3可视化库。前端部分使用CSS样式将需要点击的区域和body区域设置不同的样式。然后所有的内容都是用JavaScript完成,对于JavaScript的基本知识不做过多介绍,这也是一门面向对象的语言。 首先使用... -
在velocity中使用日期格式化
2016-11-09 17:12:49添加velocity文件中格式化日期方法 -
EditPlus编辑器也能格式化Java代码
2013-09-14 23:37:16EditPlus工具应该是每个程序猿必备的编辑器,但是它的很多功能是还没被我们充分利用,为了让EditPlus发挥更大的作用,经过多方搜集,总结下面的配置方式,下面介绍一个格式化Java代码的方式: 下载插件:... -
在Ubuntu里安装Java环境,以及一些格式化报错的解决方法,建议大家先把文章看完在配,因为有一些出错原有在...
2022-03-25 19:26:38</property> <property> <name>dfs.datanode.data.dir</name> <value>file:/usr/local/hadoop/tmp/dfs/data</value> </property> </configuration> 3,配置完成后,执行NameNode的格式化 切换目录:cd /usr/local/... -
Java反序列化之反射机制
2021-12-07 20:18:03每次听到大佬在讲或者看论坛等一些方式学java反序列化漏洞时,都会有一个词叫做反射机制,大佬顺势借着这个词,就给你造出一个payload,对于刚学java反序列化的我们,可能有点会懵圈,反正我是懵了,所以就赶紧学了... -
java 音频转为wav格式标准音频 | Java工具类
2021-10-15 11:18:00目录 简述 环境依赖 maven依赖 ffmpeg依赖 工具类代码 总结 简述 该工具类主要是为了将各类音频转为wav标准格式,其中可以调节采样率、声道数等指标。主要是使用ffmpeg命令进行转换。...javacv-platfor -
将美化(格式化)的sql语句转成Java中的StringBuffer拼接的一行行字符串/反过来
2018-06-14 16:45:20//如果要转成java字符串, 将格式化的sql文件复制粘贴在E盘的sql.txt中 private static String sqlFile = "E:/sql.txt" ; //如果要将字符串转成sql语句, 将所有"sb.append(" ... ")包裹的sql语句都复制到... -
Java自动化测试常用的工具代码
2018-05-29 11:03:551:简单的截屏——截全屏 ... import java.awt.Dimension;... import java.awt.Rectangle;... import java.awt.Robot;... import java.awt.Toolkit;... import java.awt.image.Buffer... -
Hadoop格式化namenode错误:java.io.IOException: Cannot create directory
2016-05-27 23:59:36在终端输入命令:hadoop namenode -format进行格式化的时候会出现下面这种错误: java.io.IOException: Cannot create directory /opt/hadoop-1.2.1/tmp/dfs/name/current 原因应该是权限不够无法再目录内新建...