写更好的Java代码
起因
这两天开始写公司的Java项目,是一个WebApi项目.发现在一些使用方式不太好的地方,顺便记录一下.发现写的不太好的地方,和C#基本一样.字符串操作
String fileName = "1A4A9BB8-720C-4000-993B-79BBAC79A35C.JPG";
//下面多次使用toLowerCase,是可以减少调用
if (fileName.toLowerCase().endsWith(".jpg") ||
fileName.toLowerCase().endsWith(".png") ||
fileName.toLowerCase().endsWith(".bmp")) {
System.out.println("要处理的文件类型");
}
//改为从配置文件读取,获取文件后缀名,将文件后缀名统一转为小写
String fileType = ".jpg|.png|.bmp";
int extLocation = fileName.lastIndexOf('.');
String fileExtName = fileName.substring(extLocation).toLowerCase();
if (fileType.indexOf(fileExtName) > -1) {
System.out.println("根据配置文件中的文件类型,处理文件");
}
日期操作
//旧的文件名生成方式
//SimpleDateFormat日期格式化
//currentTimeMillis获取毫米数,性能可能会有问题,内部是gettimeofday
String filePath = new SimpleDateFormat("yyyyMMdd").format(new Date()) +
File.separator +
System.currentTimeMillis() +
fileExtName;
//新的文件名称
//DateTimeFormatter 日期格式化
//toEpochMilli获取毫秒数
DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String today = LocalDateTime.now(ZoneOffset.of("+8")).format(dateFormat);
//获取毫秒数
long millis = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
//生成文件名格式
StringBuilder pathBuilder = new StringBuilder(64);
pathBuilder.append(today)
.append(File.separator)
.append(millis)
.append(fileExtName);
currentTimeMillis 源码
在openjdk/hotspot/src/share/vm/prims/jvm.cpp文件中// java.lang.System //////////////////////////////////////////////////////////////////////
JVM_LEAF(jlong, JVM_CurrentTimeMillis(JNIEnv *env, jclass ignored))
JVMWrapper("JVM_CurrentTimeMillis");
return os::javaTimeMillis();
JVM_END
在openjdk/hotspot/src/os/linux/vm/os_linux.cpp文件中
jlong os::javaTimeMillis() {
timeval time;
int status = gettimeofday(&time, NULL);
assert(status != -1, "linux error");
return jlong(time.tv_sec) * 1000 + jlong(time.tv_usec / 1000);
}
至于为什么看Linux实现,是因为软件国产化和服务器去Windows化,并不是因为Windows服务器不好.
秋风
2020-02-05