Java中File的getPath(),getCanonicalPath()和getAbsolutePath()之间的区别

File API在Java中非常重要,因为它使文件系统可以访问Java程序。 尽管Java的文件API丰富,但是使用它们时仍需要了解许多细节。 关于文件路径的常见查询程序员之一是getPath()getCanonicalPath()getAbsolutePath()方法之间的区别,为什么有三种获取文件路径的方法以及如果调用getPath()代替getCanonicalPath()会发生什么情况? 。

顺便说一下,在了解getPath(),getAbsolutePath()和getCanonicalPath()之间的区别之前,让我们了解这些方法背后的概念,即path,absolute path和canonical path之间的区别 。 通常,路径是到达文件系统中特定文件或目录的方式,它可以是绝对路径(也称为完整路径),也可以是相对于当前位置的相对路径。

绝对路径定义了从文件系统的根目录(例如Windows中的C:\\或D:\\)以及从/的基于UNIX的操作系统(例如Linux或Solaris)中的路径。 规范路径有些棘手,因为所有规范路径都是绝对的,反之亦然 。 它实际上定义了从文件系统根目录到文件的唯一绝对路径。 例如,C://temp/names.txt是Windows中names.txt的规范路径,而/home/javinpaul/test/names.txt是Linux中的规范路径。 另一方面,同一文件可以有很多绝对路径,包括刚刚看到的规范路径。 例如,Windows中另一个指向同一文件的绝对路径可以是C://temp/./names.txt;。 类似地,在UNIX / home / javinpaul / test /./ names.txt中,是同一文件的另一个绝对路径。 所以可以这样说,绝对路径可能包含元字符之类的。 和..代表当前目录和父目录。 在本文的其余部分,我们将通过查看特定文件返回的值来了解getPath(),getAbsolutePath()和getCanonical()路径之间的区别。

在UNIX,Windows,Linux或任何文件系统中处理文件时,您通常会听到术语,绝对,规范和相对路径。 这是在脚本或程序中引用任何特定文件的三种常用方法。 如果您是一名程序员,则编写脚本,那么您就会知道使用绝对路径如何使您的脚本僵化和不灵活,使用绝对路径实际上是无效的,而众所周知,脚本中的硬编码路径是程序员字典中不良的编码实践之一。 。 绝对路径是指向特定文件(例如C:\ temp \ abc.txt)的完整路径。 绝对路径名的定义也取决于系统。 在UNIX系统上,如果路径名的前缀是“ /”,则它是绝对的。 在Win32系统上,如果路径名的前缀是驱动器说明符,后跟“ \\”,或者其前缀是“ \\”,则该路径名是绝对路径。

例如,我们有两个目录:temp和temp1,而test.txt文件位于temp目录中。

C:\temp
C:\temp1

在Windows下的Java中,您可能具有以下可能的绝对路径,它们引用同一文件test.txt。

C:\temp\test.txt
C:\temp\test.txt
C:\temp\TEST.TXT
C:\temp\.\test.txt
C:\temp1\..\temp\test.txt

另一方面,相对路径是相对于您所在目录的目录,称为当前目录。 因此,如果您在上述目录中,则如果将文件test.txt作为相对目录引用,则它假定您所在的目录相同。当执行../时,它将返回一个目录,也称为父目录。 规范路径要难一些。 对于初学者,所有规范路径都是绝对路径(但并非所有绝对路径都是规范路径)。 系统上存在的单个文件可以具有许多引用该文件的路径,但是只有一个规范路径。 Canonical为给定文件提供了唯一的绝对路径。 如何实现这一点的细节可能取决于系统。 对于上面的示例,我们只有一个规范路径:C:\ temp \ test.txt,请记住,在Java中,您可以使用路径分隔符来使用UNIX样式的正斜杠(/),或者甚至可以使用file获取操作系统路径分隔符。分隔符系统属性,是编写真正与平台无关的Java应用程序的关键 。

Java的绝对路径与相对路径 一旦您了解了绝对路径,规范路径和相对路径之间的区别,就很容易区分这三种方法,因为它们实际上返回的是路径,绝对路径和规范路径。 简而言之,这是它们之间的主要区别:

  1. 第一个方法getPath()返回一个String,该String表示用于创建关联的File对象的路径,并且它可能相对于当前目录。
  2. 第二种方法getAbsolutePath()根据当前目录(如果是相对目录)将其解析后返回路径字符串,从而生成完全限定的路径。
  3. 第三种方法getCanonicalPath()在针对当前目录解析任何相对路径后返回路径字符串,并删除任何相对路径元素(例如(。和..)),以及任何文件系统链接以返回文件系统认为是规范的路径表示引用它指向的文件系统对象。

还要记住,以上两个方法中的每个方法都有一个File等效项,该等效项返回相应的File对象,例如getAbsoluteFile()和getCanonicalFile(),它们返回相同的内容。

下面的示例说明如何在同一文件中有许多不同的路径(和绝对路径),它们都具有完全相同的规范路径。 因此,如果您想知道两个不同的路径是否指向同一文件,则规范路径很有用。

import java.io.File;/*** Java program to show difference between path, absolute path and canonical* path related to files in Java. File API provides three methods to* java.io.File class getPath(), getAbsolutePath() and getCanonicalPath() and* this program just explain what those method returns.** @author Javin Paul*/
public class PathDemo {public static void main(String args[]) {System.out.println("Path of the given file :");File child = new File(".././Java.txt");displayPath(child);File parent = child.getParentFile();System.out.println("Path of the parent file :");displayPath(parent);}public static void displayPath(File testFile) {System.out.println("path : " + testFile.getPath());System.out.println("absolute path : " + testFile.getAbsolutePath());try {System.out.println("canonical path : " + testFile.getCanonicalPath());} catch (Exception e) {e.printStackTrace();}}}Output:
Path of the given file :
path : ..\.\Java.txt
absolute path : C:\Users\WINDOWS 8\workspace\Demo\..\.\Java.txt
canonical path : C:\Users\WINDOWS 8\workspace\Java.txtPath of the parent file :
path : ..\.
absolute path : C:\Users\WINDOWS 8\workspace\Demo\..\.
canonical path : C:\Users\WINDOWS 8\workspace

这就是Java中的getPath(),getAbsolutePath()和getCanonicalPath()之间的区别。 在课程中,我们还了解了路径,绝对路径和规范路径之间的区别。 您需要记住的是,getPath()为您提供了创建File对象的路径,该路径可能是相对的,也可能不是相对的。 getAbsolutePath()给出文件的绝对路径; getCanonicalPath()为您提供文件的唯一绝对路径。 值得注意的是,可能有大量指向同一文件的绝对路径,但只有一个规范路径。

翻译自: https://www.javacodegeeks.com/2014/08/difference-between-getpath-getcanonicalpath-and-getabsolutepath-of-file-in-java.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362768.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker容器CPU、memory资源限制

背景 在使用 docker 运行容器时,默认的情况下,docker没有对容器进行硬件资源的限制,当一台主机上运行几百个容器,这些容器虽然互相隔离,但是底层却使用着相同的 CPU、内存和磁盘资源。如果不对容器使用的资源进行限制&…

JS_理解函数参数按值传递

本文是我基于红宝书《Javascript高级程序设计》中的第四章,4.1.3传递参数小节P70,进一步理解javaSript中函数的参数,当传递的参数是对象时的传递方式。 (结合资料的个人理解,有不正确的地方,希望大家指出&…

FastReport.Net 使用字符串

OutlineExpression :Month([tb_trainlog.tb_trainlog_time])&"月"转载于:https://www.cnblogs.com/yzy666/archive/2010/05/11/1732678.html

检查Red Hat JBoss BRMS部署架构的规则和事件(第一部分)

(文章来宾与北美红帽公司高级中间件顾问约翰赫洛克 ( John Hurlocker)合着) 在本周的技巧中,我们将放慢速度,并仔细研究可能的Red Hat JBoss BRMS部署体系结构。 当我们谈论部署架构时,我们指…

CSS_选择符

2016-10-28 《CSS入门经典》第五章 以下提示注意事项: 1.如何选择使用id选择符还是class选择符:当确信id选择符在页面的唯一性时,就可以使用id选择符。 2.通用选择符在所有元素上设置样式,并不是只设置继承的默认值。 eg&…

TFS2010配置SQLServer2008R2 tf255049错误

TFS2010配置SQLServer2008R2时,配置数据库时提示 tf255049错误。转载于:https://www.cnblogs.com/ShuaiHo/archive/2010/05/12/1733731.html

位运算笔记2.0

声明: 本文为转载文章 转载于:https://www.cnblogs.com/ShineEternal/p/10853132.html

教程–带有Jersey和Spring的Java REST API设计和实现

想要在Java中使用REST? 然后您来对地方了,因为在博客文章中,我将向您介绍如何“美丽”地设计REST API,以及如何使用Jersey框架在Java中实现它。 在本教程中开发的RESTful API将为存储在MySql数据库中的播客资源演示完整的Create&a…

Vue 封装的组件生命周期钩子

export default {// ...// 在组件初始化时调用,可以简单理解为页面加载时created () {// 存在 localStorage 的缓存内容 if (localStorage.data) { this.myData JSON.parse(localStorage.data) } else { // 页面无缓存内容时,初始化数据并写入缓存 this…

使用Spring-Cloud将Spring Boot应用程序部署到Cloud Foundry

我有一个基于Spring Boot的小型应用程序 ,该应用程序使用Postgres数据库作为数据存储。 我想记录将示例应用程序部署到Cloud Foundry的步骤 。 Spring Boot参考指南中描述了一些步骤 ,但是这些指南并未充分说明如何与基于云的环境中提供的数据存储集成。…

前台js获取guid --getGuid

/** *获取id */function getGuid(){ var len32; //32长度 var radix16; //16进制 var chars0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ.split(); var uuid[],i; radixradix || chars.length; if(len){ for(i0;i<len;i){ uuid[i]cha…

ie6 下最佳 PNG透明方案【转】

“咳! 哎!….. ” 你听见了么? 这些都是大家抱怨IE6下不能实现png图片漂亮的明效果的哀叫声,的确是无奈呀….. 不过现在幸运的是,我们能够让这一切的抱怨都停止. 网络上解决IE6下Png透明解决方案有很多,例如 IE PNG Fix from TwinHelix, Javascript IE PNG Fix, Transparent …

安装svn、git等托管软件

安装软件&#xff0c;配置环境。下面我找到的别人写的&#xff0c;写的都很详细&#xff0c;做个记录。就不在这里写具体步骤了。 1.nodejs安装 使用vue-cli 搭建项目的时候需要nodejs&#xff0c;node是比较方便的&#xff0c;打包部署&#xff0c;解析vue单文件组件&#xff…

Echarts在手机端y轴数据过大,显示不全

解决办法&#xff1a; 减少y轴的margion&#xff0c;和格式化y轴 myChart.setOption({...,yAxis: {axisLabel: {margin: 2,formatter: function (value, index) {if (value > 10000 && value < 10000000) {value value / 10000 "万";} else if (va…

HBase:为客户行为生成搜索点击事件统计信息

在本文中&#xff0c;我们将探索HBase来存储客户搜索点击事件数据&#xff0c;并利用其基于搜索查询字符串和构面过滤器点击来获取客户行为信息。 我们将介绍如何使用MiniHBaseCluster&#xff0c;HBase Schema设计&#xff0c;使用HBaseSink与Flume集成以存储JSON数据。 在之…

控制HTML Input只能输入数字和小数点

转&#xff1a;https://www.cnblogs.com/esion/p/3342866.html 本文介绍三种控制在中只允许输入数字和小数点的方案。 方案1&#xff1a;通过JavaScript代码实现。 JavaScript代码如下&#xff1a; function checkNum(obj) {//检查是否是非数字值if (isNaN(obj.value)) {obj…

2019-05-14 Sonar部署

1.下载软件地址&#xff1a;https://www.sonarqube.org/#downloads 官方文档&#xff1a;https://docs.sonarqube.org/display/SCAN/AnalyzingwithSonarQubeScannerforAnt 2.LTS Release不是最新但是是稳定的版本长久支持&#xff1b;Latest Realease是最新版本不稳定&#xff…

WildFly 8.1.0.Final上的SwitchYard 2.0.0.Alpha1入门

最近&#xff0c;我一直在关注一些热门的RedHat技术&#xff0c;在其中很多有趣的部分中&#xff0c;我找到了SwitchYard 。 过去&#xff0c;对于所有人都围绕SOA和面向服务的体系结构不屑一顾&#xff0c;这对我来说一直很奇怪&#xff0c;作为Java EE开发人员。 过去&#…

void main()是错误的

USE_NET新闻组一直苦恼于一个问题的讨论&#xff0c;我们能否用void作为一个main的返回类型&#xff0c;ANSI标准说不能&#xff0c;然而&#xff0c;大量的关于C的启蒙书中的例子都使用了void main (void)&#xff0c;这让许多人感觉不知该如何是好。 当有人问为什么使用void是…

zTree 优秀的jquery树插件

zTree 优秀的jquery树插件,文档详细&#xff0c;渲染快 使用方法&#xff1a; 1、引用zTree的js和css文件   <link href"~/Content/zTree_v3/css/zTreeStyle/zTreeStyle.css" rel"stylesheet" /><script src"~/Content/zTree_v3/js/jque…