Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何写入/读取我';你锁上了吗?_Java_Multithreading_Concurrency - Fatal编程技术网

Java 如何写入/读取我';你锁上了吗?

Java 如何写入/读取我';你锁上了吗?,java,multithreading,concurrency,Java,Multithreading,Concurrency,我正在编写一个线程化的程序,它可能会在多个JVM之间运行。锁定文件后,我在写入和读取文件时遇到问题(以防止其他进程/线程访问该文件)。我最初使用的是FileWriter,但没有向该文件写入任何内容 现在,我正在尝试一个OutputStream,由于某些原因,文件中的新写入不会追加,因此只会出现最后一个条目。我做错了什么?锁定文件后,读/写文件的最佳方式是什么 注意:如果我删除所有锁,并使用FileWriter与PrintWriter组合使用,我没有这些问题,因此我认为我的锁定机制是错误的 try

我正在编写一个线程化的程序,它可能会在多个JVM之间运行。锁定文件后,我在写入和读取文件时遇到问题(以防止其他进程/线程访问该文件)。我最初使用的是
FileWriter
,但没有向该文件写入任何内容

现在,我正在尝试一个
OutputStream
,由于某些原因,文件中的新写入不会追加,因此只会出现最后一个条目。我做错了什么?锁定文件后,读/写文件的最佳方式是什么

注意:如果我删除所有锁,并使用
FileWriter
PrintWriter
组合使用,我没有这些问题,因此我认为我的锁定机制是错误的

try {
    // Get a file channel for the file
    File file = new File ( path );
    RandomAccessFile stream = new RandomAccessFile(file, "rw");
    FileChannel channel = stream.getChannel();

    // Use the file channel to create a lock on the file.
    // This method blocks until it can retrieve the lock.
    FileLock lock = channel.lock();

    OutputStream os = Channels.newOutputStream(channel);

    try (PrintWriter pw = new PrintWriter(os,true)){
        System.out.println("Writing "  + message);
        pw.println(message);
    }
    os.close();
    // Release the lock - if it is not null!
    if( lock != null ) {
        lock.release();
    }
    stream.close();
    // Close the file
    channel.close();

} catch (Exception e) {
}

一个更简单的解决方案是使用


当你使用

new FileWriter(os, true)
new PrintWriter(os,true)
然而,当您使用

new FileWriter(os, true)
new PrintWriter(os,true)
true
表示:;“换行符刷新”,即它将始终覆盖

当你需要做的是只写从文件的结尾。我建议你用

channel.position(channel.size());

在尝试追加之前。

一个更简单的解决方案是使用


当你使用

new FileWriter(os, true)
new PrintWriter(os,true)
然而,当您使用

new FileWriter(os, true)
new PrintWriter(os,true)
true
表示:;“换行符刷新”,即它将始终覆盖

当你需要做的是只写从文件的结尾。我建议你用

channel.position(channel.size());

在您尝试追加之前。

谢谢,我现在使用的是FileOutputStream,但现在我在回读时尝试锁定
FileInputStream
通道时,遇到了一个不可写的通道异常in@DanaDabbagh为了阅读,你可能需要皇家空军,你不需要附加模式来阅读。@DanaDabbagh顺便说一句,你可能会发现我的这个项目很有趣。它可以使用持久化共享内存实现您想要的功能,但不需要文件锁(无论如何很少)@Dana Dabbagh:当然,您不能在
FileInputStream
上创建读/写(也称为独占)锁。您必须创建一个读取(也称为共享)锁。但是,你应该考虑,然后在文本I/O中考虑DeCurty或<代码>作者<代码>,而不是跳过十几个不同的API。谢谢,我现在使用的是FileOutputStream,但是现在当我试图在回读时锁定
FileInputStream
通道时,我得到了一个不可写的通道异常in@DanaDabbagh对于阅读,您可能需要RAF,而不需要附加模式。@DanaDabbagh顺便说一句,您可能会发现我的这个项目很有趣。它可以使用持久化共享内存实现您想要的功能,但不需要文件锁(无论如何很少)@Dana Dabbagh:当然,您不能在
FileInputStream
上创建读/写(也称为独占)锁。您必须创建一个读取(也称为共享)锁。但是你应该考虑,然后在文本I/O中考虑,然后写代码< >代码>,而不是跳过十几个不同的API…