首页 > 编程语言 >【Java复杂系统实战经验-2023-08月】Java基础,Path路径计算编码

【Java复杂系统实战经验-2023-08月】Java基础,Path路径计算编码

时间:2023-08-25 11:55:52浏览次数:34  
标签:bar Java 08 2023 Returns API Path path

Java程序设计-个人月报-2023-08月

背景

在本月,给负责的项目做了一次文件存储的迁移工作。

历史原因,开发阶段由于图简便,使用了本地文件存储。

后面经过容器化上云,导致应用出现上传文件分发的多节点的问题。

本项工作的经验,受益于Java基础Path的一些API,颇有收获。

复杂的系统应当构建于通用的,稳定的,有共识的,成熟API之上。 ----沃兹基索德

路径计算

代码中,不要使用路径拼接的原始写法,非常容易出错。例如:

String path = '/bucket/' + projectId + '/v' + version + fileName;

甚至后面直接使用了subString,正则表达式。

这种写法非常不好,当项目内多次使用路径计算的时候,代码复杂性增加。

java.nio.Path

Path path = Paths.get('parent','child');

Path	toAbsolutePath()
Returns a Path object representing the absolute path of this path.
File	toFile()
Returns a File object representing this path.
Path	toRealPath(LinkOption... options)
Returns the real path of an existing file.

这些API非常简单且实用,且不要在代码中试图使用 split("/")split(File.pathSeparator)
这类比较初级的写法。

使用Name获取Path中的分片

Path	getName(int index)
Returns a name element of this path as a Path object.
int	getNameCount()
Returns the number of name elements in the path.

上一级或者下一级

Path	getParent()
Returns the parent path, or null if this path does not have a parent.

Path	resolve(Path other)
Resolve the given path against this path.
Path	resolve(String other)
Converts a given path string to a Path and resolves it against this Path in exactly the manner specified by the resolve method.

其中 resolve 非常实用:

不用担心,这些路径可以不用存在于本地文件系统上

//你的代码:
path = "a" + "/b";
path = "a/" + "b";
//无法跨平台,且埋下BUG的可能性。


//Path API的代码:
Paths.get("a").resolve("b"); //在Windows上,得出 a\b,在Linux,MacOS上得到 a/b。

从整个路径中获取文件名和后缀

Path	getFileName()
Returns the name of the file or directory denoted by this path as a Path object.
//你的old class代码:
String path= "foo/bar/some.pdf";
path.subString(path, path.lastIndexOf("/"));
//搞不好还整出来一个"/some.pdf",需要试试。

//Path API的代码
Paths.get(path).getFileName(); //some.pdf

URI

URI的组成部分是 Schema:// + 剩余部分地址,在某些情况下,例如ClassPath的表示,就非常重要。

URI	toUri()
Returns a URI to represent this path.

String path = "/root/foo/bar/slankka.md"
URI uri = Paths.get(path).toUri(); //得到 file:///root/foo/bar/slankka.md
//未经验证,但意思对就行。

理解了上述 java API,org.apache.hadoop.fs.Path 同理。这样在编写大数据相关的Path就不容易出错。

一些例子

file:///root/foo/bar/slankka.md
hdfs://dc1/user/hdfs/foo/bar/slankka.md
viewfs://cluster123/foo/bar/slankka.md

标签:bar,Java,08,2023,Returns,API,Path,path
From: https://www.cnblogs.com/slankka/p/17656567.html

相关文章

  • java内存管理 美好的期望与现实的残酷
    美好的期望---看山是山,看水是水犹记得当年刚入门学Java课时;99%的java基础性书籍和带领入门的老师都会介绍java的一项优点;即:Java语言不使用指针,它加入了垃圾回收机制,解决了程序员需要管理内存的问题,使编程变得更加简单。刚开始接触这段话时,心理感觉java语言太优秀了,尤其是在大一学......
  • 基于java极速WEB+ORM 框架:jfinal2.0开发的通用后台管理系统及源码
    final2-common-admin1、基于java极速web开发框架:jfinal2.0开发的通用后台管理系统,包括完整的登录、注册、菜谱管理、厨师管理、餐厅管理等功能2、开发时是基于jdk1.8、tomcat7.0,utf8编码3、运行时请修改配置文件:a_little_config.txt及相应的运行环境:JavaBuildPath、TargetedR......
  • 【2023-08-24】任风不动
    20:00幸福这东西就像星星一样,黑暗是遮不住它们的,总会有空隙可寻。                                                 ——泰戈尔什么样的年纪,就要做什么样的事情。这是......
  • 暑假集训D24 2023.8.22 contest I
    C.CityFolding题意:有一个由\(2^n\)条等长线段组成的线,你可以进行\(n\)次对折,可以从左向右对折或从右向左对折,给出初始时线段的编号\(P\),问如何对折\(n\)次才能使对折后该线段恰好在从下往上数第\(H\)层?\(\operatorname{Solution}\)构造可以倒过来考虑这个......
  • 【Java】SM2Utils(国密 SM2 工具类)
    基于bouncycastle实现国密SM2<!--引入bouncycastle--><dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.70</version></dependency>importlom......
  • 解放双手!ChatGPT助力编写JAVA框架
    亲爱的Javaer们,在平时编码的过程中,你是否曾想过编写一个Java框架去为开发提效?但是要么编写框架时感觉无从下手,不知道从哪开始。要么有思路了后对某个功能实现的技术细节不了解,空有想法而无法实现。如果你遇到了这些问题,看完这篇文章你也能用ChatGPT编写一个简单的JAVA框架。构思......
  • java基础
    一、数据类型1、数据类型 2、数据类型的转换自动转换:取值范围小的类型  自动提升为  取值范围大的类型。    三元运算符 ......
  • java Object转String的4种实现方式
    1.情景展示在实际开发过程中,经常会遇到将Object类型强转成String类型。Object转String一共有几种实现方式?2.具体分析共有三种实现方式。3.解决方案以Map<String,Object>进行举例说明。Map<String,Object>map=newHashMap<>(3);map.put("k1","v1");map.put("k2",......
  • 【校招VIP】java语言考点之双亲委派模型
    考点介绍:双亲委派是校招面试中的高频考点之一。双亲委派机制定义:当一个类加载器收到了类加载的请求的时候,他不会直接去加载指定的类,而是把这个请求委托给自己的父加载器去加载。只有父加载器无法加载这个类的时候,才会由当前这个加载器来负责类的加载......一、考点题目1、为什......
  • IDEA 生成的 JAVA 接口允许跨域访问的配置
    1.新建一个基类,在类上方添加 @CrossOrigin属性importorg.springframework.web.bind.annotation.CrossOrigin;@CrossOriginpublicclassBaseController{}2.在其他controller中继承这个基类,其他接口就可以跨域访问了publicclassElseControllerextendsBaseContr......