如何在Java中转义反斜杠和自动生成的转义字符以处理文件路径?

10

我有一个非常小而简单的问题,但是我无法找到解决方案。实际上,我正在使用文件选择器获取CSV文件路径,并使用"load data local infile"查询将其中的数据输入到数据库中。

假设我输入的文件路径是"C:\title.csv"。当我将此字符串放入查询中时,您将看到路径中的\ t组合。这个\ t实际上是文件路径的一部分,而不是转义字符'\t'。但是Java和MySQL将其视为转义字符。

然后我尝试使用以下代码行将文件路径字符串中的"\\"替换为"\"。

String filepath="C:\title.csv";
String filepath2=filepath.replace("\\","\\\\");

现在文件路径没有受到影响,它仍将 '\t' 视为转义字符。

那么我的问题是如何在不更改文件名的情况下解决这个问题?

如果我们有以下路径:

String filepath="C:\new folder\title.csv";

如果文件或文件夹的名称在路径中引起了转义字符,它会将 \n 和 \t 视为转义字符。如何解决这个问题?


请记住,如果您想使用LOAD DATA INFILE,则要处理的文件必须在托管DB服务器的机器上,因此您首先必须将文件上传到DB服务器,完成后您不必担心Windows路径(除非服务器托管在Windows机器上)。 - LordDoskias
@ James DW @ LordDoskias 你们好!James,我尝试了你的解决方案,但是当我执行filepath.replace("\","\");时,它会出现编译错误。LordDoskian,我的数据库服务器和文件都在同一台机器上,并且使用Windows操作系统。我只想将filepath="C:\new\title.csv"更改为"c:\new\title.csv"。因为用''替换'\'可以处理普通路径行"C:\my\myfile.csv",但不能处理上述filepath,其中意外地使用了转义字符与文件夹名称或文件名的组合。 - Param-Ganak
1
你怎样才能确认Java将文件路径中的\n视为转义字符? - michael667
@michael667 我将路径存储在一个字符串变量中,例如String filepath="C:\title.csv",并将其打印到控制台上,然后我尝试使用filepath.replace("\","\\")替换路径中的\,并再次将字符串打印到控制台上,两次打印输出结果相同。谢谢。 - Param-Ganak
你能否发布一段可编译的代码以重现这种行为? - michael667
@Param,这已经是第三个问题了,你问的完全一样。你能停止吗?每个人都告诉你,Java源文件中的字符串与程序外部传入的字符串完全不同!如果你想在Java中使用反斜杠字符串文件名(WTF,为什么不使用斜杠?)String filepath="C:\new folder\title.csv";,那么你需要做的就是这样:String filepath="C:\\new folder\\title.csv"; - Angel O'Sphere
4个回答

14
在Java字符串字面量中使用双斜杠来转义斜杠:
String s = "c:\\new folder\\title.csv";

如果最终用户在JFileChooser中输入字符串,则字符串变量将包含用户输入的所有字符。仅在Java源代码中使用字符串字面值时需要转义。

并且使用预处理语句将字符串插入数据库表中。这将正确转义特殊字符并避免SQL注入攻击。在Java JDBC教程中了解更多关于预处理语句的信息。


@ James DW @ LordDoskias @ JB Nizet 你们好!James我尝试了你的解决方案,但是当我将filepath.replace("\","\");放入代码中时,会出现编译错误。LordDoskian我的数据库服务器和文件都在同一台机器上,且使用Windows操作系统。我只想将filepath="C:\new\title.csv"转换为"c:\new\title.csv",因为将''替换为'\'适用于普通路径行"C:\my\myfile.csv",但不适用于上面的filepath,其中意外的转义字符与文件夹名称或文件名相结合。 - Param-Ganak
如果用户在JFileChooser中输入了某个路径,则返回的文件路径将包含反斜杠。您只需要在Java代码中的字符串文字中转义反斜杠即可。请展示如何测试文件路径的内容。 - JB Nizet
我应该如何在这个代码中转义 /str.replace(/ <samp>ــ</samp>$/, '')。(我想要转义 </samp> 中的 / - stack
@stack 请使用真实代码提出您自己的问题,而不是在一个四年前的回答中进行评论。 - JB Nizet
好的,我问了这个问题,但我相信人们会给我很多负评..! - stack
@stack 你意识到这个问题是关于Java的,而你的问题是关于JavaScript的吗?Java和JavaScript就像汽车和地毯一样完全不同。 - JB Nizet

6

你需要使用:

 String filepath2=filepath.replace("\\","\\\\");

1
也许你需要转义每个转义序列,例如 filepath.replace("\n", "\\n") - Ankur
@ Ankur Mittal 是的,这是可能的,但我正在寻找更简单的解决方案,因为在您的解决方案中,我们必须为每个转义序列字符编写给定行。谢谢! - Param-Ganak
1
@Param-Ganak 你可以使用Apache Common库中的StringEscapeUtils.escapeJava(str)函数。 - Ankur
你好朋友!这个库是随Java一起提供的还是我们需要外部添加它?这个库是免费的吗?谢谢! - Param-Ganak
它不带Java,这是Apache库,是免费的,但需要外部添加。 - Ankur
显示剩余2条评论

4

String filepath2=filepath.replace("\\","\\\\") 这段代码并不正确 - 在字符串字面值中,\是一个特殊字符,需要进行转义:

String escapedFilepath = filepath.replace("\\","\\\\"); //double all backslashes

你好朋友,我在我的问题中打错了字,现已进行了编辑。谢谢。 - Param-Ganak

0

在最初的字面量(filepath)中,你必须使用转义符号。

String filepath="C:\\title.csv"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接