Абсолютный путь рассматривается как относительный

Я столкнулся с фрагментом кода, где абсолютный путь рассматривается как относительный. Пока мне не удалось воспроизвести это в других проектах.

Я использую NetBeans 8.0.2 с JDK 8u51 в Windows 10.

Вот кусок кода:

public void setImagePath(String path) throws IOException {
    File file = new File(path);
    System.out.printf("path:     %s\n", path);
    System.out.printf("resolved: %s\n", file.getAbsolutePath());
    System.out.printf("test:     %s\n", new java.io.File("C:/users/rando/desktop/test.jpg").getAbsolutePath());
    img = ImageIO.read(file);
    reloadImage();
}

И вот результат:

path:     ‪C:\users\rando\desktop\test.jpg
resolved: C:\Users\rando\Dropbox\Other\NetBeans Projects\Applications\test\‪C:\users\rando\desktop\test.jpg
test:     C:\users\rando\desktop\test.jpg

Обратите внимание, что на полпути через строку «разрешено» абсолютный путь начинается с C:...

Кто-нибудь может пролить свет на это?

Мое единственное предположение, что это проблема Windows 10.

РЕДАКТИРОВАТЬ:

Так что, в некотором смысле, это проблема Windows 10. В Windows 7 я всегда получал полный путь к определенному файлу, перейдя к его свойствам и скопировав имя объекта с вкладки безопасности. В Windows 10 он, по-видимому, теперь имеет дополнительный управляющий символ.


person Travis Bruce    schedule 13.08.2015    source источник
comment
Вы пытались передать path с косой чертой вместо обратной, т.е. "C:/users/rando/desktop/test.jpg"?   -  person Sergey Kalinichenko    schedule 13.08.2015
comment
Я не могу это воспроизвести. Одиночный \ вызывает ошибку компилятора, если он используется в строковом литерале, и если я ввожу его с помощью консоли, я получаю правильный вывод.   -  person Tom    schedule 13.08.2015
comment
Попробуйте напечатать длину path. У меня такое ощущение, что в нем может быть знак порядка байтов или другие управляющие символы.   -  person VGR    schedule 13.08.2015
comment
@VGR ты что-то напутал... : path: ‪C:\users\rando\desktop\test.jpg path len: 32 resolved: C:\Users\rando\Dropbox\Other\NetBeans Projects\Applications\test\‪C:\users\rando\desktop\test.jpg resolved len: 100 test: C:\users\rando\desktop\test.jpg test len: 31   -  person Travis Bruce    schedule 13.08.2015
comment
Блокнот и некоторые другие редакторы помещают метку порядка следования байтов в начало текстовых файлов в кодировке UTF-16 (иногда), чтобы указать порядок байтов в кодировке UTF-16. Что печатает System.out.printf("%04x%n", path.codePointAt(0));?   -  person VGR    schedule 13.08.2015
comment
@VGR, который печатает 202a   -  person Travis Bruce    schedule 13.08.2015
comment
Кажется, это индикатор слева направо.   -  person Tom    schedule 13.08.2015
comment
Похоже, в вашем тексте есть управляющий код Unicode LRE. Самое простое решение — path = path.replaceAll("\\p{C}", "");.   -  person VGR    schedule 13.08.2015
comment
@VGR Думаю, ты должен написать это в ответе.   -  person Tom    schedule 13.08.2015
comment
Интересно! Я не уверен, как он туда попал, я вставил путь с вкладки безопасности в окне свойств файла для этого конкретного файла. В прошлом я всегда обнаруживал, что непечатаемые символы по-прежнему должны иметь два перемещения курсора, чтобы обойти непечатаемый символ (т. е. вы нажимаете стрелку влево/вправо, а курсор остается на месте), но в этом случае при навигации по строковому литералу в Netbeans так себя не ведет.   -  person Travis Bruce    schedule 13.08.2015
comment
Однако мне пришлось сделать дополнительный backspace, чтобы избавиться от него...   -  person Travis Bruce    schedule 13.08.2015


Ответы (1)


Похоже, у вас есть управляющий код Unicode LRE в строке пути. Самое простое исправление

path = path.replaceAll("\\p{C}", "");

который удалит все управляющие символы.

person VGR    schedule 13.08.2015
comment
Управляющий символ был в строковом литерале, поэтому все, что мне нужно было сделать, это убрать его назад. Однако похоже, что Netbeans должен иметь предупреждение (непечатаемые символы в строковых литералах). - person Travis Bruce; 13.08.2015
comment
@TravisBruce Почему? Я бы этого не хотел. - person user207421; 13.08.2015
comment
@EJP Потому что я полагаю, что большинство людей очень редко захотят иметь непечатаемые символы в своих строковых литералах (за исключением возврата каретки и новой строки), и возникающие из-за них ошибки могут быть довольно запутанными для отслеживания. - person Travis Bruce; 13.08.2015