java - 如何同时读取和写入数据到同一个文件

标签 java multithreading java-me midp

我读过许多帖子,其中谈到使用 JavaME 同时NOT 读取和写入文件。我有一个特殊的用例场景,我的日志文件(可能是完整文件或文件的一部分)定期上传到服务器。这必须继续进行,而不会妨碍同一文件中应用程序的当前日志记录。

代码示例如下:

boolean writing = true;
boolean reading = true;
void main() {
    new Thread("THREAD-FILE-READ") {
        public void run() {
            InputStream instream = getFileInStream();
            if (null != instream) {
                while (reading) {
                    try {
                        try {
                            synchronized(READ_LOCK) {
                                READ_LOCK.wait();
                            }
                        } catch (InterruptedException ex) {
                            ex.printStackTrace();
                        }

                        if (writtenCharsLen > 0) {
                            byte[] bytes = new byte[writtenCharsLen];
                            instream.read(bytes, 0, writtenCharsLen);
                            System.out.println("Read="+new String(bytes));
                            bytes = null;
                            writtenCharsLen = 0;
                        }
                    } catch (IOException ioe) {
                        ioe.printStackTrace();
                    }
                }
            }
            closeStream(instream);
        }
    }.start();

    new Thread("THREAD-FILE-WRITE") {
        public void run() {
            OutputStream outstream = getFileOutStream();
            if (null != outstream) {
                while (writing) {
                    try {
                        byte[] str = randomString();
                        if (null != str) {
                            writtenCharsLen = str.length;
                            System.out.println("Write=" + new String(str));
                            outstream.write(str);
                            str = null;
                        }
                    } catch (IOException ex) {
                        ex.printStackTrace();

                    } finally {
                        notifyReadStream();
                    }

                    try {
                        synchronized(WRITE_LOCK) {
                            WRITE_LOCK.wait();
                        }
                    } catch (InterruptedException ex) {
                        ex.printStackTrace();
                    }
                }
            }
            closeStream(outstream );
        }
    }.start();

}

void notifyReadStream() {
    try {
        synchronized (READ_LOCK) {
            READ_LOCK.notify();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

void notifyWriteStream() {
    try {
        synchronized (WRITE_LOCK) {
            WRITE_LOCK.notify();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

在上面的代码中,我将用对网络 IO 方法的适当调用替换 sop-read 和 sop-write。

PS:由于这段代码将运行多个文件和多个设备,我需要尽可能压缩修改以保持运行时堆尽可能低。此外,这段代码将一直运行到应用程序生命周期,因此不考虑在中间关闭和打开文件。

出现不希望的结果: 读取和写入线程显示正在运行用于读取和写入的 sop。读取线程从写入线程写入的位置开始读取。我在此代码中没有遇到任何异常,但结果是不希望的。我也尝试过同步读写流,但那是抛出 IllegalMonitorStateException

预期结果: 流的读取必须在写入流完成后触发,并且读取线程必须能够从文件中的任何位置读取。

有什么帮助/指点有用吗?

编辑: 我能够使用不同的显示器同步读取和写入流,但我仍然觉得,使用单个显示器我可以做得更好。稍后会尝试。

最佳答案

我会解决这个问题:

出现意外结果:读取和写入线程显示正在运行读取和写入的 sop。读取线程从写入线程写入的位置开始读取。我在此代码中没有遇到任何异常,但结果是不希望的。我也尝试过同步读取和写入流,但会抛出 IllegalMonitorStateException

如果您使用监视器同步访问,即读取器调用 someObject.wait() 并且写入器调用 someObject.notify(),请记住您必须包装someObject 上的同步块(synchronized block)中的这些调用:

synchronized(someObject) {
    someObject.wait();
}


synchronized(someObject) {
    someObject.notify();
}

这就是 IllegalMonitorStateException 的原因。

关于java - 如何同时读取和写入数据到同一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8483034/

相关文章:

java - 如何通过java访问应用程序?

c# - 使用 Interlocked 的线程安全 DateTime 更新。*

python - 从线程内部杀死python线程的方法?

java - 多个线程与管道流通信并使用 PushbackInputStream

netbeans - 如何将捕获的图像保存在图库文件夹或手机内存中?

java - 安装 Android SDK 发现 JDK 从 Eclipse 中删除了 javaw.exe

java - 我在我的电脑上找不到 Android SDK

Java elasticsearch spring-data 设置不同的索引字段名称

java - 我在handleDisplayableEvent 中遇到异常。原因: LinkageError

java-me - 手机上的 J2ME 应用程序与浏览器