写更好的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