Usted podría tratar de subclases FilterInputStream.
A partir de los documentos:
A FilterInputStream contiene algún otro flujo de entrada, que utiliza como su fuente básica de datos, posiblemente transformación de los datos en el camino o que proporcionan funcionalidades adicionales. La clase FilterInputStream simplemente reemplaza todos los métodos de InputStream con versiones que pasan todas las solicitudes a la corriente de entrada contenida. Las subclases de FilterInputStream pueden omitir algunos de estos métodos y también pueden proporcionar métodos y campos adicionales.
Aquí hay una puñalada inicial. No es la mejor manera de resolverlo. Es probable que desee anular algunos métodos más, y tal vez ir con un lector en su lugar. (O tal vez incluso utilizar un escáner y procesar el archivo línea por línea.)
import java.io.*;
import java.util.*;
public class Test {
public static void main(String args[]) throws IOException {
String str = "Hello world, this is the value one ${bar} and this " +
"is the value two ${foo}";
// The "original" input stream could just as well be a FileInputStream.
InputStream someInputStream = new StringBufferInputStream(str);
InputStream modified = new SubstitutionStream(someInputStream);
int c;
while ((c = modified.read()) != -1)
System.out.print((char) c);
modified.close();
}
}
class SubstitutionStream extends FilterInputStream {
Map<String, String> valuation = new HashMap<String, String>() {{
put("foo", "123");
put("bar", "789");
}};
public SubstitutionStream(InputStream src) {
super(src);
}
LinkedList<Character> buf = new LinkedList<Character>();
public int read() throws IOException {
if (!buf.isEmpty())
return buf.remove();
int c = super.read();
if (c != '$')
return c;
int c2 = super.read();
if (c2 == '{') {
StringBuffer varId = new StringBuffer();
while ((c2 = super.read()) != '}')
varId.append((char) c2);
for (char vc : valuation.get(varId.toString()).toCharArray())
buf.add(vc);
return buf.remove();
} else {
buf.add((char) c2);
return c;
}
}
}
Salida:
Hello world, this is the value one 789 and this is the value two 123
1 - esta respuesta me hizo borrar mi propio texto inmediatamente. –
Hola @BalusC ¿Su respuesta también es aplicable a los archivos de Excel? Me gustaría editar el inputstream y enviarlo al usuario. Aquí está mi mensaje: http://stackoverflow.com/questions/34893954/grails-edit-form-multipart-file-from-client-and-send-it-back-to-the-clien?noredirect=1#comment57594193_34893954 Gracias tú. – user3714598