我想在一个线程中读取文件,当该线程读取该文件时,其他线程不能对该文件操作,我的代码如下:
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)
利用同样的方法在写文件时就没有问题,各位达人啊。
分享到:
- 2006-12-11 15:08
- 浏览 12073
- 评论(5)
- 论坛回复 / 浏览 (5 / 5641)
- 查看更多
相关推荐
经过对Flume FileChannel相关源码的分析,导致FileChannel吞吐率下降的主要原因集中于事务的提交过程——commit
例如,我们可以使用`FileInputStream`的`getChannel()`方法来创建一个`FileChannel`。 ```java FileInputStream fis = new FileInputStream("source.txt"); FileChannel sourceChannel = fis.getChannel(); ``` ...
7.1 打开一个FileChannel 7.2 从FileChannel通道中读取数据 7.3 向FileChannel中写入数据: 7.4 关闭FileCha
1. **获取FileChannel**:首先,你需要创建一个`FileChannel`对象,这通常通过`FileInputStream`或`FileOutputStream`的`getChannel()`方法实现。例如: ```java FileInputStream fis = new FileInputStream("file...
然后,可以调用`FileChannel`的`lock()`或`tryLock()`方法来尝试获取锁。`lock()`方法会阻塞直到获得锁,而`tryLock()`则立即返回,如果无法获取锁则返回`null`。 一旦获取了`FileLock`,就可以执行需要互斥操作的...
可以使用`readLine()`方法按行读取,或者使用`read(char[] buffer)`方法按指定长度读取。这样,每次只处理一小部分数据,降低内存压力。 ```java String line; while ((line = reader.readLine()) != null) { // ...
通过调用`FileChannel.lock()`方法,我们可以尝试获取一个文件锁。如果文件已被其他进程或线程锁定,该操作将阻塞直到锁可用。文件锁是共享的,意味着同一文件可以被多个读取者同时锁定,但只能被一个写入者锁定。这...
如果一个线程在等待锁时被中断,`lock()`方法会抛出`InterruptedIOException`。可以使用`isInterruptible()`检查锁是否可中断,并使用`interrupt()`方法中断等待。 7. **锁的局限性**:Java的文件锁是跨进程的,但...
本资源主要讲解了高效率文件复制的java实现方法,包含了两种不同的实现方式,分别使用java io流和FileChannel来实现文件复制操作。 知识点1:Java IO流文件复制 在第一个实现方法中,我们使用了Java IO流来实现...
Java 读取文件的方法在Java编程中至关重要,无论是处理文本文件、二进制文件还是其他类型的数据,都需要灵活运用各种读取方式。以下是对Java读取文件的五种方法的详细说明,每种方法都有相应的代码示例: 1. **按...
本文将详细探讨Java中处理文件的各种方法,旨在帮助初学者掌握文件读写的基本概念和实践技巧。 首先,我们了解文件读取的方法。在Java中,最常用的文件读取类是`java.io.File`,它代表了文件和目录路径名。创建File...
`transferFrom()` 方法允许我们从一个已存在的FileChannel中读取数据并写入到当前FileChannel。在提供的代码示例中,`fileOutputStreamFileChannel.transferFrom(fileInputStreamFileChannel, 0, fileInputStream....
你可以通过FileChannel的lock()和tryLock()方法获取文件锁。锁可以是独占的(不允许其他线程或进程同时写入),也可以是非独占的(允许读取,但不允许写入)。文件锁的使用需要注意释放,否则可能导致死锁。 总结...
jruby-stdin-channel JRuby Java 扩展 gem,它从 Java System.in stdin 中提取可中断的FileChannel。 使用这个 gem,在阻塞read方法上调用close将解除阻塞,这与普通的 JRuby $stdin 。 使用close转义阻塞读取仅适用...
文件性能测试方法是评估程序处理文件效率的重要环节,特别是在Java编程中。本文主要探讨了三种不同的文件读写方法:传统的IO、NIO(New Input/Output)以及NIO结合内存映射,并通过实际测试对比了它们的性能差异。 ...
这里创建了一个 `RandomAccessFile` 对象,并通过其 `getChannel()` 方法获取了对应的 `FileChannel`。 ##### 2. Buffer (缓冲区) 缓冲区是 Java NIO 中用于存储数据的对象,所有数据都是通过缓冲区进行读写。缓冲...
总的来说,选择哪种文件读取方法取决于具体的需求。对于简单的小文件,直接读取字节或字符可能就足够了。而对于大文件或者需要高效处理的场景,可能需要使用更高级的策略,如缓冲、随机访问或NIO。在实际应用中,还...
- `FileChannel.map()`方法用于创建文件的内存映射,参数包括模式(如只读)、起始位置及长度。 - `MappedByteBuffer`可以直接在内存中操作数据,提高性能。 - 通过循环读取内存映射文件的不同部分,可以处理任意...
另一种方法是利用`java.nio`包的`FileChannel`和`ByteBuffer`,这种方法效率更高,因为它支持大块数据的传输。以下是使用`java.nio`的步骤: 1. 创建`FileChannel`对象,分别从源文件和目标文件的`FileInputStream`...
5. 使用FileChannel的write()方法将缓冲区中的数据写入目标文件。 6. 重复步骤3至5,直到源文件所有数据都被复制。 7. 最后,关闭两个FileChannel。 此外,开发者可能还利用了选择器(Selectors)来监控文件复制...