gpt4 book ai didi

java - 在java中读取到文件末尾

转载 作者:行者123 更新时间:2023-11-30 09:08:55 25 4
gpt4 key购买 nike

我确实通过 Java 在 Linux 中读取串行接口(interface)文件。有时我只需要丢弃所有数据并只读取新数据。

解释:有大量数据并且新数据即将到来,所以我必须丢弃现有缓冲区并开始等待新数据。外部板一直在发送。我最终读取了旧数据,仅在几次迭代后我就有了当前值。我只需要跳到结尾并等待新数据集,而不是阅读所有旧数据。

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;
}

我只是不知道如何丢弃现有数据并只读取新数据。

最佳答案

我假设您真正想要的是刷新串口传入缓冲区中的所有数据。

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

tcflush(fd, TCIFLUSH)

刷新传入缓冲区。但是您无法直接从 Java 执行此操作 - 它不是独立于平台的功能。

您可以编写一个执行此操作的小型 C 程序,然后将数据从 /dev/ttyO1 通过管道传输到标准输出。您可以使用 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运行。

关于java - 在java中读取到文件末尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23288595/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com