java - File.separator和路径中的斜杠之间的区别

在Java Path-String中使用/和普通的File.separator有什么区别?

与双反斜杠相比,/平台独立似乎不是原因,因为两个版本都在Windows和Unix下运行。

public class SlashTest {

@Test

public void slash() throws Exception {

File file = new File("src/trials/SlashTest.java");

assertThat(file.exists(), is(true));

}

@Test

public void separator() throws Exception {

File file = new File("src" + File.separator + "trials" + File.separator + "SlashTest.java");

assertThat(file.exists(), is(true));

}

}

要重新解释这个问题,如果/适用于Unix和Windows,为什么还要使用File.separator?

Joe23 asked 2019-04-07T18:51:44Z

14个解决方案

285 votes

你使用File.separator,因为有一天你的程序可能会运行在一个遥远的土地上开发的平台上,一个奇怪的东西和陌生人的土地,马匹哭泣,奶牛操作所有的电梯。 在这片土地上,人们传统上使用“:”字符作为文件分隔符,因此JVM尽职尽责地遵循他们的意愿。

Pointy answered 2019-04-07T18:52:34Z

214 votes

使用用于处理文件的Java库,您可以在所有平台上安全地使用File.separator(斜杠,而不是反斜杠)。 库代码处理内部将事物转换为特定于平台的路径。

但是,您可能希望在UI中使用File.separator,因为最好向人们展示在他们的操作系统中有意义的内容,而不是对Java有意义的内容。

更新:在五分钟的搜索中,我无法找到记录下“你总是可以使用斜线”的行为。 现在,我确信我已经看到它记录在案,但由于没有找到官方参考(因为我的记忆不完美),我坚持使用File.separator,因为你知道这将有效。

T.J. Crowder answered 2019-04-07T18:52:08Z

26 votes

虽然使用File.separator来引用文件名是过度的(对于那些想象远离陆地的人来说,我想他们的JVM实现将用:替换/,就像windows jvm用\替换它一样)。

但是,有时您获取文件引用,而不是创建它,并且您需要解析它,并且为了能够这样做,您需要知道平台上的分隔符。 File.separator可以帮助您实现这一目标。

Yishai answered 2019-04-07T18:53:07Z

7 votes

嗯,有比OS和Windows(便携式设备等)更多的操作系统,Java以其可移植性而闻名。 最佳实践是使用它,因此JVM可以确定哪个最适合该操作系统。

jpabluz answered 2019-04-07T18:53:32Z

7 votes

虽然它在路上没有太大的区别,但它确实在回来的路上。

当然你可以在新文件(字符串路径)中使用'/'或'\',但File.getPath()只会给你一个。

William Billingsley answered 2019-04-07T18:54:04Z

6 votes

好吧,让我们检查一些代码。

File.java行428到435在seperatorChar中:

String p = uri.getPath();

if (p.equals(""))

throw new IllegalArgumentException("URI path component is empty");

// Okay, now initialize

p = fs.fromURIPath(p);

if (File.separatorChar != '/')

p = p.replace('/', File.separatorChar);

让我们阅读seperatorChar文档:

java.io.FileSystem

public abstract String fromURIPath(String path)

必要时对给定的URI路径字符串进行后处理。 这是用来   win32,例如,将“/ c:/ foo”转换为“c:/ foo”。 路径字符串   还有斜线分离器; File类中的代码将翻译它们   这个方法返回后。

这意味着seperatorChar仅在Windows中对URI路径进行后期处理,因为在下一行中:

p = p.replace('/', File.separatorChar);

它用系统相关的seperatorChar替换每个'/',你可以随时确保'/'在每个操作系统中都是安全的。

Alireza Mohamadi answered 2019-04-07T18:55:17Z

3 votes

便携性简单明了。

Holograham answered 2019-04-07T18:55:42Z

3 votes

迟到了。 我在Windows 10上使用JDK 1.8和Eclipse MARS 1。

我发现

getClass().getClassLoader().getResourceAsStream("path\to\resource");

工作和

getClass().getClassLoader().getResourceAsStream("path\to\resource");

不起作用

getClass().getClassLoader().getResourceAsStream("path\to\resource");

不起作用。 最后两个是等价的。 所以...我有充分的理由不使用File.separator。

i-make-robots answered 2019-04-07T18:56:44Z

1 votes

“Java SE8 for Programmers”声称Java将应对这两种情况。 (第480页,最后一段)。该示例声称:

c:\Program Files\Java\jdk1.6.0_11\demo/jfc

会解析得很好。 记下最后一个(Unix风格)分隔符。

它很俗气,而且可能容易出错,但这正是他们(Deitel和Deitel)声称的。

我认为人们而不是Java的混淆是足够的理由不使用这个(误?)功能。

Erik Bennett answered 2019-04-07T18:57:29Z

1 votes

正如先生们描述了与变体细节的区别。

我想建议在处理程序中的文件时使用Apache Commons io api,类

E_X answered 2019-04-07T18:58:01Z

0 votes

使用主机系统的命名约定指定文件或目录的路径名。 但是,File类定义了与平台相关的常量,这些常量可用于以独立于平台的方式处理文件和目录名称。

Files.separator定义用于分隔路径名中的目录和文件组件的字符或字符串。 对于Unix,Windows和Macintosh,此分隔符分别为“/”,“\”或“:”。

shubhankar answered 2019-04-07T18:58:37Z

0 votes

如果您使用的是Java 7,请检查Path.resolve()和Paths.get()。

ceilfors answered 2019-04-07T18:59:02Z

0 votes

使用File.separator使Ubuntu生成文件名为“\”而不是目录。 也许我对我如何制作文件(和目录)很懒,并且可以避免它,无论如何,每次使用“/”以避免名称上带有“\”的文件

Guedez answered 2019-04-07T18:59:28Z

0 votes

如果您尝试使用Linux分隔符从一些准备好的路径(保存在数据库中,每个示例)创建一个文件,我该怎么办?

也许只需使用路径创建文件:

new File("/shared/folder/file.jpg");

但Windows使用不同的分隔符(/)。 那么,是否可以将斜杠分隔符转换为平台无关? 喜欢:

new File(convertPathToPlatformIndependent("/shared/folder"));

这个方法/可能会有一些“/”拆分并与File.separator连接。

那么,对我来说,这对于一种独立于平台的语言来说并不好(对吧?)而且Java已经支持在Windows或Linux上使用/。 但是如果你正在使用路径并且每次都需要记住这个转换,这将是一场噩梦,你将不会对未来的应用程序有任何实际的好处(可能在@Pointy描述的宇宙中)。

Dherik answered 2019-04-07T19:00:24Z

java中separator_java - File.separator和路径中的斜杠之间的区别相关推荐

  1. Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?

    Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别? Java 中访问数据库的步骤 1)注册驱动: 2)建立连接: 3)创建Statement: 4)执 ...

  2. python中定义变量和数组_Python中的线程和全局变量 - 数组和标准变量之间的区别?...

    我目前尝试使用线程编写一个更大的python程序,并遇到了数组不必被声明为全局的问题.Python中的线程和全局变量 - 数组和标准变量之间的区别? import numpy as np import ...

  3. 关于JAVA Bean实体类对象pojo,vo,po,dto,entity之间的区别

    关于JAVA Bean实体类对象pojo,vo,po,dto,entity之间的区别: Pojo: Pojo 普通的java对象 最基本的javaBean只有属性 加上属性的get,set方法,可以转 ...

  4. Qt处理路径里的斜杠和反斜杠

    最早的unix操作系统,文件路径都是用斜杠,也就是"/",linux参考unix开发,路径也是用斜杠分割.后来windows源于DOS,DOS里斜杠已经用于命令行参数标识了,于是用 ...

  5. 关于File.separator 文件路径:wind与linux下路径问题 .

    最近有个在页面上传Excel文件至服务器指定目录并进行数据校验.最后入库及进行进一步处理的应用情境,我写好代码在模拟环境下测试,完全没问题:但客户试用的时候,却老是报告"No such fi ...

  6. 关于File.separator 文件路径:window与linux下路径问题(“No such file or diretory ”异常解决方案)...

    最近有个在页面上传Excel文件至服务器指定目录并进行数据校验.最后入库及进行进一步处理的应用情境,我写好代码在模拟环境下测试,完全没问题:但客户试用的时候,却老是报告"No such fi ...

  7. Java中WeakReference,SoftReference,PhantomReference和Strong Reference之间的区别

    很长一段时间以来,WeakReference和SoftReference都已添加到Java API中,但是并不是每个Java程序员都熟悉它. 这意味着在Java中使用WeakReference和Sof ...

  8. Java中Int、Integer、new Integer()之间的区别

    Java中有八种基本数据类型,Int是其中之一.而Integer是Int的封装,即Integer其实是一个对象.可以通过new来创建一个Integer对象,也可以直接将Int值赋给Integer变量. ...

  9. weakreference_Java中WeakReference,SoftReference,PhantomReference和Strong Reference之间的区别...

    weakreference 很长一段时间以来,WeakReference和SoftReference都已添加到Java API中,但是并不是每个Java程序员都熟悉它. 这意味着在Java中使用Wea ...

最新文章

  1. SAP PP COR2下达工单系统报错说-系统状态APNG是激活的- 分析第二篇
  2. 产品打包工具的制作,ant,编译源码,打jar包,打tag,打war包,备份release版本等...
  3. linux 安装 apache+mysql+php
  4. 多条件and查询遇到的问题
  5. Android中JNI 的一些常用说明 JNI_OnLoad registerNatives registerNativeMethods
  6. java Hashtable 和 HashiMap 的区别
  7. Java 官方文档使用介绍
  8. 用canvas实现一个简易的涂鸦画板
  9. 寒风里的凌厉香气,令人沉醉的男士魅力
  10. 平面设计教程:PS新手如何制作好透视立体字海报
  11. Ubuntu18.04 笔记本合上盖子时不进入休眠
  12. 塑胶卡扣弹性计算公式_塑胶产品结构设计 卡扣
  13. 学会聆听别人,聆听也是一门艺术。
  14. 程序员把开发搬到云服务器,如何将IDEA开发的java web项目移植到腾讯云服务器
  15. 思科2018校招硬件测试笔试试题及答案
  16. scribed 安装
  17. 过采样和求均值提高ADC分辨率
  18. UHD-SDI GT v2.0(PG380)
  19. 简洁的JS图片滚动代码
  20. 传奇开区网站如何添加流量统计代码

热门文章

  1. 机房收费系统总结【2】-细节优化
  2. CRF(条件随机场)与Viterbi(维特比)算法原理详解
  3. 【图论】有向无环图的拓扑排序
  4. LeetCode简单题之按照频率将数组升序排序
  5. 来谈谈Servlet~~
  6. 2002年3月英伟达发布核弹GPU与大算力自动驾驶芯片
  7. 激光雷达激烈竞争市场
  8. NVIDIA TensorRT高性能深度学习推理
  9. Pytorch和CNN图像分类
  10. 2021年大数据Spark(二十三):SparkSQL 概述