Wie verwende ich Java, um aus einer Datei zu lesen, in die gerade geschrieben wird?

  • Ich habe eine Anwendung, die Informationen in eine Datei schreibt. Diese Informationen werden nach der Ausführung verwendet, um das Bestehen / Nichtbestehen / die Richtigkeit der Anwendung zu ermitteln. Ich möchte die Datei beim Lesen so lesen können, dass ich diese Pass / Failure / Correctness-Prüfungen in Echtzeit durchführen kann.

    Ich gehe davon aus, dass dies möglich ist Um dies zu tun, aber was ist die Sache, wenn man Java benutzt? Wenn das Lesen das Schreiben einholt, wartet es dann auf weitere Schreibvorgänge, bis die Datei geschlossen wird, oder wird das Lesen an diesem Punkt eine Ausnahme auslösen? Wenn letzteres, was mache ich dann?

    Meine Intuition treibt mich derzeit in Richtung BufferedStreams. Ist dies der Weg zu gehen?

    03 November 2017
    Joris Schellekensuser1282545
7 answers
  • Das Beispiel konnte nicht mit FileChannel.read(ByteBuffer) zum Laufen gebracht werden, da es nicht blockiert wird. Hat jedoch den folgenden Code zum Laufen gebracht:

     boolean running = true;
    BufferedInputStream reader = new BufferedInputStream(new FileInputStream( "out.txt" ) );
    
    public void run() {
        while( running ) {
            if( reader.available() > 0 ) {
                System.out.print( (char)reader.read() );
            }
            else {
                try {
                    sleep( 500 );
                }
                catch( InterruptedException ex ) {
                    running = false;
                }
            }
        }
    }
     

    Natürlich würde dasselbe als Timer anstelle von funktionieren ein Thread, aber das überlasse ich dem Programmierer. Ich bin immer noch auf der Suche nach einem besseren Weg, aber das funktioniert jetzt für mich.

    Oh, und ich werde dies mit: Ich verwende 1.4.2. Ja, ich weiß, ich bin noch in der Steinzeit.

    21 May 2017
    manmanJoseph Gordon
  • Wenn Sie eine Datei lesen möchten, während sie geschrieben wird, und nur den neuen Inhalt lesen, hilft Ihnen Folgendes, um dies zu erreichen.

    Zum Ausführen dieses Programms Sie starten es von der Eingabeaufforderung / dem Terminalfenster aus und übergeben den Dateinamen zum Lesen. Die Datei wird gelesen, es sei denn, Sie beenden das Programm.

    java FileReader c: \ meineDatei.txt

    Wenn Sie eine Zeile eingeben Speichern Sie den Text aus dem Notizblock, und der Text wird in der Konsole gedruckt.

     public class FileReader {
    
        public static void main(String args[]) throws Exception {
            if(args.length>0){
                File file = new File(args[0]);
                System.out.println(file.getAbsolutePath());
                if(file.exists() && file.canRead()){
                    long fileLength = file.length();
                    readFile(file,0L);
                    while(true){
    
                        if(fileLength<file.length()){
                            readFile(file,fileLength);
                            fileLength=file.length();
                        }
                    }
                }
            }else{
                System.out.println("no file to read");
            }
        }
    
        public static void readFile(File file,Long fileLength) throws IOException {
            String line = null;
    
            BufferedReader in = new BufferedReader(new java.io.FileReader(file));
            in.skip(fileLength);
            while((line = in.readLine()) != null)
            {
                System.out.println(line);
            }
            in.close();
        }
    }
     
    29 September 2015
    tiger.spring
  • Sie können sich auch den Java-Kanal ansehen, um einen Teil einer Datei zu sperren.

    http://java.sun.com/javase/6/docs/api/java/nio/channels/FileChannel .html

    Diese Funktion von FileChannel kann ein Start sein

     lock(long position, long size, boolean shared) 
     

    Ein Aufruf dieser Methode wird blockiert, bis die Region gesperrt werden kann

    01 September 2008
    Frederic Morin
  • Die Antwort scheint "Nein" zu sein ... und "Ja". Es scheint keine wirkliche Möglichkeit zu geben, zu wissen, ob eine Datei zum Schreiben durch eine andere Anwendung geöffnet ist. Wenn Sie also aus einer solchen Datei lesen, wird der Vorgang so lange fortgesetzt, bis der Inhalt erschöpft ist. Ich folgte Mikes Rat und schrieb einen Testcode:

    Writer.java schreibt eine Zeichenfolge in eine Datei und wartet darauf, dass der Benutzer die Eingabetaste drückt, bevor eine weitere Zeile in die Datei geschrieben wird. Die Idee ist, dass es gestartet werden könnte, dann kann ein Leser gestartet werden, um zu sehen, wie er mit der "partiellen" Datei zurechtkommt. Der Leser, den ich geschrieben habe, ist in Reader.java.

    Writer.java

     public class Writer extends Object
    {
        Writer () {
    
        }
    
        public static String[] strings = 
            {
                "Hello World", 
                "Goodbye World"
            };
    
        public static void main(String[] args) 
            throws java.io.IOException {
    
            java.io.PrintWriter pw =
                new java.io.PrintWriter(new java.io.FileOutputStream("out.txt"), true);
    
            for(String s : strings) {
                pw.println(s);
                System.in.read();
            }
    
            pw.close();
        }
    }
     < /pre>
    
    

    Reader.java

    [&&2&&\<&pre<<>>||<

    Es kann nicht garantiert werden, dass dieser Code die beste Methode ist.

    Dadurch bleibt die von Mike vorgeschlagene Option, regelmäßig zu prüfen, ob neue Daten aus der Datei gelesen werden sollen. Dies erfordert dann ein Eingreifen des Benutzers, um den Dateireader zu schließen, wenn festgestellt wird, dass das Lesen abgeschlossen ist. Oder der Leser muss auf den Inhalt der Datei aufmerksam gemacht werden und in der Lage sein, die Schreibbedingung zu bestimmen. Wenn der Inhalt XML ist, kann dies durch das Ende des Dokuments signalisiert werden.

    07 August 2008
    Anthony Cramp
  • Nicht Java per se, aber Sie können auf Probleme stoßen, bei denen Sie etwas in eine Datei geschrieben haben, aber es wurde noch nicht geschrieben - es könnte sich irgendwo in einem Cache befinden und aus demselben lesen Die Datei liefert Ihnen möglicherweise nicht die neuen Informationen.

    Kurzversion - Verwenden Sie flush () oder was immer der entsprechende Systemaufruf ist, um sicherzustellen, dass Ihre Daten tatsächlich in die Datei geschrieben werden.

    Hinweis Ich spreche nicht von dem Festplatten-Cache auf Betriebssystemebene. Wenn Ihre Daten hier hereinkommen, sollten sie nach diesem Punkt in einem read () angezeigt werden. Es kann sein, dass die Sprache selbst Schreibvorgänge im Cache speichert und wartet, bis ein Puffer voll ist oder eine Datei geleert / geschlossen wird.

    07 August 2008
    Matthew Schinckel
  • Sie können keine Datei lesen, die von einem anderen Prozess aus mit FileInputStream, FileReader oder RandomAccessFile geöffnet wird.

    Die direkte Verwendung von FileChannel funktioniert jedoch:

     private static byte[] readSharedFile(File file) throws IOException {
        byte buffer[] = new byte[(int) file.length()];
        final FileChannel fc = FileChannel.open(file.toPath(), EnumSet.of(StandardOpenOption.READ));
        final ByteBuffer dst = ByteBuffer.wrap(buffer);
        fc.read(dst);
        fc.close();
        return buffer;
    }
     
    03 January 2016
    bebbo
  • Ich habe es noch nie ausprobiert, aber Sie sollten einen Testfall schreiben, um zu sehen, ob das Lesen aus einem Stream, nachdem Sie das Ende erreicht haben, funktionieren wird. p>

    Gibt es einen Grund, aus dem Sie einen Pipe-Input / Output-Stream nicht verwenden können? Werden die Daten aus derselben Anwendung geschrieben und gelesen (wenn ja, haben Sie die Daten, warum müssen Sie aus der Datei lesen)?

    Ansonsten vielleicht bis zum Ende lesen Überwachen Sie dann die Änderungen und suchen Sie nach dem Punkt, an dem Sie aufgehört haben, und fahren Sie fort ... aber achten Sie auf die Rennbedingungen.

    07 August 2008
    Mike Stone