Precisa de muita complicação pra isso não, é só você gerar direto pra download, seria algo assim:
public class ServletArquivo extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String path = getServletContext().getRealPath("/temp");
File arq = gerarArquivo(path);
response.setContentType("text/plain");
response.addHeader("Content-Disposition", "attachment;filename="+arq.getName());
FileInputStream in = new FileInputStream(arq);
PrintWriter out = response.getWriter();
int b;
while((b = in.read())>-1){
out.write(b);
}
out.flush();
out.close();
}
}
Nesse caso seria criada uma pasta temp dentro do diretorio da aplicação, o metodo gerarArquivo() recebe o caminho da pasta, e cria um arquivo qualquer lá, pode ser com qualquer nome, até mesmo um nome aleatorio, e retorna uma referencia para o arquivo criado em um java.io.File, aí o Servlet envia isso para o cliente... o nome do arquivo que o cliente recebe, é o nome especificado por filename= no addHeader(), no caso eu coloquei o mesmo nome do arquivo em disco, mas você pode colocar qualquer coisa...
Se você nem quiser salvar o arquivo no disco, é só ir escrevendo os bytes no out.write() e pronto, o cliente recebe o arquivo...