410013796724260
• Webmoney
R335386147728
Z369087728698
Файлы и директории, класс File
Класс File пакета java.io используется для управления информацией о файлах и каталогах. На уровне операционной системы файлы и каталоги имеют существенные отличия, но в Java они описываются одним классом File. Каталог в Java трактуется как обычный файл, но с дополнительным свойством — списком имен файлов, который можно просмотреть с помощью метода list. В зависимости от назначения объект File - файл или каталог, можно использовать один из конструкторов для создания объекта: File (String путь_к_каталогу); File (String путь_к_каталогу, String имя_файла); File (File каталог, String имя_файла); Примеры создания объектов File// Создание File для каталога File dir = new File("C://dir_test"); // Создание File для файлов, которые находятся в каталоге File file1 = new File("C://dir_test", "Hello1.txt"); File file2 = new File(dir, "Hello2.txt"); Свойства и методы класса FileДля определения стандартных свойств файла в классе File имеются различные методы. Однако класс File несимметричен, т.е. методы определения свойств объекта существуют, но соответствующие функции для изменения этих свойств отсутствуют.
В следующем примере открываем файл "d:/test/MyFile.txt" (Windows) и извлекаем его характеристики: import java.io.File; public class FileTest { public static void main(String args[]) { File fl = new File("d:\\test\\MyFile.txt"); System.out.println ("Имя файла: " + fl .getName()); System.out.println ("Путь: " + fl.getPath()); System.out.println ("Полный путь: " + fl.getAbsolutePath()); System.out.println ("Родительский каталог: " + fl.getParent()); System.out.println (fl.exists() ? "Файл существует" : "Файл не существует"); System.out.println (fl.canWrite() ? "Свойство - можно записывать" : "Свойство - нельзя записывать"); System.out.println (fl.canRead() ? "Свойство - можно читать" : "Свойство - нельзя читать"); System.out.println ("Это директория ? " + (fl.isDirectory() ? "да": " нет")); System.out.println ("Это обычный файл ? " + (fl.isFile() ? "да" : "нет")); System.out.println ("Последняя модификация файла : " + fl. lastModified()); System.out.println ("Размер файла : " + fl.length() + " bytes"); } } В консоли будет отпечатана следующая информация: Имя файла: MyFile.txt Путь: d:\test\MyFile.txt Полный путь: d:\test\MyFile.txt Родительский каталог: d:\test Файл существует Свойство - можно записывать Свойство - можно читать Это директория ? нет Это обычный файл ? да Последняя модификация файла : 1441710053162 Размер файла : 12 bytes Интерфейс FileFilterКласс File включает метод, позволяющий прочитать список только определенных файлов. public File[] listFiles(FileFilter filter) В отличие от одноименного метода, но без параметра, данный метод отбирает только те файлы каталога, которые удовлетворяют определенному условию. Параметр filter предназначен для задания этого условия. При этом тип параметра FileFilter — это не класс, а интерфейс, который имеет всего один метод, возвращающий true, если файл удовлетворяет определенным условиям, и false в противном случае. public boolean accept(File pathname) Метод listFiles будет вызывать метод accept для каждого файла в каталоге, и те, для которых accept вернет true, будут включены в результирующий список. Остальные будут проигнорированы. Для использования FileFilter необходимо создать объект и определить в нем соответствующий метод accept. class Filter implements FileFilter { String[] ext; Filter(String ext) { this.ext = ext.split(","); } private String getExtension(File pathname) { String filename = pathname.getPath(); int i = filename.lastIndexOf('.'); if ((i > 0) && (i < filename.length()-1)) { return filename.substring(i+1).toLowerCase(); } return ""; } public boolean accept(File pathname) { if (!pathname.isFile()) return false; String extension = getExtension(pathname); for (String e : ext) { if (e.equalsIgnoreCase(extension)) return true; } return false; } } Пример использования фильтра FileFilterimport java.io.File; import java.io.FileFilter; public class FileTest { public static void main(String args[]) { // Определение директории File dir = new File("."); // Чтение полного списка файлов каталога File[] lst1 = dir.listFiles(); // Чтение списка файлов каталога // с расширениями "png" и "jpg" File[] lst2 = dir.listFiles(new Filter("png,jpg")); System.out.println ("lst1.length = " + lst1.length + ", lst2.length = " + lst2.length); } } Чтение содержимого файла FileInputStreamДля чтения содержимого файла можно использовать класс FileInputStream, который является наследником класса InputStream и реализует все его методы. Конструктор класса FileInputStream : FileInputStream(String fileName) throws FileNotFoundException Если файл не может быть открыт то генерируется исключение FileNotFoundException. Пример считывания данных из файла и вывод содержимого в консоль: import java.io.FileInputStream; public class FilesApp { public static void main(String[] args) { try { FileInputStream fis; fis=new FileInputStream("C:\\test_dir\\test.txt"); System.out.println("Размер файла: " + fis.available() + " байт(а)"); int i = -1; while(( i = fis.read()) != -1){ System.out.print((char)i); } fis.close(); } catch(IOException e){ System.out.println(e.getMessage()); } } } Данные файла можно считать в массив байтов : byte[] buffer = new byte[fis.available()]; // чтение файла в буфер fis.read (buffer, 0, fis.available()); System.out.println ("Содержимое файла:"); for(int i = 0; i < buffer.length; i++){ System.out.print((char)buffer[i]); } Класс FileInputStream предназначен прежде всего для работы с двоичными файлами. Его можно использовать для работы с текстовыми файлами, но все же для этой задачи больше подходят другие классы. Пример использования FileInputStream для чтения файла свойств в кодировке UTF-8: Файл свойств "data.properties" в кодировке UTF-8: # # Параметры сервера SMTP # company=Рога и копыта manager=Остап Бендер Листинг примера : import java.io.Reader; import java.io.IOException; import java.io.InputStream; import java.io.FileInputStream; import java.io.InputStreamReader; import java.util.Properties; public class Main { public static void main(String[] args) { try { InputStream is; is = new FileInputStream("data.properties"); if (is != null) { Reader reader; reader = new InputStreamReader(is, "UTF-8"); Properties props = new Properties(); props.load(reader); System.out.println ( props.getProperty ("company") + ", " props.getProperty ("manager")); is.close(); } } catch (IOException e) { e.printStackTrace(); } } } Запись в файл FileOutputStreamКласс FileOutputStream, является производным от класса OutputStream, поэтому наследует всю его функциональность. Пример записи строки в файл: import java.io.FileOutputStream; public class FilesApp { public static void main(String[] args) { String text = "Hello world!"; // строка для записи try { FileOutputStream fos; fos=new FileOutputStream("C:\\test_dir\\test.txt"); // перевод строки в байты byte[] buffer = text.getBytes(); fos.write(buffer, 0, buffer.length); } catch(IOException e){ System.out.println(e.getMessage()); } } } Для создания объекта FileOutputStream используется конструктор, принимающий в качестве параметра путь к файлу для записи. Для записи строки ее сначала переводим в массив байт и с помощью метода write строка записывается в файл. Необязательно записывать весь массив байтов. Используя перегрузку метода write(), можно записать и одиночный байт: fos.write(buffer[0]); // запись только первого байта Пример перезаписи содержимого из одного файла в другой: import java.io.FileInputStream; import java.io.FileOutputStream; public class FilesApp { public static void main(String[] args) { try { FileInputStream fis; FileOutputStream fos; fis=new FileInputStream("C:\\test_dir\\test.txt"); fos=new FileOutputStream("C:\\test_dir\\new.txt"); byte[] buffer = new byte[fis.available()]; // считываем буфер fis.read(buffer, 0, buffer.length); // записываем из буфера в файл fos.write(buffer, 0, buffer.length); fis.close(); fos.close(); } catch(IOException e){ System.out.println(e.getMessage()); } } } Класс FileOutputStream предназначен прежде всего для записи двоичных файлов. Его можно использовать для работы с текстовыми файлами, но все же для этой задачи больше подходят другие классы. Наверх |