2011-12-25 2 views
2

new File("abc.txt") не создает фактического файла, а new FileWriter("abc.txt") создает файл на диске. Просматривая исходный код, я обнаружил, что new FileWriter("abc.txt") в конечном итоге создает объект с файлом типа new File()Почему новый FileWriter («abc.txt») создает новый файл, а новый файл («abc.txt») нет?

+1

Вы уверены, что 'нового FileWriter ("abc.txt")' создает новый файл? AFAIK создает поток вывода, зависящий от некоторого файла, но также может создавать нулевой объект, если нет определенного файла. Попробуйте проверить 'новый файл (« abc.txt »)' с 'File.canRead()', 'File.canWrite()' после попытки его создания – teoREtik

ответ

9

Конструктор класса java.io.File не создает файл на диске. Это просто абстракция по пути к файлу. Файл создается при записи в файл.

При создании FileWriter он вызывает конструктор FileOutputStream, который вызывает последовательность проверок безопасности, а затем вызывает:

if (append) { 
    openAppend(name); 
} else { 
    open(name); 
} 

Призывание open() создает файл на диске.

EDIT:

Вот как open() определяется:

/** 
* Opens a file, with the specified name, for writing. 
* @param name name of file to be opened 
*/ 
private native void open(String name) throws FileNotFoundException; 
1

объект Файл просто представление местоположения к файлу, (URL) в системе. Вы можете вызвать createNewFile() в объекте File, чтобы написать наш файл, предполагая, что имя с этим именем еще не существует в этом месте.

+1

Не говоря уже о том, что объект 'File' также может быть каталогом , +1. – fge

+0

Очень верно. Существуют методы для файла для создания каталогов. –

2

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

Из JavaDoc для java.io.File:

Абстрактное представление файлов и директорий для имен каталогов.

и

Экземпляры этого класса могут или не могут обозначать фактический объект файловой системы, например, файл или каталог.

Для того, чтобы иметь файл фактически будет создан, нужно позвонить createNEwFile(), whic согласно JavaDoc:

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

0

Когда FileWriter создает новый объект File внутри, это не то, что заставляет файл появляться. Это происходит в других частях кода. Объект File является стандартным способом указания файла (или каталога), независимо от того, существует он или нет.

0

Есть много причин, на самом деле, но:

Файл используется многими классами в java.io. FileReader и т. Д. FileWriter - это «удобный» класс, который использует File, и это позволяет программисту быть более продуктивным. Некоторые классы просто хотят, чтобы объект File указывал на местоположение файла, а затем они работали на нем по мере необходимости для поддержки их обработки. Другие классы могут поддерживать FileWriter, потому что он будет записывать только в файл и не читать.Это также делает API более строго типизированным.

2

Я думаю file.createNewFile() создает новый файл в фактическом .. смотрите следующий код для DETAL ...

File file = new File("D:\\tables\\test.sql"); 

      // if file does not exists, then create it 
      if (!file.exists()) { 
       file.createNewFile(); 
      } 

      FileWriter fw = new FileWriter(file.getAbsoluteFile()); 
Смежные вопросы