• Мая 14, 2021, 06:50:46 am
• Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
Новости: на нашем Telegram канале: https://t.me/progkievua

Автор Тема: JAVA OOP ONLINE. Джатдоев А.Р. Домашние задания  (Прочитано 661 раз)

Alexander Ts

  • Преподаватели
  • Пользователи
  • *
  • Сообщений: 14797
    • Просмотр профиля
    • E-mail
Re: JAVA OOP ONLINE. Джатдоев А.Р. Домашние задания
« Ответ #30 : Марта 22, 2021, 10:44:48 pm »
Ricksancez
Задание 1
Вот тут ошибка. Это ж кто вас так учил циклы то писать???
                for (int i = fis.read(arr); i != -1;) {
                    fos.write(arr, 0, i);
                }

Этот цикл выполнит только первую итерацию и все. Так, как блок инициализации цикла for выполняется один раз. Напишите цикл for правильно и все заработает

Задание 2.
Ну и что это за ужас? Где декомпозиция задания с помощью методов? Почему все сваленно в одну кучу. Разбейте это задание на методы.


ricksancez

  • Пользователи
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: JAVA OOP ONLINE. Джатдоев А.Р. Домашние задания
« Ответ #31 : Марта 29, 2021, 04:33:59 pm »
Приветствую Вас, Александр)
Я тут начал пытаться решить такую задачку
- Напишите программу, которая скопирует файлы с заранее
определенным расширением(например, только doc) из
каталога источника в каталог приемник.

так вот, написал код, естесна глянул как в презентации и как на лекции.
но что то пошло не так.
прога висит, куча потоков запущены и не закрываются почему то.
в чем ошибка, подскажите, пожалуйста


класс MyFilter
import java.io.FileFilter;

public class MyFilter implements FileFilter {
    private String [] arr;

    public MyFilter(String... arr) {
        this.arr = arr;
    }

    private boolean check(String ext) {
        for (String stringExt : arr) {
            if (stringExt.equals(ext)) {
                return true;
            }
        }
        return false;
    }

    @Override
    public boolean accept(File pathname) {
        int pointerIndex = pathname.getName().lastIndexOf(".");
        if (pointerIndex == -1) {
            return false;
        }
        String ext = pathname.getName().substring(pointerIndex + 1);
        return check(ext);
    }
}

Main
public class Main {

    public static void main(String[] args) throws IOException {
        MyFilter myFilter = new MyFilter("txt", "jpg", "JPG");

        File folderFrom = new File("C:\\Users\\AD\\Desktop\\folderFrom");
        File folderTo = new File("C:\\Users\\AD\\Desktop\\folderTo");

        File [] fileList = folderFrom.listFiles(myFilter);
        File fileCopy;

        for (File file : fileList) {
            fileCopy = new File(folderTo, file.getName());
            byte [] arr = new byte[1024];
            try(FileInputStream fis = new FileInputStream(file);
                FileOutputStream fos = new FileOutputStream(fileCopy)) {

                fileCopy.createNewFile();

                for (int i = fis.read(arr); i != -1;) {
                    fos.write(arr, 0, i);
                }
            }catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
}




Dump

так вот.
public class Main {

    public static void main(String[] args) throws IOException {
        MyFilter myFilter = new MyFilter("txt", "jpg", "JPG");

        File folderFrom = new File("C:\\Users\\AD\\Desktop\\folderFrom");
        File folderTo = new File("C:\\Users\\AD\\Desktop\\folderTo");

        File [] fileList = folderFrom.listFiles(myFilter);
        File fileCopy;

        for (File file : fileList) {
            fileCopy = new File(folderTo, file.getName());
            byte [] arr = new byte[1024];
            try(FileInputStream fis = new FileInputStream(file);
                FileOutputStream fos = new FileOutputStream(fileCopy)) {

                fileCopy.createNewFile();

                int i = 0;
                for (;(i = fis.read(arr)) != -1;) {  //вот тут и изменил как вы и говорили. никто меня не учил,
                                                                 //если что)
                    fos.write(arr, 0, i);
                }
            }catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
}

ricksancez

  • Пользователи
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: JAVA OOP ONLINE. Джатдоев А.Р. Домашние задания
« Ответ #32 : Марта 29, 2021, 05:29:44 pm »
Ricksancez

Задание 2.
Ну и что это за ужас? Где декомпозиция задания с помощью методов? Почему все сваленно в одну кучу. Разбейте это задание на методы.

))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
public class Main {
    public static void main(String[] args) {
        makeAFile(new File("C:\\Users\\AD\\Desktop\\one (2).txt"),
                  new File("C:\\Users\\AD\\Desktop\\two.txt"),
                  new File("C:\\Users\\AD\\Desktop\\file.txt"));
    }
//====================================================================================================================
    private static void makeAFile (File fileOne, File fileTwo, File fileOut) {
        File[] fileArr = {fileOne, fileTwo};

        StringBuilder builder = new StringBuilder();
        ArrayList<String> words = new ArrayList<>();

        try {
            BufferedReader reader = null;
            for (File file : fileArr) {
                if (file.isDirectory() == true) {
                    System.out.println("Один из файлов - это папка");
                    break;
                }
                reader = new BufferedReader(new FileReader(file));
                String str;
                for (;(str = reader.readLine()) != null;) {
                    builder.append(str);
                }
                builder.append("///");
            }
            if(reader != null) reader.close();

            String str = builder.toString();
            String [] arr = str.split("///");
            String [] wordsOne = arr[0].split(" ");
            String [] wordsTwo = arr[1].split(" ");

            for (String st1 : wordsOne) {
                for (String st2 : wordsTwo) {
                    if (st1.equals(st2)) words.add(st1);
                }
            }

            FileWriter writer = new FileWriter(fileOut);
            for (String s : words) {
                writer.write(s + " ");
            }

            writer.flush();
            writer.close();

        }catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

ricksancez

  • Пользователи
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: JAVA OOP ONLINE. Джатдоев А.Р. Домашние задания
« Ответ #33 : Марта 30, 2021, 09:27:14 pm »
Приветствую)

3. Усовершенствуйте класс, описывающий группу студентов,
добавив возможность сохранения группы в файл.
4. Реализовать обратный процесс. Т.е. считать данные о
группе из файла, и на их основе создать объект типа группа.

Main
public class Main {
    public static void main(String[] args) {
        Group group1 = new Group("Группа 1", sortingParameter.NAME);
        Student student = new Student("Oleg", "Sviridov", 18, Sex.MAN, group1);
        Student student1 = new Student("Natalia", "Sementsova", 15, Sex.WOMAN, group1);
        Student student2 = new Student("Olga", "Ivanova", 25, Sex.WOMAN, group1);
        Student s = group1.getStudent("sdsd");
//        //покажем изначальную группу
//        System.out.println(group1);
//        //интерактивно добавим студента
//        group1.interactivelyAdd();
//        //установим параметр сортировки для группы
//        group1.setParameter(sortingParameter.LASTNAME);
//        //покажем ту же группу, но отсортированную уже по фамилии
//        System.out.println(group1);
//        //покажем кто из студентов пойдет в армейку))
//        System.out.println("Годные к призыву: \n" + Arrays.toString(group1.soldiers()));

        group1.saveGroup();

        Group groupCopy = Group.makeGroup("Группа 1.txt");

        System.out.println(groupCopy);
    }
}

Group
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;

public class Group implements VoenCom{
    private String groupName;
    private Student [] students = new Student[10];
    private Student [] sortedStudents;
    sortingParameter sortingParameter;

    public Group(String groupName) {
        this.groupName = groupName;
        this.sortingParameter = sortingParameter.LASTNAME;
    }

    public Group(String groupName, sortingParameter sortingParameter) {
        this.groupName = groupName;
        this.sortingParameter = sortingParameter;
    }


    //===============ДОБАВЛЕН МЕТОД==================

    public static Group makeGroup (String fileName){
        Group group = null;
        try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) {
            String groupName = fileName.substring(0 ,fileName.lastIndexOf("."));
            String str;
            Sex sex;
            group = new Group(groupName);
            for (;(str = reader.readLine()) != null;) {
                String [] s = str.split(" ");
                int age = Integer.parseInt(s[2]);
                sex = (s[3].equals("MAN") ? Sex.MAN : Sex.WOMAN);
                new Student(s[0], s[1], age, sex, group);
                //созданный студент автоматически добавляется в группу, указанную в его конструкторе
            }
        }catch (IOException ex) {
            ex.printStackTrace();
            System.out.println("Указанного файла не существует.");
        }
        return group;
    }



    //===============ДОБАВЛЕН МЕТОД==================

    public void saveGroup () {
        File file = new File(this.getGroupName() + ".txt");
        boolean b = file.exists();
        try (PrintWriter writer = new PrintWriter(file)){
            if (!b) {
                file.createNewFile();
            }
            String sex;

            for (Student student : this.students) {
                if (student != null) {
                    sex = (student.getSex() == Sex.MAN) ? "MAN" : "WOMAN";
                    String str = student.getName() + " "
                            + student.getLastname() + " "
                            + student.getAge() + " "
                            + sex + " "
                            + this.getGroupName();
                    writer.write(str + "\n");
                }
            }
            writer.flush();
        }catch (IOException ignore) { }
    }


    public void interactivelyAdd() {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        try {
            System.out.println("Введите имя студента");
            String name = reader.readLine();
            System.out.println("Введите фамилию студента");
            String lastName = reader.readLine();
            System.out.println("Введите возраст студента");
            int age = Integer.parseInt(reader.readLine());
            System.out.println("Это девушка? Если да - введите \"Y\", если мужчина - пропустите");
            String str = reader.readLine();
            Sex sex = Sex.MAN;
            if (str.equals("Y")) sex = Sex.WOMAN;
            Student student = new Student(name, lastName, age, sex, this);
        }catch (IOException |NumberFormatException ex) {
            System.out.println("Вы ввели некорректные данные. Повторите попытку.");
            this.interactivelyAdd();
        } finally {
            try {
                reader.close();
            }catch (Exception ignore) {}
        }
    }

    public void addStudent(Student s) {
        try {
            for (int i = 0; ; i++) {
                if (i==students.length) throw new MyException("\nНет места для студента " + s.getLastname() + "\n");
                if (students[i] == null) {
                    students[i] = s;
                    break;
                }
            }
        }catch (MyException ex) {
            System.out.println(ex.getMessage());
        }
    }

    public void delStudent (Student s) {
        for (int i = 0; i<10; i++) {
            if (students[i].equals(s)) {
                students[i] = null;
                break;
            }
        }
    }

    public Student getStudent (String lastName) {
        Student student = null;
        try {
            for (Student s : students) {
                if(s.getLastname().equalsIgnoreCase(lastName)) {
                    student = s;
                    break;
                }
            }
            if (student == null) {
                System.out.println("Студента по фамилии " + lastName + " нет в этой группе.");
            }
        }catch (NullPointerException ignore) { }
        return student;
    }

    public String getGroupName() {
        return groupName;
    }

    public sortingParameter getParameter() {
        return sortingParameter;
    }
    public void setParameter(sortingParameter sortingParameter) {
        this.sortingParameter = sortingParameter;
    }

    @Override
    public Student[] soldiers() {
        this.sort();
        Student[] students = this.sortedStudents;
        ArrayList<Student> soldiers = new ArrayList<>();
        for (Student s : students) {
            if (s.getSex() == Sex.MAN && s.getAge() >= 18) soldiers.add(s);
        }
        return soldiers.toArray(new Student[0]);
    }

    public void sort() {
        ArrayList<Student> listStudents = new ArrayList<>();
        for (Student s : this.students) {
            if (s != null) listStudents.add(s);
        }
        Student[] sortedStudents = listStudents.toArray(new Student[0]);
        Arrays.sort(sortedStudents);
        this.sortedStudents = sortedStudents;
    }

    @Override
    public String toString() {
        this.sort();
        return this.groupName +
                "\nstudents:\n" + Arrays.toString(sortedStudents);
    }
}

Student
import java.util.Arrays;

public class Student extends Human implements Comparable{
    private Group group;

    public Student(String name, String lastname, int age, Sex sex, Group group) {
        super(name, lastname, age, sex);
        this.group = group;
        this.group.addStudent(this);
    }

    @Override
    public String toString() {
        return  "\nStudent {" +
                "name = '" + this.getName() + '\'' +
                ", lastname = '" + this.getLastname() + '\'' +
                ", age = " + this.getAge() +
                ", sex = " + this.getSex() +
                ", group = " + group.getGroupName() +
                '}' + "";
    }

    @Override
    public int compareTo(Object o) {
        Student student = (Student) o;
        String [] both = new String[2];
        if (this == student) return 0;

        if (this.group.sortingParameter == sortingParameter.NAME) {
            both[0] = this.getName();
            both[1] = student.getName();
            Arrays.sort(both);
            if (both[0].equals(this.getName())) return -1;
        }

        if (this.group.sortingParameter == sortingParameter.LASTNAME) {
            both[0] = this.getLastname();
            both[1] = student.getLastname();
            Arrays.sort(both);
            if (both[0].equals(this.getLastname())) return -1;
        }

        if (this.group.sortingParameter == sortingParameter.AGE) {
            if (this.getAge() < student.getAge()) return -1;
        }

        if (this.group.sortingParameter == sortingParameter.SEX) {
            if (this.getSex() == Sex.MAN && student.getSex() == Sex.WOMAN) return -1;
        }

        if (this.group.sortingParameter == sortingParameter.GROUP) {
            both[0] = this.group.getGroupName();
            both[1] = student.group.getGroupName();
            Arrays.sort(both);
            if (both[0].equals(this.group.getGroupName())) return -1;
        }

        return 1;
    }
}

все работает
сохраняется список из строк, в каждой из которых через пробел перечислены все параметры студента
название группы также входит в список параметров студента

создается группа поочередным считыванием строк и последующим созданием объекта студента
в группу созданный студент добавляется автоматически при создании с помощью конструктора

Alexander Ts

  • Преподаватели
  • Пользователи
  • *
  • Сообщений: 14797
    • Просмотр профиля
    • E-mail
Re: JAVA OOP ONLINE. Джатдоев А.Р. Домашние задания
« Ответ #34 : Марта 31, 2021, 05:09:43 pm »
Ricksancez
Задание 2.
Не стало лучше от слова совсем.
У вас должен быть один метод для считывания строки из файла. Отдельный метод для поиска совпадений в словах. Отдельный метод для записи результата. Не нужно все сваливать в одну кучу.



А вот чтение запись группы реализованы нормально

ricksancez

  • Пользователи
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: JAVA OOP ONLINE. Джатдоев А.Р. Домашние задания
« Ответ #35 : Апреля 25, 2021, 05:03:38 am »
Приветствую, Александр))

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

public class Main {
    public static void main(String[] args) {
        for (int i = 1; i <=100; i++) {
            Thread thread = new Thread(new FactorialThread(i));
            thread.start();
        }
    }
}

import java.math.BigInteger;

public class FactorialThread implements Runnable{
    private int number;

    public FactorialThread(int number) {
        this.number = number;
    }

    public int getNumber() {
        return number;
    }

    private BigInteger calculateFactorial (int number) {
        BigInteger fact = new BigInteger("1");
        for (int i = 2; i<=number; i++) {
            fact = fact.multiply(new BigInteger("" + i));
        }
        return fact;
    }

    @Override
    public void run() {
        System.out.println("Factorial of " + this.number + "= " + calculateFactorial(this.number));
    }
}

Alexander Ts

  • Преподаватели
  • Пользователи
  • *
  • Сообщений: 14797
    • Просмотр профиля
    • E-mail
Re: JAVA OOP ONLINE. Джатдоев А.Р. Домашние задания
« Ответ #36 : Апреля 26, 2021, 10:07:52 pm »
Ricksancez

Решение верное

ricksancez

  • Пользователи
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: JAVA OOP ONLINE. Джатдоев А.Р. Домашние задания
« Ответ #37 : Апреля 28, 2021, 09:00:50 pm »
Здравствуйте, Александр

Задача такая
Написать код для многопоточного подсчета суммы элементов
массива целых чисел. Сравнить скорость подсчета с простым
алгоритмом.

есть проблемы)


Main

public class Main {
    public static void main(String[] args) throws Exception {
        int[] arr = {11,2,3,4,5,6,7,8,9,
                1,22,3,4,5,6,7,8,9,
                1,2,33,4,5,6,7,8,9,
                1,2,3,44,5,6,7,8,9,
                1,2,3,4,55,6,7,8,9,
                1,2,3,4,5,66,7,8,9,
                1,2,3,4,5,6,77,8,9,
                1,2,3,4,5,6,7,88,9,
                1,2,3,4,5,6,7,8,99,
                1,2,3,4,5,6,7,8,9,
                11,2,3,4,5,6,7,8,9,
                1,22,3,4,5,6,7,8,9,
                1,2,33,4,5,6,7,8,9,
                1,2,3,44,5,6,7,8,9,
                1,2,3,4,55,6,7,8,9,
                1,2,3,4,5,66,7,8,9,
                1,2,3,4,5,6,77,8,9,
                1,2,3,4,5,6,7,88,9,
                1,2,3,4,5,6,7,8,99,
                1,2,3,4,5,6,7,8,9};
        ArraySumCalculator arraySumCalculator = new ArraySumCalculator(arr);
        System.out.println(arraySumCalculator.sum);
    }
}

идея в разделении массива в несколько подмассивов (до 10) и запуске подсчета суммы
элементов в каждом потоке этих подмассивов


класс для подсчета каждого подмассива

public class CalcThread implements Runnable{
    ArraySumCalculator arraySumCalculator; // эта ссылка была для того, чтоб добавлять к
                                                                //сумме элементов основного массива сумму
                                                                //элементов данного подмассива ПРЯМО В ПОТОКЕ

                                                                //идея не сработала, но переменная ни на что не
                                                                //влияет и никак не задействована (лежит на
                                                                //случай если я пойму как это реализовать)

    private int[] array;
    int sum;

    public CalcThread(ArraySumCalculator arraySumCalculator, int[] array) {
        this.arraySumCalculator = arraySumCalculator;
        this.array = array;
    }

    @Override
    public void run() {
        calculate();
    }

    private void calculate () {
        int s = 0;
        for (int i : array) {
            s += i;
        }
        this.sum = s;
    }


}

класс основного массива

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ArraySumCalculator {
    private int divider; //максимальный делитель количества элементов
    private int[] array;
    volatile int sum; //сумма всех элементов, volatile обозначено для того, чтоб внутри каждого потока
                      //они (потоки) ПООЧЕРЕДНО прибавляли к этой переменной сумму элементов своего подмассива

    public ArraySumCalculator(int[] array) {
        this.array = array;
        calcStart(calcDivider());
    }

    private int calcDivider() { //выясняем количество потоков = делитель
        if (array.length % 10==0) {this.divider = 10;}
        else if (array.length % 9==0) {this.divider = 9;}
        else if (array.length % 8==0) {this.divider = 8;}
        else if (array.length % 7==0) {this.divider = 7;}
        else if (array.length % 6==0) {this.divider = 6;}
        else if (array.length % 5==0) {this.divider = 5;}
        else if (array.length % 4==0) {this.divider = 4;}
        else if (array.length % 3==0) {this.divider = 3;}
        else if (array.length % 2==0) {this.divider = 2;}
        else {divider = 1;}
        return divider;
    }

    private List<CalcThread> calcThreads = new ArrayList<>(); //лист потоков

    private void calcStart(int divider) { //
        int from = 0; //начальная граница первого подмассива
        int to = this.array.length / divider; //конечная граница первого подмассива
        int step = to;//размер подмассива/шаг
        int[] arrayPart;//подмассив

        for (int i = 1; i <= divider; i++) {
            arrayPart = Arrays.copyOfRange(this.array, from, to);
            CalcThread calcThread = new CalcThread(this ,arrayPart);//создаем новый поток с
            Thread thread = new Thread(calcThread);
            thread.start();
            calcThreads.add(calcThread);
            from = this.array.length / divider * i;
            to = from + step;
        }

        //да, складывание сумм подмассивов должны были происходить в потоках
        //с помощью идентификатора volatile, но почему то это не сработало и сумма
        //все равно каждый раз разная

        //поэтому считаю сумму, проходясь по списку потоков и складывая их в главном потоке
        for (int i = 0; i < calcThreads.size(); i++) {
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            System.out.println("Thread "+ i + " = "+ calcThreads.get(i).sum); //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            this.sum += calcThreads.get(i).sum;

        }
    }


}

так вот
этот код, как ни странно, работает
НО с одним непонятным мне условием
сумма подсчитывается верно ТОЛЬКО если есть строка вывода, которая обрамлена "!!!!!!!!..." вот этими комментариями

если ее закомментить, сумма начинает вести себ непредсказуемо

я пробовал в после запуска потоков подождать пару секунд, чтоб проверить закроются ли потоки
и будет ли результат суммы предсказуемым после завершения их работы
НЕТ, не сработало
почему то именна строка вывода влияет на то, будет ли результат верным или же нет.
я не знаю как это объяснить или понять и исправить.
прошу вашей помощи..

Alexander Ts

  • Преподаватели
  • Пользователи
  • *
  • Сообщений: 14797
    • Просмотр профиля
    • E-mail
Re: JAVA OOP ONLINE. Джатдоев А.Р. Домашние задания
« Ответ #38 : Мая 01, 2021, 11:43:18 am »
Ricksancez
Да тут все на порядок проще. Вы забыли вызвать join() для каждого потока и по сути пытаетесь получить сумму не дожидаясь окончания работы потока. Вот и все.

ricksancez

  • Пользователи
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: JAVA OOP ONLINE. Джатдоев А.Р. Домашние задания
« Ответ #39 : Мая 04, 2021, 10:07:27 am »
Доброго дня, Александр))

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

Main

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        File file = new File("имя папки с файлами (без папок)");
        copyFrom(file);
    }


    public static void copyFrom (File folderFrom) {
        File[] fileArr = folderFrom.listFiles();
        List<CopyingThread> copyingThreads = new ArrayList<>();
        int threadNumber = 12; //например

        try {
            for (int i = 1; i <= fileArr.length; i++) {
                CopyingThread copyingThread = new CopyingThread(fileArr[i-1]);
                copyingThread.start();
                copyingThreads.add(copyingThread);
                if (i%threadNumber == 0) {
                    for (CopyingThread thread : copyingThreads) {
                        thread.join();
                    }
                    copyingThreads.clear();
                }
            }
        }catch (IOException|InterruptedException ex) {
            ex.printStackTrace();
        }
    }
}



CopyingThread

import java.io.*;

public class CopyingThread extends Thread{
    private File fileSource;
    private File fileDest;
    private File folderTo;

    public CopyingThread(File file) throws IOException{
        this.fileSource = file;
        File folder = fileSource.getParentFile();
        this.folderTo = new File(folder.getParent() + "\\" + "(CopyOf)" + folder.getName());
        this.folderTo.mkdir();
        this.fileDest = new File(folderTo.getAbsolutePath() + "\\" + "(CopyOf)" + fileSource.getName());
        this.fileDest.createNewFile();
    }

    @Override
    public void run() {
        copyFile(fileSource, fileDest);
    }

    private static void copyFile(File source, File dest) {
        try (InputStream is = new FileInputStream(source);
             OutputStream os = new FileOutputStream(dest)) {
            byte[] buffer = new byte[1024];
            int length;
            while ((length = is.read(buffer)) > 0) {
                os.write(buffer, 0, length);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            System.out.println("File is not exist.");
        }
    }
}

в итоге создается копия каталога с копиями файлов там же, где расположен исходный каталог

ricksancez

  • Пользователи
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: JAVA OOP ONLINE. Джатдоев А.Р. Домашние задания
« Ответ #40 : Мая 04, 2021, 12:47:46 pm »
Задача

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


Main

import java.io.File;

public class Main {
    public static void main(String[] args) {
        checkDir("C:\\Users\\AD\\Desktop\\Folder");
    }

    public static void checkDir (String absolutePath) {
        File directory = new File(absolutePath);
        Thread thread = new Thread(new CheckingThread(directory));
        thread.start();
    }
}


CheckingThread

import java.io.File;

public class CheckingThread implements Runnable {
    private File directory;
    private boolean isStoped;

    public CheckingThread(File directory) {
        this.directory = directory;
        this.isStoped = false;
    }

    @Override
    public void run() {
        File[] dir = directory.listFiles();
        while (!isStoped) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ignore) {
            }

            File[] reloadedDir = directory.listFiles();
            if (dir.length != reloadedDir.length) {
                System.out.println("Каталог был изменен.");
                if (dir.length > reloadedDir.length) System.out.println("Количество файлов уменьшилось.");
                if (dir.length < reloadedDir.length) System.out.println("Количество файлов увеличено.");
                dir = directory.listFiles();
            } else {
                for (int i = 0; i < dir.length; i++) {
                    if (!dir[i].equals(reloadedDir[i])) {
                        dir = directory.listFiles();
                        System.out.println("Каталог был изменен.");
                    }
                    break;
                }
            }
        }
    }

    public void stop() {
        this.isStoped = true;
    }
}


робит

ricksancez

  • Пользователи
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: JAVA OOP ONLINE. Джатдоев А.Р. Домашние задания
« Ответ #41 : Мая 05, 2021, 02:43:54 am »
Ricksancez
Да тут все на порядок проще. Вы забыли вызвать join() для каждого потока и по сути пытаетесь получить сумму не дожидаясь окончания работы потока. Вот и все.

а ведь да) все сразу корректно заработало)
время отработки по такому массиву практически 0 мс
время от времени 2-3 мс
сравнивая с Arrays.sort() скорость примерно одинаковая
может с массивами с миллионами элементов разница хоть какая то будет, но щас ее нет
сравнивая с пузырьком, ну тут не о чем говорить)