Я продемонстрирую универсальный класс Java, который будет читать и записывать объекты любого типа объектов, переданных ему (любой Примитивный тип данных или ваши пользовательские классы Как объяснено в этом примере)
Подумайте, у вас есть класс с именем Студенты в котором есть имя и удостоверение личности для студента.
Теперь также рассмотрим другой класс с именем Сотрудники у которых также есть имя , идентификатор и часы работы .
Теперь мы хотим реализовать универсальный класс, который будет автоматически записывать объект в файл с именем файла, начинающимся с имени класса . Теперь, если уже есть .txt файл того же класса, он должен добавить файл с заданным новым объектом.
Программа также должна быть способна читать требуемый файл. Метод read() будет возвращать общий ArrayList который мы можем ввести привести к нашему требуемому объекту, например, если мы хотим прочитать список студентов, хранящийся в txt-файле, тогда метод read() вернет общий список массивов, и мы можем ввести тип его в Список массивов студентов и легко использовать его.
Следовательно, наше Требование Удовлетворяется,
Программа для чтения и записи объектов любого типа плюс она записывает объекты того же типа в свои собственные текстовые файлы (добавляет, если они уже присутствуют, или создает новые, если объект такого типа записан в 1-й раз), что делает его потрясающим кодом, который автоматически обрабатывает файлы.
Итак, сначала я создал два класса с именем Students.java и Employees.java и мой основной класс – это Main.java .
Main.java показано в конце этого поста, в то время как Student.java И Сотрудники.java не показана из соображений сложности, но если вам действительно нужно их увидеть.
Посетить Здесь для более подробного объяснения с пояснением вывода.
В Students.java Я сделал Конструктор , геттеры и установщики для имени и я d
В Обоих Классах Я Создал Метод С Именем getData() Это Просто Отображает Данные (Имя, идентификатор, часы работы и т.д.) нашего Объекта.
Создание Универсального Класса
Я сделал имя класса GenericRead_Write.java и я параметризовал его с помощью . Мы также создали поле с именем объект с Типом T . Теперь в Конструктор Я установил объект экземпляра с локально переданным объектом . Назначение переменной состояние объясняется в коде .
public class GenericRead_Write{ T object; int state = 0; public GenericRead_Write(T object){ this.object = object; } public void write(){/* CODE EXPLAINED NEXT */}; public ArrayList read(){/* CODE EXPLAINED NEXT */}; }
Универсальная запись() Метод
public void write(){ state = 1; String fileName = object.getClass().getName() + ".txt"; ArrayListlist = new ArrayList<>(); list = read(); list.add(object); try { FileOutputStream file = new FileOutputStream(fileName); ObjectOutputStream outputFile = new ObjectOutputStream(file); for (T obj: list) { outputFile.writeObject(obj); } }catch (Exception e){ JOptionPane.showMessageDialog(null, e.getMessage()); } }
Объяснение
Строка.getClass().getName() + ".txt";
Это в основном получает имя объекта вы прошли в Общий класс с добавлением .txt в конце этого. Далее мы создадим список массивов с T в качестве параметра типа со списком имен.
список()
В четвертой строке мы вызываем метод read() , чтобы проверить, есть ли файл с именем Имя файла уже присутствует или нет. Если он присутствует, то мы читаем этот файл и сохраняем объекты в списке, предполагая, что для студентов или сотрудников файла нет [Это два тестовых класса, которые я сделал для демонстрации] на этом этапе мы добавляем объект, переданный пользователем, в список с именем ArrayList. И в блоке Try и Catch мы создаем объект FileOutStream с именем файла, являющимся именем файла (он также автоматически создает файл с таким именем, если его нет), а затем мы создаем объект для ObjectOutputStream для записи объекта в файл. И, наконец, с помощью цикла Foreach мы записываем объект в файл. Перед компиляцией файла нет.
Общее чтение() Метод
public ArrayListread() { String fileName = object.getClass().getName() + ".txt"; ArrayList list = new ArrayList<>(); try{ FileInputStream file = new FileInputStream(fileName); ObjectInputStream inputFile = new ObjectInputStream(file); boolean END_OF_FILE = false; while (!END_OF_FILE){ try { list.add((T) inputFile.readObject()); }catch (EOFException e){ // When reaches END OF FILE we set the Boolean END_OF_FILE to TRUE END_OF_FILE = true; }catch (Exception e){ JOptionPane.showMessageDialog(null, e.getMessage()); } } }catch (FileNotFoundException j){ if(state == 1){ // Do Nothing... When state is 1 it means the write method is called // Since, the wite method will automatcally create new file is not found // So we don't require our program to show exception if read() is called from write() }else { // When state is 0 means the write() is not called so if file does not exits // in this case we show Error Message that file is not found JOptionPane.showMessageDialog(null, j.getMessage()); } }catch (Exception e){ JOptionPane.showMessageDialog(null, e.getMessage()); } return list; }
Объяснение
Прежде всего, этот метод вернет универсальный список массивов, поэтому мы использовали ArrayList
в качестве возвращаемого типа.
Как и в предыдущем случае, мы создаем точное Имя файла и Список массивов названный список . Теперь для чтения объектов мы будем использовать объект FileInputStream и передайте его в ObjectInputStream . Теперь мы создадим логическую переменную с именем END_OF_FILE , которая изначально будет ложной теперь в цикле while мы можем не (!) //КОНЕЦ ФАЙЛА Таким образом, цикл будет выполняться, считывать объекты и сохранять их в Список массивов . Теперь в заявлении catch мы можем использовать Исключение EOFException (Исключение КОНЦА ФАЙЛА) и когда мы дойдем до конца, мы можем просто поставить END_OF_FILE равно TRUE Следовательно, цикл закончится. Теперь мы можем просто вернуть список .
Сейчас в Main.java мы можем получить доступ к методам наших объектов , возвращаемых этим списком , используя тип приведение .
Если у вас есть какие-либо вопросы, задайте их мне в разделе комментариев. Посещать, мой сайт для получения дополнительных руководств и примеров
Оригинал: “https://dev.to/saimhafeez20/read-and-sort-data-generically-java-generics-5bnk”