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;
}
}
Пример использования фильтра FileFilter
import 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 предназначен прежде всего для записи двоичных файлов. Его можно использовать для работы с текстовыми файлами, но все же для этой задачи больше подходят другие классы. Наверх |
