linux下Java RandomAccessFile.java无法正常工作

2023-12-02

我试图在java中实现简单的tail -f linux命令。这是我的代码。

try
    {
        // position within the file
        File file = new File("/home/curuk/monitored/log.txt");
        RandomAccessFile raFile = new RandomAccessFile(file, "r");
        long last = file.lastModified(); // The last time the file was checked for changes
        long position = file.length();
        while (true)
        {
            if (file.lastModified() > last)
            {
                last = file.lastModified();
                readFromFile(raFile, (int) position, (int) (file.length() - position));
                position = file.length();
            }
            Thread.sleep(1000);
        }
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }

private byte[] readFromFile(RandomAccessFile file, int position, int size) throws IOException
    {
        file.seek(position);
        byte[] bytes = new byte[size];
        System.err.println(file.read(bytes, 0, size));
        String s = new String(bytes);
        System.err.println(s);
        return bytes;
    }

问题是在linux操作系统下,file.read(bytes, 0, size)总是返回 -1,而在 Windows 下,相同的代码片段工作得很好(总是打印新行)。

Edit:

我通过添加解决了这个问题raFile = new RandomAccessFile(file, "r");在每次迭代时。

while (true)
            {
                raFile = new RandomAccessFile(file, "r");
                if (file.lastModified() > last)
                {
                    last = file.lastModified();
                    readFromFile(raFile, (int) position, (int) (file.length() - position));
                    position = file.length();
                }
                Thread.sleep(1000);
            }

不知道为什么,但现在在 Linux 下也能正常工作了。 谢谢你们的努力


这是一个完全基于Java 7的解决方案,使用新的WatchService基础设施:

可以用,但相当粗糙......

public final class Baz
{
    public static void main(final String... args)
        throws IOException
    {
        // Get paths to the containing directory and the file we want to spy
        final Path dir = Paths.get("/tmp");
        final Path file = dir.resolve("foo.txt");

        // Get the watch service for our default filesystem
        // We are only interested in modifications and deletions
        final WatchService service = FileSystems.getDefault().newWatchService();
        dir.register(service, StandardWatchEventKinds.ENTRY_MODIFY,
            StandardWatchEventKinds.ENTRY_DELETE);

        // Get a charset decoder -- we will be reading bytes from the file,
        // we will need to decode them to a string
        final CharsetDecoder decoder = StandardCharsets.UTF_8.newDecoder()
            .onMalformedInput(CodingErrorAction.IGNORE)
            .onUnmappableCharacter(CodingErrorAction.IGNORE);


        try (
            // Open a SeekableByteChannel to the file -- read only
            final SeekableByteChannel channel
                = Files.newByteChannel(file, StandardOpenOption.READ);
        ) {
            long oldSize;
            while (true) {
                // Get the current size of our file
                oldSize = channel.size();
                try {
                    // Grab a key
                    final WatchKey key = service.poll(1L, TimeUnit.SECONDS);
                    if (key == null) // No events...
                        continue;

                    for (final WatchEvent<?> e: key.pollEvents()) {
                        @SuppressWarnings("unchecked")
                        final WatchEvent<Path> event = (WatchEvent<Path>) e;

                        // What kind of event, to whom it applies
                        final WatchEvent.Kind<Path> kind = event.kind();
                        final Path context = dir.resolve(event.context());

                        // If not to us, we don't care
                        if (!context.equals(file))
                            continue;

                        // If our file has disappeared, exit
                        if (kind == StandardWatchEventKinds.ENTRY_DELETE) {
                            System.err.println("File deleted");
                            System.exit(0);
                        }

                        // OK, so it's a modification, and it is our file: read the tail
                        doRead(oldSize, decoder, channel);
                    }
                    // Reset the key for the next batch of events
                    key.reset();
                } catch (InterruptedException e) {
                    // service.poll() interrupted: get out
                    break;
                }
            }
        }
    }

    private static void doRead(final long oldSize, final CharsetDecoder decoder,
        final SeekableByteChannel channel)
        throws IOException
    {
        final long newSize = channel.size();
        if (newSize <= oldSize)
            return;
        final int bufsize = (int) (newSize - oldSize);
        final ByteBuffer buf = ByteBuffer.allocate(bufsize);
        channel.position(oldSize).read(buf);
        buf.rewind();
        decoder.reset();
        System.out.println(decoder.decode(buf).toString());
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux下Java RandomAccessFile.java无法正常工作 的相关文章

  • 多处理:仅使用物理核心?

    我有一个函数foo它消耗大量内存 我想并行运行多个实例 假设我有一个有 4 个物理核心的 CPU 每个核心有两个逻辑核心 我的系统有足够的内存来容纳 4 个实例foo并行但不是 8 个 此外 由于这 8 个核心中的 4 个是逻辑核心 我也不
  • 无法使用maven编译java项目

    我正在尝试在 java 16 0 1 上使用 maven 构建 IntelliJ 项目 但它无法编译我的项目 尽管 IntelliJ 能够成功完成 在此之前 我使用maven编译了一个java 15项目 但我决定将所有内容更新到16 0 1
  • 如何从秘密字符串中制作 HMAC_SHA256 密钥以在 jose4j 中与 JWT 一起使用?

    我想生成 JWT 并使用 HMAC SHA256 对其进行签名 对于该任务我必须使用jose4j https bitbucket org b c jose4j wiki Home 我尝试根据秘密生成密钥 SecretKeySpec key
  • Java套接字:在连接被拒绝异常时重试的最佳方法?

    现在我正在这样做 while true try SocketAddress sockaddr new InetSocketAddress ivDestIP ivDestPort downloadSock new Socket downloa
  • 如何在android中设置多个闹钟,在这种情况下最后一个闹钟会覆盖以前的闹钟

    我正在开发一个Android应用程序 用户可以在其中设置提醒时间 但我在以下代码中遇到一个问题 即最后一个警报会覆盖之前的所有警报 MainActivity java public void setreminders DatabaseHan
  • 具有共享依赖项的多模块项目的 Gradle 配置

    使用 gradle 制作第一个项目 所以我研究了 spring gradle hibernate 项目如何组织 gradle 文件 并开始制作自己的项目 但是 找不到错误 为什么我的配置不起作用 子项目无法解决依赖关系 所以项目树 Root
  • 如何获取 WebElement 的父级[重复]

    这个问题在这里已经有答案了 我试过了 private WebElement getParent final WebElement webElement return webElement findElement By xpath 但我得到
  • Git 无法识别重命名和修改的包文件

    我有一个名为的java文件package old myfile java 我已经通过 git 提交了这个文件 然后我将我的包重命名为new所以我的文件在package new myfile java 我现在想将此文件重命名 和内容更改 提交
  • Java - 返回值是否会中断循环?

    我正在编写一些基本上遵循以下格式的代码 public static boolean isIncluded E element Node
  • Cloudfoundry:如何组合两个运行时

    cloundfoundry 有没有办法结合两个运行时环境 我正在将 NodeJS 应用程序部署到 IBM Bluemix 现在 我还希望能够执行独立的 jar 文件 但应用程序失败 APP 0 bin sh 1 java not found
  • 查找哪个程序运行另一个程序

    我有一个 NAS 运行在 Redhat Linux 的有限版本上 我按照指示破解了它 这样我就可以访问 shell 这很有帮助 我还做了一些修改 其他人也做过修改 除了一个问题之外 它们似乎都工作得很好 不知何故 每隔 22 天 系统就会关
  • 如何通过ssh检查ubuntu服务器上是否存在php和apache

    如何通过ssh检查Ubuntu服务器上apache是 否安装了php和mysql 另外如果安装的话在哪个目录 如果安装了其他软件包 例如 lighttpd 那么它在哪里 确定程序是否已安装的另一种方法是使用which命令 它将显示您正在搜索
  • Espresso 和 Proguard 的 Java.lang.NoClassDefFoundError

    我对 Espresso 不太有经验 但我终于成功地运行了它 我有一个应用程序需要通过 Proguard 缩小才能处于 56K 方法之下 该应用程序以 3 秒的动画开始 因此我需要等到该动画结束才能继续 这就是我尝试用该方法做的事情waitF
  • 在脚本内使用不带密码的 sudo

    由于某种原因 我需要作为用户在没有 sudo 的情况下运行脚本 script sh 该脚本需要 root 权限才能工作 我认为将 sudo 放入 script sh 中是唯一的解决方案 让我们举个例子 script sh bin sh su
  • 尝试使用等于“是”或“否”的字符串变量重新启动 do-while 循环

    计算行程距离的非常简单的程序 一周前刚刚开始 我有这个循环用于解决真或假问题 但我希望它适用于简单的 是 或 否 我为此分配的字符串是答案 public class Main public static void main String a
  • JVM:是否可以操作帧堆栈?

    假设我需要执行N同一线程中的任务 这些任务有时可能需要来自外部存储的一些值 我事先不知道哪个任务可能需要这样的值以及何时 获取速度要快得多M价值观是一次性的而不是相同的M值在M查询外部存储 注意我不能指望任务本身进行合作 它们只不过是 ja
  • Java的-XX:+UseMembar参数是什么

    我在各种地方 论坛等 看到这个参数 并且常见的答案是它有助于高并发服务器 尽管如此 我还是找不到 sun 的官方文档来解释它的作用 另外 它是Java 6中添加的还是Java 5中存在的 顺便说一句 许多热点虚拟机参数的好地方是这一页 ht
  • Android - 9 补丁

    我正在尝试使用 9 块图片创建一个新的微调器背景 我尝试了很多方法来获得完美的图像 但都失败了 s Here is my 9 patch 当我用Draw 9 patch模拟时 内容看起来不错 但是带有箭头的部分没有显示 或者当它显示时 这部
  • Java &= 运算符应用 & 或 && 吗?

    Assuming boolean a false 我想知道是否这样做 a b 相当于 a a b logical AND a is false hence b is not evaluated 或者另一方面 这意味着 a a b Bitwi
  • JAXB - 列表<可序列化>?

    我使用 xjc 制作了一些课程 public class MyType XmlElementRefs XmlElementRef name MyInnerType type JAXBElement class required false

随机推荐

  • 如何从wpf中的文件夹路径获取图像

    我试图了解如何从我的项目中获取文件 我使用的是 Visual Studio 2010 并且我的 wpf 项目中有一个名为 Images 的文件夹 我如何从该文件夹中获取图像 我正在尝试 return Images name jpg 它本身所
  • PHP CSS 解析器 - 选择器声明到字符串

    我希望能够读取 CSS 文件 并能够将给定选择器的所有声明提取到字符串中 例如 给定以下样式表 h1 font size 15px font weight bold font style italic font family Verdana
  • Python 不检测 .pyc 文件

    我正在使用 Python 3 2 用于构建和执行 这是我的问题 我打算通过以下设置发送我的 python 应用程序 有一个主要脚本 例如 Main py 即使用已编译的模块 例如Module1 pyc 准确来说 目录结构是 Main py
  • 无法启动服务意图

    我有一个服务班 我已将此类导出到 jar 并将该 jar 嵌入到我的客户端应用程序中 当需要时 我调用服务类 当我尝试这样做时 出现以下错误 Unable to start service Intent comp com sample se
  • int c = getchar()?

    我正在读这本书 C 编程语言 作者 Kernighan 和 Ritchie 第二版 在其中一个示例中 我无法理解事情是如何运作的 include
  • 如何在 pydev 中启用事后调试?

    每当我的程序引发未处理的异常时 我想让 pydev 进入交互式控制台模式 但我不知道该怎么做 正如它现在的行为一样 会报告异常并立即终止进程 经过一番搜索后我发现了这个 建议使用 pydevd set pm excepthook 但是 当我
  • 如何在 R 中将数组转换为 data.table 并返回?

    这是最直接的方法吗将数组转换为 data table require data table require ggplot2 this returns a data table with both array s dimensions and
  • iPhone 用户联系信息

    如果您查看 设置 邮件 联系人 日历 下 有一个用于指定您的个人信息的设置 我的信息 设置 它基本上可以让您从联系人列表中选择一个条目作为您的个人资料 有谁知道如何以编程方式访问这些信息 不 遗憾的是 您无法直接访问 我的信息 联系信息 您
  • 撤消 git 命令 - git checkout --

    有没有办法撤消以下 git 命令 git checkout 我试图删除添加到存储库目录但未暂存或提交的文件 该命令似乎没有这样做 而是更改了其他一些文件 Update 未跟踪的归档文件和未暂存的文件之间存在差异 在这种情况下 我想找到一种方
  • Heroku 语言区域设置不起作用

    我在 heroku 上的语言区域设置似乎不起作用 On my local mashine 1 maj Heroku 01 May 00 00 My view Locale en hello Hello world views paginat
  • 使用 PDFBox 将 UTF-8 编码字符串写入 PDF [重复]

    这个问题在这里已经有答案了 我在使用 PDFBox 将 unicode 字符写入 PDF 时遇到问题 下面是一些生成垃圾字符而不是输出 的示例代码 我可以添加什么来获得对 UTF 8 字符串的支持 PDDocument document n
  • 当产品价格为零时隐藏“添加到购物车”按钮

    我有一个基于活动的 WordPress 网站 我在该网站上使用 WooCommerce 出售门票 有没有办法隐藏零成本产品的 添加到购物车 按钮 Thanks 您在主题中编写此代码function php function remove a
  • 您可以在 makefile 中执行 $(wildcard %/**/*.c) 吗?

    作为后续这个问题 还有一个情况我在几个小时的修修补补中还没有弄清楚 这是 makefile 当前的样子 output shell find lib type f name build js or name build css myth no
  • Bare-Except 不受欢迎的任何原因

    在某种程度上 我想知道为什么在 Python 中使用裸异常会如此令人不悦 如果我有一个完整的程序正在运行并且我做了类似的事情 我就会明白 import sys from application import program try prog
  • 如何在 CSS3 中为元素设置摆动动画?

    自从我看到国库网站还有树上摆动的标志效果 我一直在尝试重现 box width 50px height 50px background blue box shadow 0 0 5px blue margin 100px float left
  • 无法在 AVAudioplayer 中实施前向操作

    我正在使用 AVAudioplayer 播放一些音频文件 我有一些控件 例如前进和后退 倒带工作正常 但前进则不然 void rewind AVAudioPlayer player rewTimer userInfo player curr
  • 使用 python sdk 在 azure 中的 Linux 虚拟机中运行命令

    我发现azure python sdk提供了以下在linux虚拟机中运行命令的方法 from azure mgmt compute import compute management client from azure common cre
  • Android:使用默认音乐播放器播放歌曲文件

    有没有办法使用默认媒体播放器播放媒体 我可以使用以下代码来做到这一点 Intent intent new Intent Intent ACTION VIEW MimeTypeMap mime MimeTypeMap getSingleton
  • char 和 unsigned char 有什么区别?

    已编辑将 C C 更改为 C 请帮我找到一个明确的澄清char and unsigned char特别是当我们在嵌入式设备和普通PC之间传输数据时 缓冲区和普通PC之间的区别 unsigned char和朴素的char 您问的是两种不同的语
  • linux下Java RandomAccessFile.java无法正常工作

    我试图在java中实现简单的tail f linux命令 这是我的代码 try position within the file File file new File home curuk monitored log txt RandomA