2010-11-26 7 views
5

Quiero usar java para leer un archivo de registro weblogic mientras weblogic escribe log en él (en búfer), pero solo quiero leer el contenido que está presente cuando comienzo para leerloJava IO: lea un archivo grande mientras está escribiendo otra aplicación

¿cómo puedo hacer esto?

public class DemoReader implements Runnable{ 

    public void run() { 
     File f = new File ("c:\\test.txt"); 
     long length = f.length(); 
     long readedBytes = 0; 
     System.out.println(length); 
     try { 
      BufferedReader fr = new BufferedReader(new FileReader(f)); 
      String line = ""; 
      while((line = fr.readLine()) != null && readedBytes < length){ 
       readedBytes += line.getBytes().length; 
       if(readedBytes > length){ 
        break; 
       }else{ 
        System.out.println(line); 
       } 
      } 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

} 
+4

Copie el archivo y lea de eso. Hecho. :) – karim79

+0

Agregó un código de demostración –

Respuesta

1

En tanto que el archivo de registro solamente está bloqueado para el acceso de escritura que debe ser capaz de copiar como @ karim79 ha sugerido. Después de eso, la copia te pertenece para que puedas hacer lo que quieras con ella.

Aquí hay un código que debe alcanzar lo que está buscando - sólo copia el archivo de byte por byte en el flujo System.out:

public class Main { 

    public static void main(String[] args) throws IOException { 

    // Identify your log file 
    File file = new File("path/to/your/logs/example.log"); 

    // Work out the length at the start (before Weblogic starts writing again) 
    long size = file.length(); 

    // Read in the data using a buffer 
    InputStream is = new FileInputStream(file); 
    BufferedInputStream bis = new BufferedInputStream(is); 

    long byteCount=0; 

    int result; 
    do { 
     // Read a single byte 
     result = bis.read(); 
     if (result != -1) 
     { 
     // Do something with your log 
     System.out.write(result); 
     } else { 
     // Reached EOF 
     break; 
     } 
     byteCount++; 
    } while (byteCount<size); 

    // Printing this causes a final flush of the System.out buffer 
    System.out.printf("%nBytes read=%d",byteCount); 

    bis.close(); 
    is.close(); 
    } 

} 

Y ahí lo tienes.

Notas sobre los archivos de registro

Si el archivo de registro es enorme (por ejemplo> 1 Gb), entonces usted realmente debería considerar la posibilidad de cambiar su configuración de registro para incorporar un archivo de registro de rodadura que se romperá automáticamente los registros en trozos (digamos 1Mb) que son más adecuados para ver en editores de shell (como vim).

+0

contando los bytes línea por línea es mejor, entonces podemos procesarlo línea por línea – idiotgenius

3

Usted puede obtener el tamaño del archivo en el momento en que está comenzando a leer, y después lee N número de bytes (suponiendo que el archivo no está bloqueado por el escritor y su contenido desde 0 a N no va Ser cambiado).

Cuestiones relacionadas