questa versione è un po più compatta

codice:
import java.io.PrintStream;
import java.util.*;
import java.util.StringTokenizer;
    
public class permutazioni
{
	static int ind=0;
	public permutazioni(){
		}
	public static void permutate(){
		String str="Ciao sono io";
        String[]  tmpStr = null; 
        StringTokenizer tok = new StringTokenizer(str);
        int countToken = tok.countTokens();
        tmpStr = new String[countToken];

        for (int i = 0; i < countToken; i++){
            tmpStr[i] = tok.nextToken();
                }
       int lu= countToken;
   
      String[][]qw=new String[factorial(lu)][lu];
	ArrayList a=new ArrayList();
	String s="";
	for(int i=0;i<=lu-1;i++){
		s=Integer.toString(i+1);
		a.add(s);
	}
	   int []B=new int[a.size()];
	   	   for (int i=0;i<=B.length-1;i++){
	   	B[i]=i;
	   	}
	generaPermutazioni(qw,tmpStr,B,0);
	}
	
	    public static void generaPermutazioni(String[][]qw,String[]s,int[]B, int estremoinferiore)
	    {   int temp;
	    
	   		// stampa permutazione attuale
	    if (estremoinferiore==B.length-1) {
			for (int j=0; j<B.length; j++){ 
				qw[ind][j]=s[B[j]];
				System.out.print(qw[ind][j]+" ");
			}ind++;
			System.out.println();
		    }
			for (int i=estremoinferiore; i<B.length; i++)
			  {temp = B[estremoinferiore];
			   B[estremoinferiore] = B[i];
			   B[i] = temp;
			   generaPermutazioni(qw,s,B, estremoinferiore+1);
			   temp = B[estremoinferiore];
			   B[estremoinferiore] = B[i];
			   B[i] = temp;
			}    }
	    
	    private static int factorial(int num){
	        int count = 1;
	        for (int i = 2; i <= num; i++) {
	            count *= i;
	        }
	        
	        return count;
	    }

	    public static void main(String[] _args)
    { permutate();
    }}
manca solo la scrittura su file