在java中读到文件的末尾

时间:2014-04-25 08:58:58

标签: java java-io

我通过Java读取Linux中的串行接口文件。有时我只需要丢弃所有数据并只读取新内容。

说明:有大量数据,而且还有新的数据,所以我必须丢弃现有缓冲区并开始等待新数据。外部板只是继续发送。我最终只是在几次迭代中读取旧数据。我只需要跳过结束并等待新的数据集,而不是阅读所有旧的垃圾。

String file = "/dev/ttyO1";
FileInputStream inputStream  = new FileInputStream(file);

private static byte[] readUntil(InputStream in, int timeout) throws IOException {
//        long lastTime = System.currentTimeMillis();
    while (true) {
        if (in.available() > 0) {
            if (in.read() == 83)
                break;
        }
        try { Thread.sleep(20); } catch (Exception e) {}
    }
    byte[] text = new byte[10];
    for (int i = 0; i < 10; i++) {
        text[i] = (byte) in.read();
        if (text[i]=="E".getBytes()[0]) break;
        try { Thread.sleep(20); } catch (Exception e) {}
    }
    in.read(); // just read last one
    return text;
}

我无法弄清楚如何丢弃现有数据并只阅读新的数据。

4 个答案:

答案 0 :(得分:2)

我认为你真正想要的是刷新串口传入缓冲区中的所有数据。

在Linux上,在C程序中,you would be able to do

tcflush(fd, TCIFLUSH)

刷新传入缓冲区。但是你无法直接从Java那里做到这一点 - 它不是一个独立于平台的功能。

您可以编写一个执行此操作的小型C程序,然后将数据从/dev/ttyO1传送到stdout。您可以使用ProcessBuilder从Java代码启动该程序并读取其数据,而不是直接读取串行端口。


考虑一下,你不需要C程序来做任何管道,你只需要调用一次,然后就可以从Java打开/dev/tty01

这是一个可以执行此操作的小型C程序:

#include <sys/types.h> 
#include <sys/stat.h> 
#include <termios.h>
#include <fcntl.h> 
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char** argv) {
    int i;
    for (i = 1; i < argc; i++) {
        int fd = open(argv[i], O_NOCTTY, O_RDONLY);
        if (fd >= 0) {
            int result = tcflush(fd, TCIFLUSH);
            close(fd);
            if (result == -1) {
                fprintf(stderr, "%s: Couldn't open file %s; %s\n",
                        argv[0], argv[i], strerror(errno));
                exit (EXIT_FAILURE);
            }
        } else {
            fprintf(stderr, "%s: Couldn't open file %s; %s\n",
                    argv[0], argv[i], strerror(errno));
            exit (EXIT_FAILURE);
        }
    }
}

使用gcc -o tcflush tcflush.c进行编译并使用tcflush /dev/tty01运行。

答案 1 :(得分:1)

我不知道究竟是什么'Linux中的串行接口文件'。但我认为它是一个简单的文件,它一直附加一些文本,你想等待附加的新东西,而不是从头开始读取整个文件。您可以使用RandomAccessFile类'seek(long)方法跳过数据。或者,当你到达文件末尾时,你可以睡一段时间。

public static void main(String[] args) throws Exception {
    FileInputStream fis = new FileInputStream("src/file.txt");
    int i = 0;
    while (i < 50) { // read only 50 bytes
        byte b = (byte)fis.read();

        if (b == -1) { // end of file, wait
            Thread.sleep(500L);
            continue;
        }
        System.out.print((char) b);
        i++;
    }
    fis.close();
}

这只是一个简单的例子。我只读取了50个字节,但你想读的远不止这些。也许你可以使用超时。

答案 2 :(得分:0)

  

外部委员会不断发送。

这看起来更像是事件驱动方法的目标,而不是通常的顺序读取。

您是否考虑过使用RXTXjSSC? 您可以在Arduino IDE源代码中找到示例:SerialMonitorSerial

答案 3 :(得分:-1)

您的目标在代码中非常清楚。我认为你想要一些像linux中的tail命令这样的功能。如此,下面的代码很有用..请运行它并检查出来..

import java.io.*;

public class FileCheck {

    static long sleepTime = 1000 * 1;
    static String file_path = "/dev/ttyO1";

    public static void main(String[] args) throws IOException {
            BufferedReader input = new BufferedReader(new FileReader(file_path));
            String currentLine = null;
            while (true) {
                if ((currentLine = input.readLine()) != null) {
                    System.out.println(currentLine);
                    continue;
                }
                try {
                    Thread.sleep(sleepTime);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    break;
                }
            }
            input.close();
    }
}