Если говорить языком фактов то в кодировке Base64 нельзя использовать символ "_", а можно только от буквы A до символа "/" в диапазоне ASCII. Где и как оказался символ подчеркивания - непонятно.
Тут - какая-то обще-системная ошибка, и сообщение java.net.ConnectException: Connection refused: connect
совершенно не несет никакой информации где искать проблему. Давайте переведем задачу из плоскости Java в плоскость сетей и протоколов. Вобщем для начала надо подёргать порт снаружи используя утилиты telnet или netcat и далее уже смотреть по ошибкам.
nc -w 3 -zv tester17.com 33333
когда получишь сообщение : "Connection .... succeded!" - то можно возвращаться в Java кодинг.
Если посмотреть в историю - то JVM создавалась в 1996 году как платформа для встраиваемой техники. Холодильники. Кофеварки. Техзадание такое было. И разумеется в саму спеку были заложены ограничения которые позволят байткоду собираться даже на очень слабых машинах. Где мало регистров и мало разрядности. И мы имеем стековую машину (наподобие калькулятора МК-60) в которой принципиально нет регистровой адресации. В отличие от платформ .Net/clr где есть более современная адаптация к процессору. Вобщем если вы заходите написать код который будет friendly к SSE/AVX регистрам - то у вас ничего не выйдет. На уровне JVM - максимальная разрядность алгебраического типа - 64 бит (знаковые). Это как мне кажется наиболее сильное ограничение. И неизвестно когда спека будет расширена. Насколько я вижу Oracle и JCP очень консервативны в этом вопросе и неохотно вносят изменения в сам байткод.
Основная разница - это контроль границ. В runtime, java не позволит вам выскочить вне диапазона индексов.
В c++ runtime - никакого массива не существует. Можно как получать различные аномалии в поведении приложения, (повредить другие структуры данных процесса), так и получать молчаливое поведение, что усложняет поиск ошибок.
В базовой комплектации интерфейс Collection позволяет извлекать объекты через iterator(). Чуть позже в новых версиях jdk - появляется последовательный stream(), который вызывает iterator. И параллельный stream, который не всегда поддерживается для всех реализаций коллекций. Например файл класса STDIN - только последователен и обернуть его параллелизмом - принципиально невозможно.
Все прочие магические методы - просто переходники или адаптеры над итератором.
Правильный ответ - нет. Функционал регулярок - это найти и указать найденное. Вы можете посмотреть как работает Pattern/Matcher в паре. Они просто находят группы выражений и указывают пальцем дескыть вот здесь матчинг подошел.
Но есть API языков программирования такой как String::replace который позволяет с ИСПОЛЬЗОВАНИЕМ
регулярок найти-и-заменить одной операцией.
Но данную конкретную операцию - капитализацию первой буквы в Java-строке я-бы сделал просто через substring() и toUpper(). Это будет по времени в сотни раз быстрее т.к. мы не будем вовлекать в процесс компилляцию паттерна регулярок. Грубо говоря если ты решил пальнуть по птичкам - то бери рогатку. Пушка тебе не нужна.
Здесь заложена потенциальная ошибка гонок. Главный и дочерний потоки не синхронизируются через объекты синхронизации. Это означает что если дочерний объект тупанул в фазе например JIT компилляции то главный его не будет ждать и завершит приложение. И мы можем (теоретически) не увидеть даже следов работы дочернего потока. Искусственные паузы sleep() не являются механизмом синхронизации и их не стоит использовать для той цели которую хочет достичь автор. Нужен нормальный join. Или ожидание финала ThreadPool.
1) Что такое data? Почему ты названия классов пишешь с маленькой буквы? Это вроде бы пустяк но это раздражает читающего твой код. Возникает подозрение об ошибке или о некорректной копи-пасте.
2) Очень сложно понять что ты хотел получить на выходе. Нарисуй образец желаемого документа в Json и тебе помогут быстрее.
По смыслу эта задача похожа на Квадрат Полибия. Автор может погуглить по этому ключевому слову и найти готовые реализации. Но мне кажется что у автора еще куда большие пробелы в навыках. Нужно иметь навык в написании вложенных циклов.
Тоесть потренироваться на простых задачах.
А эту сложную задачу либо вообще отложить пока. Либо разбить на последовательность элементарных. Как разбить я не знаю. Это автор должен сам для себя придумать исходя из своего понимания шагов.