Runtime.exec
не делает то, что вы думаете, что делает. В вашей команде он вызывает «ls» с аргументами «-l», «>» и «data.txt», что и идет не так. Это как если бы вы написали это:
String[] cmd = new String[] {"ls", "-l", ">", "data.txt"};
Если вы действительно хотите вызвать оболочку и использовать оператор перенаправления оболочки, это достаточно просто, вызовите оболочку с вашей командой в качестве аргумента оболочки:
String[] cmd = new String[] {"sh", "-c", "ls -l > data.txt"};
Конечно, вы можете просто сделать это на Java, как подсказывают другие ответы.