Всё зависит от того, что программе нужно делать. Если вывалить какое-то графическое окно и красиво считать там циферки -- да, можно на Джаве. И работать будет практицки везде.
А вот если надо работать с железом -- то частенько на Джаве без войны -- никак. Простой пример. Пишу небольшую программу, которая будет общаться с железкой через COM-порт. На Джаве для этого есть несколько библиотек. Оригинальная -- JavaComm. Не обновлялась с Джавы 1.2. Не входит в комплект стандартной поставки Джавы. Клон JavaComm -- RxTx. Проект ушёл в оффлайн. jSSC -- вроде живая... Для каждой из них нужно доставлять библиотеки и долго шаманить. Общее ощущение корявости и отсутствие человеческой документации полностью меня удручили.
Знаете, у кого есть хорошие и прекрасно документированные библиотеки для работы с серийными портами? ВНЕЗАПНО, у Майкрософт.
Там есть класс SerialPort с блекджеком и шлюхами: http://msdn.microsoft.com/en-us/library/system.io.ports.serialport%28v=vs.110%29.aspx
Красота же, блин! Но программа, написанная на C#, не запустится под Линуксом.
А что Си? А на Си писать под серийный порт можно, используя termios.h. И этот файл есть практически на всех итерациях хрюниксов -- на Линупсе, на FreeBSD, и даже на MacOS, и, более того, на cygwin под Виндой! Так что пусть бинарник и не запустится -- плевать я на это хотел, перекомпилировать, что, долго, что ли? Везде же есть животворящий gcc.
Только вот рисовать, используя termios.h, скажем так, непросто. Там надо коряги кода с битовыми операциями и флагами. Но есть добрый человек Теуниз ван Беелен (не знаю, правильно ли пишу его имя), который нарисовал свою библиотеку RS232, где работа с серийным портом была сильно упрощена:
http://www.teuniz.net/RS-232
Там нет работы с прерываниями (используется поллинг) и прочего, но для моих целей -- вполне достаточно. Мне сильно сложного не надо -- читать и писать char'ы в порт.