JavaRush /Курсы /Java Collections /Вопросы к собеседованию 2 уровень

Вопросы к собеседованию 2 уровень

Java Collections
2 уровень , 14 лекция
Открыта

— Привет, Амиго!

Вопросы к собеседованиям
1 Зачем нужен RandomAccessFile?
2 Что будет если файл, откуда читает RandomAccessFile, не существует?
3 Что будет если файл, куда пишет RandomAccessFile, не существует?
4 Зачем нужен класс StringReader?
5 Зачем нужен класс StringWriter?
6 Зачем нужен класс ByteArrayStream?
7 Зачем нужен класс PrintStream? Назовите места, где он используется?
8 Зачем нужен DynamicProxy?
9 Как работает RMI?
10 Объекты каких типов можно передавать по RMI?
Комментарии (25)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
{Java_Shark} Уровень 36
27 января 2025
++
milniy87 Уровень 41
18 марта 2023
1.RandomAccessFile - это класс в Java, который позволяет читать и записывать данные в файле в произвольном месте. Он позволяет перемещаться по файлу в любое место и читать/записывать данные в этой позиции. 2. Если файл, откуда читает RandomAccessFile, не существует, будет выброшено исключение FileNotFoundException. 3. Если файл, куда пишет RandomAccessFile, не существует, то он будет создан автоматически при записи данных в файл. 4. StringReader - это класс в Java, который позволяет читать данные из строки, как будто это поток. Этот класс используется для чтения строковых данных из памяти, таких как строки в памяти, которые были сформированы в процессе выполнения программы. 5. StringWriter - это класс в Java, который позволяет записывать данные в строку, как будто это поток. Этот класс используется для записи строковых данных в память, таких как строки, которые должны быть переданы в другую часть программы. 6. ByteArrayOutputStream - это класс в Java, который позволяет записывать данные в массив байтов, как будто это поток. Этот класс используется для записи байтовых данных в память, таких как байты, которые должны быть переданы в другую часть программы. 7. PrintStream - это класс в Java, который используется для записи форматированного текста в файлы и консоль. Он позволяет выводить данные на консоль или записывать данные в файлы с помощью методов, таких как println() или printf(). Этот класс используется в консольных приложениях для вывода информации на экран или в файл.
milniy87 Уровень 41
18 марта 2023
8. DynamicProxy в Java предоставляет механизм для создания динамических прокси-объектов во время выполнения. Прокси-объект - это объект, который выступает в качестве заместителя для другого объекта и может перехватывать вызовы методов, отправлять их на обработку другим объектам и получать результаты. Динамические прокси-объекты позволяют гибко изменять поведение программы во время выполнения, например, добавлять логирование, кэширование, контроль доступа или удаленный доступ к объектам. Кроме того, они могут использоваться для реализации различных шаблонов проектирования, таких как «фабричный метод», «одиночка» и «наблюдатель». Для создания динамического прокси-объекта в Java необходимо реализовать интерфейс InvocationHandler и использовать статический метод Proxy.newProxyInstance(), который создает новый прокси-объект на основе заданных интерфейсов и переданного объекта InvocationHandler.

public class ListProxy implements InvocationHandler {

    private List<Object> target;

    public ListProxy(List<Object> target) {
        this.target = target;
    }

    public static void main(String[] args) {
        List<Object> list = new ArrayList<>();
        List<Object> proxy = (List<Object>) Proxy.newProxyInstance(
                List.class.getClassLoader(),
                new Class<?>[] { List.class },
                new ListProxy(list)
        );
        proxy.add("Hello");
        proxy.add("World");
        System.out.println(list);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("Calling " + method.getName());
        return method.invoke(target, args);
    }

}
Здесь создается прокси-объект для интерфейса List на основе объекта ArrayList, переданного в конструктор ListProxy. В методе invoke() перехватываются вызовы метода add() и выводится сообщение в консоль, а затем
milniy87 Уровень 41
18 марта 2023
9. RMI (Remote Method Invocation) - это механизм удаленного вызова методов, который позволяет Java-программам взаимодействовать друг с другом через сеть. С помощью RMI можно вызывать методы удаленных объектов так, будто они находятся в локальной JVM, хотя они находятся на другой машине. RMI позволяет передавать сложные объекты между клиентом и сервером, что делает его очень удобным для разработки распределенных приложений. Для работы с RMI необходимо создать интерфейс, который будет использоваться клиентами и сервером. Этот интерфейс должен расширять интерфейс java.rmi.Remote и для каждого метода должен быть определен RemoteException. Далее необходимо создать реализацию этого интерфейса и зарегистрировать ее на сервере с помощью Naming.rebind(). Затем клиенты могут получить ссылку на удаленный объект с помощью Naming.lookup() и вызывать его методы как обычные локальные методы. Для обеспечения безопасности RMI использует механизм сертификации и авторизации. По умолчанию RMI использует стандартный механизм Java Security для определения полномочий, а также для проверки подписей и сертификатов.
milniy87 Уровень 41
18 марта 2023
10. Предположим, у нас есть класс Person:

import java.io.Serializable;

public class Person implements Serializable {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}
Теперь мы хотим передать этот объект по RMI. Для этого нам нужно сделать две вещи: Сделать класс Person удаленным (remote). Для этого нам нужно расширить его от Remote, а также добавить исключение RemoteException к его конструктору:


import java.rmi.Remote;
import java.rmi.RemoteException;
import java.io.Serializable;

public interface Person extends Remote, Serializable {
    String getName() throws RemoteException;
    int getAge() throws RemoteException;
}
Написать серверный и клиентский код, чтобы передать объект Person. Серверный код:


import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;

public class Server {
    public static void main(String[] args) {
        try {
            Person person = new PersonImpl("John Doe", 30);
            Person stub = (Person) UnicastRemoteObject.exportObject(person, 0);

            Registry registry = LocateRegistry.getRegistry();
            registry.bind("Person", stub);

            System.out.println("Server ready");
        } catch (Exception e) {
            System.err.println("Server exception: " + e.toString());
            e.printStackTrace();
        }
    }
}
milniy87 Уровень 41
18 марта 2023
Клиентский код:


import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class Client {
    public static void main(String[] args) {
        try {
            Registry registry = LocateRegistry.getRegistry();
            Person stub = (Person) registry.lookup("Person");

            System.out.println("Name: " + stub.getName());
            System.out.println("Age: " + stub.getAge());
        } catch (Exception e) {
            System.err.println("Client exception: " + e.toString());
            e.printStackTrace();
        }
    }
}
В этом примере мы создали экземпляр класса PersonImpl, который реализует интерфейс Person. Затем мы экспортировали этот объект, используя UnicastRemoteObject, чтобы создать его удаленную версию (stub), которая может быть передана по RMI. Мы зарегистрировали этот stub на сервере в реестре RMI под именем "Person". Когда клиент запускает свой код, он получает stub из реестра, вызывает методы на удаленном объекте, и выводит результаты в консоль.
Denis Odesskiy Уровень 46
19 сентября 2024
Ещё надо настроить на клиент-сервере политику безопасности через SecurityManager, который однако deprecated😒. Или использовать REST API или еще чего...
safelogj Уровень 51
21 сентября 2024
В духе JR , в описании указать класс Naming, а в примере использовать Registry :)
At0m Уровень 26
31 января 2022
Никто такие вопросы не задает на собесах)
Алексей Уровень 35
24 февраля 2023
Какие были?
PaiMei in J# Уровень 35
20 октября 2021
Небольшая шпаргалка по RMI, мб кому-нибудь пригодится)
PaiMei in J# Уровень 35
20 октября 2021
Кто-нибудь может простым языком (можно и сложным, главное хоть как-нибудь) объяснить ДЛЯ ЧЕГО нам нужны классы StringReader и StringWriter? Просмотрел кучу информации но так и не понимаю, нафига их использовать, вот одно из стандартных описаний в инете A StringReader class converts the ordinary string into reader, while a StringWriter class collects the character in a string buffer, which is used to construct a string. И как бы да, вроде все ясно и очевидно, вот только не понятно, ГДЕ они могут пригодится? "...StringWriter class collect characters in a string buffer, which is used to construct a string", а в чем тут собственно разница с обычной строкой, которую можно так же создать, передав ей в конструктор массив char[ ] ??
KristinaL Уровень 35
31 октября 2021
Думаю, что это может пригодиться, если ты используешь методы, которые работают только с ридерами и райтерами, а тебе нужно провести операции иногда с файлом, например, а иногда со строкой, а иногда еще с чем-нибудь. Получается универсально.
Edward Northwind Уровень 37
17 января 2023
Мне в голому пришло только тестирование. Заменяешь подобными реальные ридеры и врайтеры файлов, и вот тебе юнит тест без долго обращения к диску.
23 сентября 2021
Хорошие вопросы для тех кто хочет на роботу .
Harpegnathos_venator Уровень 41
9 марта 2021
Ни разу таких вопросов не было)))
Уровень 1
11 января 2021
на каждом уровне список вопросов, которые на собесах не замечал подобных , даже близко...
Антон Уровень 35
29 ноября 2020
Dude Уровень 37
11 ноября 2020
опять собес завалил....
Михаил Уровень 36
25 декабря 2020
Можешь накидать несколько вопросов, которые задавали?