Транзакционность

  • 9
  • Недоступна
Сделать метод joinData транзакционным, т.е. если произошел сбой, то данные не должны быть изменены. 1. Считать с консоли 2 имени файла 2. Считать построчно данные из файлов. Из первого файла - в allLines, из второго - в forRemoveLines В методе joinData: 3. Если список allLines содержит все строки из
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (141)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Mike Woo18 уровень, Москва
вчера, 12:15
К вопросу "Нужны ли здесь потоки": фактически, программа симулирует нарушение целостности полученных данных (например, обрыв связи или завершение потока чтения из-за ошибки) и корректную обработку данной ситуации (если содержимое файлов равно = всё ОК, если отличается - симулируется сбой). Когда что-то не сработало, и надо вернуться к состоянию, которое было ДО начала транзакции. Пример НЕ транзакционного подхода: - Пришли в магазин - Отдали продавцу деньги - У продавца случился AssOverflow и вместо того, чтобы выдать вам продукты он закрыл магазин - Вы пришли домой, без денег, без продуктов, жена бьет сковородой, жизнь падает Пример транзакционного подхода: - Пришли в магазин (начало транзакции) - Достали деньги, продавец достал продукты - Обменялись ими одновременно (конец транзакции) Пример условный, но суть - именно такая. Основное правило: либо транзакция происходит успешно, либо всё остается так, как будто она даже не начиналась.
Mike Woo18 уровень, Москва
вчера, 12:21
Теперь о том, как по идее должен быть выстроен алгоритм для симуляции транзакций: 0) Создаем два файла, либо идентичных (всё ОК), либо разных - чтобы симулировать сбой 1) В main читаем имена файлов и их содержимое 2) Далее в методе joinData() проводим сравнение данных и, если его нет, бросаем исключение Потоки здесь в принципе не подразумеваются.
Don Fear19 уровень, Екатеринбург
5 марта, 13:38
Сделал. Но так и не могу понять, что должна была показать / чему научить эта задача. Кто-нибуть может мне разъяснить?
Максим19 уровень, Минск
9 марта, 18:41
Например, попробовать решить задачу с созданием 2-х дополнительных потоков, которые будут считывать данные из файлов и сохранять их в соответствующих переменных.
Александр19 уровень, Казань
28 февраля, 12:36
Считывал построчно файлы. В обоих файлах была строка с цифрой 5. но когда я проверял есть ли эта цифра в файле:
forRemoveLines.contains("5");  //false
Проверил длину:
forRemoveLines.get(0).length(); // 2  o_0
Какой то символ затесался лишний:
System.out.println( (int) forRemoveLines.get(0).charAt(0)); //65279
BOM символ кодировки UTF-8. Надо файл пересохранить черзе Notepad++ без BOM
Antony.Glim26 уровень
17 февраля, 09:28
Условие задачи написано не однозначно
Shamil20 уровень
16 февраля, 01:15
Короче, удалось решить без единого цикла. Конечно нужно отдать должное "Philip J 8 августа 2018, 13:18", где даже чтение строк из файла без цикла, признаюсь для меня было новшество. И если не трудно посмотрите мой комментарий к комментарию Sergii Mryshchuk, Киев 2 августа 2018, 17:28 Если кому интересно мой код тут доступ возможен только после решения задачи)))), ото мне уже один тип пытался сделал замечание то что я выкладываю готовое решение
Александр19 уровень, Казань
28 февраля, 12:47
Без создания переменной.
new Solution().joinData();
Shamil20 уровень
28 февраля, 13:27
Можно так, разницы нетe для JVM. Если думать в перед то лучше делать с переменной, по этому лучше сейчас наработать правильную привычку нежили потом исправлять.
Максим19 уровень, Минск
9 марта, 18:24
Хорошее решение по считыванию из файла в одну строчку, а я циклы городил. Еще можно было считывание из файлов организовать в виде 2-х потоков, вообще супер было бы.
Nik24 уровень
3 февраля, 05:47
Никак с этими ридерами не понимаю! Все время решаю вслепую(представляю как будто он считывает только содержимое файла) тогда как на самом деле, после считывания и вывода в консоль он выводит кучу непонятных слешей и букв! И где то в середине этой мути лежат строки которые напечатаны в текстовом редакторе. Валидатор мои решения принимает, но сам я попробовать свои проги не могу. Помогите кто сталкивался!
Nik24 уровень
3 февраля, 05:50
пример. В файле три строки: Ivan Rodil Devchonku считываем через BufferedReader reader = new BufferedReader(new FileReader(path)); выводим в консоль построчно: \pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\ql \li0\ri0\nowidctlpar\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1049 \ltrch\fcs0 \fs20\lang1049\langfe1033\cgrid\langnp1049\langfenp1033 {\rtlch\fcs1 \af5\afs24\alang1033 \ltrch\fcs0 \f5\fs24\lang1033\langfe1033\langnp1033\insrsid4029187 \par }{\rtlch\fcs1 \af5\afs24\alang1033 \ltrch\fcs0 \f5\fs24\lang1033\langfe1033\langnp1033\insrsid7678282 Ivan \par Rodil \par Devchonku 504b0304140006000800000021009be8704ffc0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb6ac3301045f785fe83d0b6d8 72ba28a5d8cea28f5d1f8bf40306796c8bd823214d42f2f71d3b2e941202856e04d2ccbdf7cca85c1fc641ed3126e7a9d2abbcd00ac9fac65157e9cfcd4b76af PS: комп Мак, формат файла .rtf
Nik24 уровень
6 февраля, 06:50
короче если у кого то тоже мас и такая же фигня вот ссылка http://proyabloko.com/sekrety/kak-nastroit-kodirovku-txt-na-mac/ потом гуглим как создавать простые .txt на мас. И будет вам счастье!
Eugene18 уровень
7 марта, 22:21
У меня тоже mac. Для себя решил проблему установкой Sublime Text. После создания .txt файла сохраняете его в UTF-8 (без BOM) и всё в порядке. До этого тоже порядком намучился.
S3R3N1TY28 уровень, Санкт-Петербург
29 января, 23:14
Решил с первого раза, но валидатор принял с 3-его ! Условие считать в начале два имени файла не выполнялось по его мнению, так как: у меня они считывались каждое название в своем потоке, а ему надо в main. Видимо это связано с тем, что: Два потока сразу стартуют в main и не ясно, какой первым обращается ко мне и спрашивает ввести в консоль путь к файлу. А если написать так:
fileName1 = reader.readLine();
    fileName2 = reader.readLine();
    ThreadPotok1 potok1 = new ThreadPotok1(fileName1);
    ThreadPotok2 potok2 = new ThreadPotok2(fileName2);
То в начале я задам два имени файла и передам их правильно в нужный поток, который уже правильно будет читать файл. Задача понравилась, интересно было самому реализовать свою первую пусть и небольшую, но многопоточную программу)) Такие моменты придают решимости двигаться дальше. P.s. читал файлы видимо "по-старинке" в цикле, внизу в комментах одной командой оказывается можно.
while ((strLine = br.readLine()) != null) {
                    forRemoveLines.add(strLine);
Кол-во материи после этой задачи))
Максим19 уровень, Минск
9 марта, 18:37
Я сначала без создания дополнительных потоков решил, тоже в циклах файлы читал. После твоего комментария тоже решил создать многопоточную программу )) В main() стартовал два потока, однако сделал их объектами одного класса: public static class FileReaderThread implements Runnable {} В классе создал приватное поле: private List<String> lines; для каждого объекта свое. После чего в main() добавил считанные данные в статические переменные: allLines.addAll(readerAllLines.getLines());
Georgy18 уровень, Москва
29 января, 07:40
А я наоборот оставил нагромождение циклов и еще специально Iterator запилил, а то уже давно не использовал. Регулярные выражения и готовые методы это тоже маст хэв, не спорю, но для закрепления пройденного лучше по старинке :) И еще, а где многопоточность-то? Ни единого Thread или Runnable.
Николай Малинчик41 уровень, Санкт-Петербург
26 января, 08:21
городил трехэтажные циклы, все работало, а потом наткнулся на чудесные методы у списков containsAll и removeAll ) что уменьшило код из 16 строк в 6)
Антон19 уровень
23 января, 16:15
Было жестко