File.createNewFile () для относительного пути использует неправильный каталог после изменения «user.dir» -Property - PullRequest
1 голос
/ 17 февраля 2011

Я впервые задаю вопрос на этой замечательной странице, поэтому, пожалуйста, наберитесь терпения, если я ошибусь. Я пытаюсь создать новый файл с относительным путем в моем пользовательском каталоге после того, как я его изменил. Чтобы изменить каталог пользователя, я использовал System.setProperty("user.dir", "/data");, затем я создал файловый объект с File f2 = new File("f2"); и пустой файл в моей файловой системе с f2.createNewFile();. После этого я ожидал, что файл появится в / data / f2, и это то, что f2.getAbsolutePath() говорит мне. Но, как ни странно, файл появляется в «старом, исходном» userDir.

Вот мой тест:

import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;

public class Main {

    private static FilenameFilter filter = new FilenameFilter() {

        public boolean accept(File dir, String name) {
            return (name.startsWith("f")) ? true : false;
        }
    };

    public static void main(String[] args) throws IOException {
        String userDirPropertyName = "user.dir";
        File initialUserDir = new File(System.getProperty(userDirPropertyName));

        System.out.println("files in " + initialUserDir.getAbsolutePath() + ":");
        for (File file : initialUserDir.listFiles(filter)) {
            System.out.println("  - " + file.getAbsoluteFile());
        }

        System.out.println("initial userDir = " + System.getProperty(userDirPropertyName));
        File f1 = new File("f1");
        f1.createNewFile();
        System.out.println("f1.getAbsolutePath() = " + f1.getAbsolutePath());
        System.out.println("getCanonicalPath() for . = " + new File(".").getCanonicalPath());


        System.setProperty(userDirPropertyName, "/data");

        System.out.println("changed userDir = " + System.getProperty(userDirPropertyName));
        File f2 = new File("f2");
        f2.createNewFile();
        System.out.println("f2.getAbsolutePath() = " + f2.getAbsolutePath());
        System.out.println("getCanonicalPath() for . = " + new File(".").getCanonicalPath());


        System.out.println("files in " + initialUserDir.getAbsolutePath() + ":");
        for (File file : initialUserDir.listFiles(filter)) {
            System.out.println("  - " + file.getAbsoluteFile());
        }
    }
}

Это вывод, который я получаю:

файлов в / home / pps / NetBeansProjects / UserDirTest:
исходный userDir = / home / pps / NetBeansProjects / UserDirTest
f1.getAbsolutePath () = / home / pps / NetBeansProjects / UserDirTest / f1
getCanonicalPath () для. = / home / pps / NetBeansProjects / UserDirTest
измененный userDir = / data
f2.getAbsolutePath () = / data / f2
getCanonicalPath () для. = / данные
файлы в / home / pps / NetBeansProjects / UserDirTest:
- / home / pps / NetBeansProjects / UserDirTest / f1
- / home / pps / NetBeansProjects / UserDirTest / f2

f1 и f2 появляются в одном каталоге, хотя я изменил user.dir между!?!
Кто-нибудь может мне помочь с этим?
Большое спасибо

Ответы [ 3 ]

1 голос
/ 17 февраля 2011

Установка свойства user.dir является не поддерживается и приводит к всевозможным странным эффектам .

1 голос
/ 17 февраля 2011

Я только что воспроизвел ваш сценарий.Я думаю, что ваша ошибка в том, что вы пытаетесь использовать системное свойство для изменения текущего рабочего каталога.Возможность извлечь этот каталог из системного свойства - это просто удобный метод.Если вы измените свойство, сам каталог не изменится.

Решение состоит в том, чтобы создать каталог по вашему желанию, используя File.mkdir() или File.mkdirs(), а затем используйте new File(myDir, fileName), где myDir - ваш новый каталог.

0 голосов
/ 17 февраля 2011

Нет способа изменить текущий каталог в Java.

Когда вы изменяете системное свойство, свойство изменяется, но не фактический рабочий каталог, используемый собственным кодом для создания файла. Однако getAbsolutePath использует текущее значение системного каталога user.dir для составления абсолютного пути.

...