Leer un archivo con Java
Para leer un fichero con Java, en la mayoría de las ocasiones será suficiente el siguiente código:
private String getContenidoPDF (String rutaFicheroPDF) throws Exception {
StringBuffer contenidoPDF = new StringBuffer ();
BufferedReader br = null;
try {
br = new BufferedReader (new FileReader(new File (rutaFicheroPDF)));
String linea;
while (( linea = br.readLine()) != null){
contenidoPDF.append(linea);
contenidoPDF.append(System.getProperty("line.separator"));
}
} catch (Exception e) {
System.out.println("Excepcion – " + e.toString());
} finally {
if (br!= null) {
br.close();
}
}
return contenidoPDF.toString();
}
Perdón por el System.out.println, aún estaba haciendo pruebas cuando lo copié aquí.
Para escribir el String a un fichero, podemos utilizar:
FileOutputStream fos = null;
try { fos = new FileOutputStream (new File (rutaFijaPDF + "salida.pdf")); fos.write(contenidoPDF.getBytes()); } catch (Exception e) { e.printStackTrace(); } finally { if (fos != null) { fos.close(); } }
Pero no siempre nos vale este código. En concreto, yo me he encontrado que al leer el contenido de un fichero PDF (que no es texto plano, sino una combinación de metadatos, datos e imágenes todo ello comprimido), pasarlo a un String y luego escribirlo a un fichero no había forma de recuperar el original. La razón El problema está al pasar byte [] a String, ya que codifica los bytes a caracteres UNICODE, dando problemas en determinados bytes por no encontrar un caracter adecuado para representarlo. Solución Es un problema análogo al envío de ficheros por mail. No pasar directamente a String, sino codificarlo en BASE64. Por tanto al recuperarlo debemos primero decodificar el texto. Sería algo así: String rutaFijaPDF = "C:"+ File.separator+"workspace"+File.separator+"proyectos"+File.separator; InputStream is = null; ByteArrayOutputStream bos = new ByteArrayOutputStream(); FileOutputStream fos = null; BASE64Encoder encoder = new BASE64Encoder (); BASE64Decoder decoder = new BASE64Decoder (); byte[ ] almacenamiento = new byte[4 * 1024]; // 4K buffer int bytesLeidos; byte[] bytespdf; try { is = new BufferedInputStream(new FileInputStream (new File(rutaFijaPDF + "espince" + ".pdf"))); while ((bytesLeidos = is.read(almacenamiento)) != -1) { bos.write(almacenamiento, 0, bytesLeidos); } bytespdf = bos.toByteArray(); fos = new FileOutputStream(new File (rutaFijaPDF + "salida.pdf")); fos.write(decoder.decodeBuffer(encoder.encodeBuffer(bytespdf))); } finally { if (is != null) { is.close( ); } if (bos != null) { bos.close(); } if (fos != null) { fos.close(); } } encoder.encodeBuffer(bytespdf) devuelve un String con el contenido del fichero PDF codificado en BASE64.
[tags]java[/tags]

