Вам нужно будет установить пробелы как "обычные символы".Это означает, что они будут возвращены в качестве токенов самостоятельно, но не свернуты в другие токены.Пример:
StreamTokenizer st = new StreamTokenizer(new StringReader("5 + 5"));
st.ordinaryChar(32);
int tt = st.nextToken(); // tt = TT_NUMBER, st.nval = 5
tt = st.nextToken(); // tt = 32 (' ')
tt = st.nextToken(); // tt = 43 ('+')
tt = st.nextToken(); // tt = 32 (' ')
tt = st.nextToken(); // tt = TT_NUMBER, st.nval = 5
tt = st.nextToken(); // tt = TT_EOF
К сожалению, вам придется иметь дело с пробелами в вашем парсере.Я бы порекомендовал прокатить свой собственный токенизатор.Если вы не делаете что-то быстрое и грязное, StreamTokenizer почти всегда является неправильным выбором.