JavaRush /Java блог /Random UA /Рівень 31. Відповіді на запитання до співбесіди на тему р...
DefNeo
36 рівень

Рівень 31. Відповіді на запитання до співбесіди на тему рівня

Стаття з групи Random UA
Рівень 31. Відповіді на запитання до співбесіди на тему рівня - 1
  1. Чи може об'єкт 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 false

    Fileуспадковується від object. Відповідь: так! Чекаю на коментарі.

  2. Як перетворити об'єкт Fileдо типу Path?

    МетодtoPath();

    toPath(); //Returns a java.nio.file.Path object constructed from the this abstract path.
  3. Навіщо потрібний клас 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.

  4. Які класи ви знаєте для архівації?

    Непогана стаття на цю тему та витримка з неї: Архівація в 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.

  5. Як додати директорію до архіву?

    Для себе я зрозумів це питання як додавання порожньої директорії до готового архіву. Жодних робочих прикладів я не знайшов. Ось код: (Він наочно показує, що можна в архів покласти будь-який файл, а ось з порожньою директорією… я не знаю як відповісти, постити на 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();
        }
    }

    Код звідси

  6. Навіщо потрібні Properties?

    Properties- Це файл властивостей. Структура його: ключ – значення. Для роботи з такими файлуми в Java є клас Properties, він успадкований відHashTable<Object, Object>

    Є стаття про маніпуляцію з ним - Java Properties file examples

  7. В якому вигляді зберігаються дані у файлі .properties?

    Ключ – значення.

  8. Чи можна змінювати дані в об'єкті 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

  9. Навіщо потрібен клас FileReader?

    Java Docs:

    public class FileReader
    extends InputStreamReader

    Налаштування класу для reading character files. Конструктори цього класу розмірковують про те, що дефіцит характерних зображень і дефіцит байт-буффера розміри є відповідними. Для того, щоб визначати ці значення ви можете, побудувати в InputStreamReader на FileInputStream.

    FileReader is meant for reading streams of characters.

    Клас для читання файлів. Конструктори цього класу припускають, що кодування символів дефолтне і дефолтний розмір буфера є відповідними. Щоб встановити ці значення самостійно, слід побудувати InputStreamReaderнад FileInputStream. FileReaderпризначено для зчитування потоків символів.

  10. Навіщо потрібен клас 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) спеціально орієнтовані до роботи з текстом і рядками.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ