`
hbcui1984
  • 浏览: 149966 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

FileChannel的Lock方法怎么总报错

    博客分类:
  • java
阅读更多
我想在一个线程中读取文件,当该线程读取该文件时,其他线程不能对该文件操作,我的代码如下:

File file=new File("/root/test.txt");
try {
FileInputStream fis=new FileInputStream(file);
FileChannel fc=fis.getChannel();
fc.tryLock();
byte[] buf = new byte[1024];
        StringBuffer sb=new StringBuffer();
        while((fis.read(buf))!=-1){
            sb.append(new String(buf));   
            buf=new byte[1024];//重新生成,避免和上次读取的数据重复
        }
        System.out.println(sb.toString());
        fc.close();
fis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

可是,程序却总报出如下异常:
Exception in thread "main" java.nio.channels.NonWritableChannelException
at sun.nio.ch.FileChannelImpl.tryLock(FileChannelImpl.java:818)
at java.nio.channels.FileChannel.tryLock(FileChannel.java:967)
at chb.mail.Calendar_chb.main(Calendar_chb.java:22)

利用同样的方法在写文件时就没有问题,各位达人啊。
分享到:
评论
5 楼 hbcui1984 2006-12-13  
基本问题已经解决,具体论述可以参看:
http://blog.csdn.net/hbcui1984/archive/2006/12/12/1440226.aspx
4 楼 hbcui1984 2006-12-12  
似乎文件的共享锁或独占锁与操作系统有关

我在家里在windows环境下,完全可以给文件加锁
但是到了公司在linux下,FileChanel就没有作用了
3 楼 hbcui1984 2006-12-11  
关键我想问的是,有没好的方法来确定一个文件是否正在被某个线程使用?
2 楼 hbcui1984 2006-12-11  
Readonly 写道
你的Channel是由InputStream过来的,当然是NonWritable了。


将程序改动如下:
fc.tryLock(0,Long.MAX_VALUE,true);
就不会有刚才的异常了。

可是传入的参数true表示可以共享,可是我要求不能共享,传入false的时候还会报出刚才一样的错误,为什么啊?

还有利用FileChannel真的可以给stream加锁吗?
我同时利用两个线程,一个往文件里写内容,一个线程读同一个文件的数据
我希望同一时间只有一个线程可以操作该文件,结果却并不如此,两个线程好像在同时运行
写的线程正在写的时候,读的线程却已经开始了读取文件内容,郁霉中,后面附有代码,看一眼啊,谢谢!
1 楼 Readonly 2006-12-11  
你的Channel是由InputStream过来的,当然是NonWritable了。

相关推荐

    flume中的FileChannel的优化

    经过对Flume FileChannel相关源码的分析,导致FileChannel吞吐率下降的主要原因集中于事务的提交过程——commit

    【IT十八掌徐培成】Java基础第26天-06.FileChannel-RandomAccessFile-CopyFile.zip

    例如,我们可以使用`FileInputStream`的`getChannel()`方法来创建一个`FileChannel`。 ```java FileInputStream fis = new FileInputStream("source.txt"); FileChannel sourceChannel = fis.getChannel(); ``` ...

    muyinchen#woker#07 Java的NIO之FileChannel1

    7.1 打开一个FileChannel 7.2 从FileChannel通道中读取数据 7.3 向FileChannel中写入数据: 7.4 关闭FileCha

    使用FileLock实现进程的互斥.rar

    1. **获取FileChannel**:首先,你需要创建一个`FileChannel`对象,这通常通过`FileInputStream`或`FileOutputStream`的`getChannel()`方法实现。例如: ```java FileInputStream fis = new FileInputStream("file...

    FileLock进程互斥

    然后,可以调用`FileChannel`的`lock()`或`tryLock()`方法来尝试获取锁。`lock()`方法会阻塞直到获得锁,而`tryLock()`则立即返回,如果无法获取锁则返回`null`。 一旦获取了`FileLock`,就可以执行需要互斥操作的...

    有效率的读取大文件(2G)

    可以使用`readLine()`方法按行读取,或者使用`read(char[] buffer)`方法按指定长度读取。这样,每次只处理一小部分数据,降低内存压力。 ```java String line; while ((line = reader.readLine()) != null) { // ...

    NIO学习系列:文件锁定和字符集

    通过调用`FileChannel.lock()`方法,我们可以尝试获取一个文件锁。如果文件已被其他进程或线程锁定,该操作将阻塞直到锁可用。文件锁是共享的,意味着同一文件可以被多个读取者同时锁定,但只能被一个写入者锁定。这...

    java文件锁的实现

    如果一个线程在等待锁时被中断,`lock()`方法会抛出`InterruptedIOException`。可以使用`isInterruptible()`检查锁是否可中断,并使用`interrupt()`方法中断等待。 7. **锁的局限性**:Java的文件锁是跨进程的,但...

    高效率文件复制java版

    本资源主要讲解了高效率文件复制的java实现方法,包含了两种不同的实现方式,分别使用java io流和FileChannel来实现文件复制操作。 知识点1:Java IO流文件复制 在第一个实现方法中,我们使用了Java IO流来实现...

    java 读取文件方法的总结

    Java 读取文件的方法在Java编程中至关重要,无论是处理文本文件、二进制文件还是其他类型的数据,都需要灵活运用各种读取方式。以下是对Java读取文件的五种方法的详细说明,每种方法都有相应的代码示例: 1. **按...

    关于文件的读写各种方法

    本文将详细探讨Java中处理文件的各种方法,旨在帮助初学者掌握文件读写的基本概念和实践技巧。 首先,我们了解文件读取的方法。在Java中,最常用的文件读取类是`java.io.File`,它代表了文件和目录路径名。创建File...

    java基础--文件流管道.docx

    `transferFrom()` 方法允许我们从一个已存在的FileChannel中读取数据并写入到当前FileChannel。在提供的代码示例中,`fileOutputStreamFileChannel.transferFrom(fileInputStreamFileChannel, 0, fileInputStream....

    nio.rar_FastCopyFile.java_NIO_UseFloatBuffer.java_java nio_文件锁

    你可以通过FileChannel的lock()和tryLock()方法获取文件锁。锁可以是独占的(不允许其他线程或进程同时写入),也可以是非独占的(允许读取,但不允许写入)。文件锁的使用需要注意释放,否则可能导致死锁。 总结...

    jruby-stdin-channel:JRuby 扩展为 STDIN 公开可中断的 NIO FileChannel

    jruby-stdin-channel JRuby Java 扩展 gem,它从 Java System.in stdin 中提取可中断的FileChannel。 使用这个 gem,在阻塞read方法上调用close将解除阻塞,这与普通的 JRuby $stdin 。 使用close转义阻塞读取仅适用...

    文件性能测试方法

    文件性能测试方法是评估程序处理文件效率的重要环节,特别是在Java编程中。本文主要探讨了三种不同的文件读写方法:传统的IO、NIO(New Input/Output)以及NIO结合内存映射,并通过实际测试对比了它们的性能差异。 ...

    java NIO原理和使用

    这里创建了一个 `RandomAccessFile` 对象,并通过其 `getChannel()` 方法获取了对应的 `FileChannel`。 ##### 2. Buffer (缓冲区) 缓冲区是 Java NIO 中用于存储数据的对象,所有数据都是通过缓冲区进行读写。缓冲...

    java文件读取方法.doc

    总的来说,选择哪种文件读取方法取决于具体的需求。对于简单的小文件,直接读取字节或字符可能就足够了。而对于大文件或者需要高效处理的场景,可能需要使用更高级的策略,如缓冲、随机访问或NIO。在实际应用中,还...

    java读取超大文本文件

    - `FileChannel.map()`方法用于创建文件的内存映射,参数包括模式(如只读)、起始位置及长度。 - `MappedByteBuffer`可以直接在内存中操作数据,提高性能。 - 通过循环读取内存映射文件的不同部分,可以处理任意...

    复制文件(java)

    另一种方法是利用`java.nio`包的`FileChannel`和`ByteBuffer`,这种方法效率更高,因为它支持大块数据的传输。以下是使用`java.nio`的步骤: 1. 创建`FileChannel`对象,分别从源文件和目标文件的`FileInputStream`...

    Using NIO to copy Java file fast.zip_java nio

    5. 使用FileChannel的write()方法将缓冲区中的数据写入目标文件。 6. 重复步骤3至5,直到源文件所有数据都被复制。 7. 最后,关闭两个FileChannel。 此外,开发者可能还利用了选择器(Selectors)来监控文件复制...

Global site tag (gtag.js) - Google Analytics