Daten aus sich laufend verändernden File lesen

hbrauchl

Mitglied
Hallo!

Gibt es in Java eine Möglichkeit Daten aus einem sich laufend verändernden File auszulesen?
Interessant wären für mich dabei nur die Dinge die dauernd "neu" dazukommen.

Die Idee dahinter ist, daß ich aus meiner Wunschapplikation (extern) mittels Auswertung
des sich laufend ändernden Log-Files Daten bekommen möchte.
---> Phoner.exe (http://www.phoner.de/)

Hoffentlich kann mir jemand helfen.

Danke im voraus.

LG,
Hans
 
Jo, guck mal nach RandomAccessFile.
Damit kannst du per seek(); an eine bestimmte Stelle in der Datei springen und von dort erst anfangen zu lesen. Du musst dir dann nur die Stelle merken an der Schluß war.
 
Hallo,

schau mal hier:
Java:
/**
 * 
 */
package de.tutorials;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * @author Thomas.Darimont
 * 
 */
public class FileTrackingExample {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Executors.newSingleThreadExecutor().execute(new FileTracker(new File("c:/test.txt")));
	}

	static class FileTracker implements Runnable {

		final File file;
		long lastModifiedAtLastCheck;
		long lastFileLength;
		volatile boolean stopped;

		public FileTracker(File file) {
			super();
			this.file = file;
		}

		public void run() {
			RandomAccessFile randomAccessFile = null;
			try {
				randomAccessFile = new RandomAccessFile(file,
						"r");
				byte[] buffer = new byte[16384];
				while (!isStopped()) {
					if (file.lastModified() > lastModifiedAtLastCheck) {
						long length = file.length();
						randomAccessFile.seek(lastFileLength);
						for (int bytesRead = randomAccessFile.read(buffer); bytesRead > 0; bytesRead = randomAccessFile
								.read(buffer)) {
							System.out.write(buffer,0,bytesRead);
						}
						lastFileLength = length;
						lastModifiedAtLastCheck = file.lastModified();
					}else{
						TimeUnit.MILLISECONDS.sleep(500L);
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			}finally{
				if(null != randomAccessFile){
					try {
						randomAccessFile.close();
					} catch (IOException e) {
						new RuntimeException(e);
					}
				}
			}
		}

		public boolean isStopped() {
			return stopped;
		}

		public void setStopped(boolean stop) {
			this.stopped = stop;
		}

	}

}

Gruß Tom
 
Hallo!

Habe mir Deine Methode mal angesehen:

Das Problem dabei ist, daß Dein lesender Thread die Schreibrechte während des Lesens
ausser Kraft setzt.
Somit kann ich mein Problem nicht bewältigen.

So sollte es sein:
Phoner --> loggt dauernd in Datei X
Programm Y (Wunschprogramm) --> liest dauernd von Datei X

Hat jemand eine Idee?
Danke nochmals im voraus.


LG,
Hans
 
Hallo,

scheint so als würde das externe Programm die System-Buffer nicht immer flushen...
Folgendes funktioniert ohne Probleme:
Writer:
Java:
/**
 * 
 */
package de.tutorials;

import java.io.File;
import java.io.FileOutputStream;
import java.util.concurrent.TimeUnit;

/**
 * @author Thomas.Darimont
 * 
 */
public class DummyFileWriter {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        File file = new File("c:/bubu.txt");
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        for (int i = 0; i < 100000; i++) {
            System.out.println("Write:" + i);
            fileOutputStream.write(("Hallo: " + i).getBytes("UTF-8"));
            TimeUnit.MILLISECONDS.sleep(500L);
            fileOutputStream.flush();
            fileOutputStream.getFD().sync();
        }
        fileOutputStream.close();

    }

}

Reader:
Java:
/**
 * 
 */
package de.tutorials;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * @author Thomas.Darimont
 * 
 */
public class FileTrackingExample {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Executors.newSingleThreadExecutor().execute(new FileTracker(new File("c:/bubu.txt")));
    }

    static class FileTracker implements Runnable {

        final File file;
        long lastModifiedAtLastCheck;
        long lastFileLength;
        volatile boolean stopped;

        public FileTracker(File file) {
            super();
            this.file = file;
        }

        public void run() {
            RandomAccessFile randomAccessFile = null;
            try {
                randomAccessFile = new RandomAccessFile(file,
                        "r");
                byte[] buffer = new byte[16384];
                while (!isStopped()) {
                    if (file.lastModified() > lastModifiedAtLastCheck) {
                        long length = file.length();
                        randomAccessFile.seek(lastFileLength);
                        for (int bytesRead = randomAccessFile.read(buffer); bytesRead > 0; bytesRead = randomAccessFile
                                .read(buffer)) {
                            System.out.write(buffer,0,bytesRead);
                        }
                        lastFileLength = length;
                        lastModifiedAtLastCheck = file.lastModified();
                    }else{
                        TimeUnit.MILLISECONDS.sleep(200L);
                    }
                    
                }
            } catch (Exception e) {
                e.printStackTrace();
            }finally{
                if(null != randomAccessFile){
                    try {
                        randomAccessFile.close();
                    } catch (IOException e) {
                        new RuntimeException(e);
                    }
                }
            }
        }

        public boolean isStopped() {
            return stopped;
        }

        public void setStopped(boolean stop) {
            this.stopped = stop;
        }

    }

}


Gruß Tom
 
Zurück