Se você estiver trabalhando em um idioma que o suporte, eu forneceria um método Save que usa um Stream. Dessa forma, o usuário pode salvar os dados onde quiser.
Demora 20 segundos a mais para gravar do que salvar apenas em um arquivo, mas é facilmente compreendido por um programador e, no site de chamada, é muito claro o que realmente acontece.
A maneira como você o descreveu (um objeto que lê entrada e sai para outro arquivo) parece estranho. Qual é o propósito de construir um objeto que faz tudo durante a construção?
Você chamaria assim?
var stuff = DoStuff();
new SaveFileWeirdClass(stuff);
return;
Para qualquer implementação razoável de SaveFileWeirdClass, eu não esperaria efeitos colaterais apenas da criação. Lendo um arquivo - tudo bem. Criando um arquivo? Não.
Para mim, parece mais claro assim:
var stuff = new StuffReader(); //Better name needed...
string filePath = this.whatever;
using(Stream stream = new FileStream(filePath))
stuff.Save(stream);