-
Чи може об'єкт
File
відповідати файлу, якого ще немає?Так, якщо передати в конструктор значення директорії.
String dirPath = "/"; File f = new File(dirPath); File[] files = f.listFiles();
Так роблять, наприклад, щоб отримати масив файлів.
public class MyClass { public static void main(String[] args) { boolean isObject = false; File file = new File("/"); if (file instanceof Object){ isObject = true; } boolean isFile = file.isFile(); // Tests whether the file denoted by this abstract pathname is a normal file. Это из документации System.out.println(isObject + " "+ isFile); } }
Висновок:
true falseFile
успадковується відobject
. Відповідь: так! Чекаю на коментарі. -
Як перетворити об'єкт
File
до типуPath
?Метод
toPath();
toPath(); //Returns a java.nio.file.Path object constructed from the this abstract path.
-
Навіщо потрібний клас Files?
Взяли за основу клас
File
, додали до нього трохи нового, перейменовували методи, а наприкінці ще й розділабо на два. Тож тепер є два нові класи –Path
іFiles
.Path
- Це, фактично новий аналог класуFile
, аFiles
- це утилітний клас (за аналогією з класамиArrays
&Collections
), в нього винесли всі статичні методи класуFile
. Так «правильніше» з погляду ООП.MДещо з документів:
public final class Files
extends Object
Це class consists exclusively static methods that operate on files, directories, or other types of files.
У більшості випадків, методи defined here буде delegate до asociated file system provider to perform the file operations. -
Які класи ви знаєте для архівації?
Непогана стаття на цю тему та витримка з неї: Архівація в Java
Для роботи з архівами у специфікації Java існують два пакети –
java.util.zip
іjava.util.jar
для архівів zip і jar. Відмінність форматів jar та zip полягає лише у розширенні архіву zip. Пакетjava.util.jar
аналогічний пакетуjava.util.zip
, крім реалізації конструкторів та методуvoidputNextEntry(ZipEntry e)
класуJarOutputStream
. Нижче буде розглянуто лише пакетjava.util.jar
. Щоб переробити всі приклади використання zip-архіву, досить усюди в коді замінити Jar на Zip. -
Як додати директорію до архіву?
Для себе я зрозумів це питання як додавання порожньої директорії до готового архіву. Жодних робочих прикладів я не знайшов. Ось код: (Він наочно показує, що можна в архів покласти будь-який файл, а ось з порожньою директорією… я не знаю як відповісти, постити на StackOverFlow не став, за таке запитання заминусять точно) Якщо у когось є пропозиції, то напишіть.
public class Main { public static void main(String[] args) { String[] myFiles = {"D:\\forJava\\MyArtifactName\\packForTest\\res2.txt", "D:\\forJava\\MyArtifactName\\packForTest\\res.txt", "D:\\forJava\\MyArtifactName\\packForTest\\res4.txt", "D:\\forJava\\MyArtifactName\\packForTest\\testDir\\" }; String zipFile = "D:\\forJava\\MyArtifactName\\packForTest\\res.zip"; ZipUtility zipUtil = new ZipUtility(); try { zipUtil.zip(myFiles, zipFile); } catch (Exception ex) { // some errors occurred ex.printStackTrace(); } } }
Питання про останню testDir, її якраз в архів JVM, що вийшов, не кладе, з усіма іншими txt - файлуми норм виходить.
ZipUtility.java
:import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class ZipUtility { private static final int BUFFER_SIZE = 4096; public void zip(List<File> listFiles, String destZipFile) throws IOException { ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(destZipFile)); for (File file : listFiles) { if (file.isDirectory()) { zipDirectory(file, file.getName(), zos); } else { zipFile(file, zos); } } zos.flush(); zos.close(); } public void zip(String[] files, String destZipFile) throws IOException { List<File> listFiles = new ArrayList<File>(); for (int i = 0; i < files.length; i++) { listFiles.add(new File(files[i])); } zip(listFiles, destZipFile); } private void zipDirectory(File folder, String parentFolder, ZipOutputStream zos) throws IOException { for (File file : folder.listFiles()) { if (file.isDirectory()) { zipDirectory(file, parentFolder + "/" + file.getName(), zos); continue; } zos.putNextEntry(new ZipEntry(parentFolder + "/" + file.getName())); BufferedInputStream bis = new BufferedInputStream( new FileInputStream(file)); long bytesRead = 0; byte[] bytesIn = new byte[BUFFER_SIZE]; int read = 0; while ((read = bis.read(bytesIn)) != -1) { zos.write(bytesIn, 0, read); bytesRead += read; } zos.closeEntry(); } } private void zipFile(File file, ZipOutputStream zos) throws IOException { zos.putNextEntry(new ZipEntry(file.getName())); BufferedInputStream bis = new BufferedInputStream(new FileInputStream( file)); long bytesRead = 0; byte[] bytesIn = new byte[BUFFER_SIZE]; int read = 0; while ((read = bis.read(bytesIn)) != -1) { zos.write(bytesIn, 0, read); bytesRead += read; } zos.closeEntry(); } }
Код звідси
-
Навіщо потрібні
Properties
?Properties
- Це файл властивостей. Структура його: ключ – значення. Для роботи з такими файлуми в Java є класProperties
, він успадкований відHashTable<Object, Object>
Є стаття про маніпуляцію з ним - Java Properties file examples
-
В якому вигляді зберігаються дані у файлі
.properties
?Ключ – значення.
-
Чи можна змінювати дані в об'єкті
Properties
після завантаження їх із файлу?Якщо він успадкований від
HashMap
, тоді можна тільки потім потрібно буде зміни в цей файл відписати. Для цього є методsetProperty
.Ось код:
import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Properties; /** * Created by Роман on 12.09.2016. */ public class LoadAndSetProperties { public static void main(String[] args) { Properties prop = new Properties(); InputStream input = null; try { input = new FileInputStream("D:\\forJava\\MyArtifactName\\packForTest\\config.properties"); // load a properties file prop.load(input); // get the property value and print it out prop.setProperty("database", "ddfdfdfdfdf"); System.out.print(prop.getProperty("database")); } catch (IOException ex) { ex.printStackTrace(); } finally { if (input != null) { try { input.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
Висновок:
ddfdfdfdfdf -
Навіщо потрібен клас
FileReader
?Java Docs:
public class FileReader
extends InputStreamReader
Налаштування класу для reading character files. Конструктори цього класу розмірковують про те, що дефіцит характерних зображень і дефіцит байт-буффера розміри є відповідними. Для того, щоб визначати ці значення ви можете, побудувати в InputStreamReader на FileInputStream.
FileReader is meant for reading streams of characters.
Клас для читання файлів. Конструктори цього класу припускають, що кодування символів дефолтне і дефолтний розмір буфера є відповідними. Щоб встановити ці значення самостійно, слід побудувати
InputStreamReader
надFileInputStream
.FileReader
призначено для зчитування потоків символів. -
Навіщо потрібен клас
FileWriter
?public class FileWriter
extends OutputStreamWriter
Налаштування класу для написання характеристик файлів. Конструктори з цієї class assume, що значний характер накидання і послідовний byte-buffer розмір є прийнятним. Для того, щоб визначати ці значення, ви можете налаштувати на OutputStreamWriter on FileOutputStream.
Будь-який або не файл є наявним або може бути створений depends upon underlying platform. Деякі платформи, в основному, можуть бути записані для написання тільки одного файлупрограміст (або іншого файлу-запису об'єкта) в час. У таких положеннях конструкторів в цій категорії буде помітно, якщо файл не встановлюється, але зроблено. FileWriter is meant for writing streams of characters.
Клас для запису файлів. Конструктори цього класу припускають, що кодування символів дефолтне та дефолтний розмір буфера є прийнятним. Щоб встановити ці значення самостійно, слід побудувати
OutputStreamWriter
надFileOutputStream
. Чи є файл доступним для запису, залежить від використовуваної платформи. Деякі платформи дозволяють тримати файл для запису лише однимFileWriter
(або іншого об'єкта запису файлу), одночасно.FileWriter
призначено для запису потоків символів. Для написання потоків необроблених байтів використовуйтеFileOutputStream
.Ці класи (
FileReader
іFileWriter
) спеціально орієнтовані до роботи з текстом і рядками.
DefNeo
36 рівень
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ