Примеры ошибок File.getCanonicalPath()
Кто-нибудь имеет опыт или знает, когда метод File.getCanonicalPath()
будет бросать IOException
Я попытался посмотреть из Интернета, и лучший ответ в File API, в котором говорится
"IOException
- Если возникает ошибка ввода-вывода, что возможно, потому что для построения канонического пути может потребоваться запрос файловой системы"
Однако мне это непонятно, потому что я до сих пор не могу придумать случай, который может потерпеть неудачу. Может ли кто-нибудь дать мне конкретные примеры, которые могут произойти в Linux, Windows и других ОС (необязательно)?
Я хочу знать, потому что я хочу обработать это исключение. Таким образом, было бы лучше, если бы я знал все возможные ошибки, которые могут произойти.
Ответы
Ответ 1
Вот пример Windows:
Попробуйте вызвать getCanonicalFile
в файле на вашем CD-диске, но без загрузки компакт-диска. Например:
new File("D:\\dummy.txt").getCanonicalFile();
вы получите:
Exception in thread "main" java.io.IOException: The device is not ready
at java.io.WinNTFileSystem.canonicalize0(Native Method)
at java.io.Win32FileSystem.canonicalize(Win32FileSystem.java:396)
at java.io.File.getCanonicalPath(File.java:559)
at java.io.File.getCanonicalFile(File.java:583)
Ответ 2
Исключение IO также возникает, если мы попытаемся создать объект File с ключевыми словами файла устройства Windows (см. файлы устройства), используемые в качестве имени файла.
Как будто вы пытаетесь переименовать файл в эти ключевые слова, Windows не позволит вам сделать это (не разрешено имена файлов CON, PRN, COM1 и т.д.), Java также не сможет преобразовать это имя файла в правильный путь.
Итак, любой следующий следующий код будет вызывать исключение IO:
File file = new File("COM1").getContextPath();
File file = new File("COM1.txt").getContextPath();
File file = new File("C:/somefolder/COM1.txt").getContextPath();
Однако следующий код должен работать:
File file = new File("COM1_.txt").getContextPath(); //underscore wins :)
Ответ 3
См. здесь База данных Sun Bug.
Для JRE 1.4.2_06 File.getCanonicalPath() не работал в Windows для съемного диска, когда в накопителе нет носителя.
Он был исправлен в Java 1.5, но вы можете видеть, что с этим методом могут возникнуть проблемы с ОС.
Я не знаю никакой проблемы в текущее время, но может случиться, что именно это говорит Джавадок. Обычно он быстро исправляется в новой версии Java.
Ответ 4
Вот общий пример для всех ОС:
new File("\u0000").getCanonicalFile();
Перед канонизацией файла его действие проверяется с помощью java.io.File # isInvalid:
final boolean isInvalid() {
if (status == null) {
status = (this.path.indexOf('\u0000') < 0) ? PathStatus.CHECKED
: PathStatus.INVALID;
}
return status == PathStatus.INVALID;
}
И если файл недействителен - вы получите исключение IO:
public String getCanonicalPath() throws IOException {
if (isInvalid()) {
throw new IOException("Invalid file path");
}
return fs.canonicalize(fs.resolve(this));
}
Profit!
Ответ 5
Еще один сценарий, когда вы пытаетесь использовать ограниченные/недопустимые символы операционной системы в качестве имени вашего файла.
Для Windows \ / : * ? " < > |
это недопустимые символы. Попробуйте переименовать файл с помощью: вы получите сообщение шара/подсказки о недопустимых символах.
Попробуйте следующий код Java.
File file = new File("c:/outputlog-2013-09-20-22:15");
//A common scenario when you try to append java.util.Date to create a file like
//File newFile = new File(filename + "_" + new Date());
System.out.println(file.getAbsolutePath());
System.out.println(file.getCanonicalPath());
Если имя файла содержит
* ?
вы получите java.io.IOException: неверный аргумент
| :
вы получите java.io.IOException: неверно имя файла, имя каталога или тома.
когда вы используете метод getCanonicalPath().
Если мы используем любой из " < >
char в имени файла, тогда метод getCanonicalPath() будет не, но при попытке создать файл вы получите недопустимый аргумент Exception.
Обратитесь jdk7 api
Точное определение канонической формы зависит от системы. Здесь я использовал окна 7.