为何无法修改文件?

问题描述

哪位达人帮我看看,为何如此申请文件锁之后无法用该(申请文件锁的)通道来读写该文件?其原理是什么?(该文件已有内容被写入)importjava.io.File;importjava.io.RandomAccessFile;importjava.io.FileInputStream;importjava.io.IOException;importjava.io.FileNotFoundException;importjava.nio.channels.FileChannel;importjava.nio.channels.FileLock;publicclasstest7{publicstaticvoidmain(String[]args){Filefile=newFile("c:\exFile\NameAddress\test7.txt");FilefileTmp=null;RandomAccessFilerandomAccessFile=null;FileInputStreamfileStream=null;FileChannelioChannel=null;FileChannelinputChannel=null;FileLockfileLock=null;try{randomAccessFile=newRandomAccessFile(file,"rws");}catch(FileNotFoundExceptione){e.printStackTrace(System.err);System.out.println("异常!将被读写的文件不存在!程序执行将被终止!");System.exit(-1);}ioChannel=randomAccessFile.getChannel();fileTmp=newFile("c:\exFile\NameAddress\test752727.tmp");try{fileStream=newFileInputStream(fileTmp);}catch(FileNotFoundExceptione){e.printStackTrace(System.err);System.out.println("异常!将被读取的临时文件不存在!程序执行将被终止!");System.exit(-3);}inputChannel=fileStream.getChannel();try{fileLock=ioChannel.tryLock(0L,Long.MAX_VALUE,true);}catch(IOExceptione){e.printStackTrace(System.err);System.out.println("异常!无法申请到文件锁!程序执行将被终止!");System.exit(-4);}try{longbytesRead=0L;longbytesHas=inputChannel.size();while(bytesRead<bytesHas){bytesRead+=ioChannel.transferFrom(inputChannel,bytesRead,(bytesHas-bytesRead));}}catch(IOExceptione){e.printStackTrace(System.err);System.out.println("异常!无法复制文件内容!程序执行将被终止!");System.exit(-5);}System.out.println("复制完成!程序执行正常结束!");System.exit(0);}}

解决方案

解决方案二:
把这句fileLock=ioChannel.tryLock(0L,Long.MAX_VALUE,true);改为:fileLock=ioChannel.tryLock(0L,Long.MAX_VALUE,false);//独占锁定
解决方案三:
我把你的程序试了一下,没发现你说的问题,倒是发现你的临时文件没有判断是否存在,会报错,也许你指的就是这个错误?解决方法:fileTmp=newFile("c:\exFile\NameAddress\test752727.tmp");if(!fileTmp.exists()){try{fileTmp.createNewFile();}catch(Exceptionex){System.out.println("异常!临时文件不存在,且不允许创建!");}}

解决方案四:
To2楼:这个临时文件已经存在,且已经有内容被写了进去,这是这个程序运行的前提条件。当然,这是由于我有所疏漏。我想可以在该目录下新建一个有内容的文件,用来代替test752727.tmp。这样就能重现我遇到的异常了。(我用的是JDK1.5)

时间: 2024-09-30 07:19:22

为何无法修改文件?的相关文章

批处理如何修改文件夹高级权限

问题描述 批处理如何修改文件夹高级权限 我要将文件夹的安全权限设为读取,这个我会用cacls,还要在高级的特殊权限里设置为删除和删除子文件夹的权限,这个不会写,请指教! 解决方案 http://blog.sina.com.cn/s/blog_5da3e81d0100orxv.html

maven 多 web 工程 怎么自动合并到 一个 主web 工程 且修改文件 自动更新修改

问题描述 maven 多 web 工程 怎么自动合并到 一个 主web 工程 且修改文件 自动更新修改 如题所属: maven 多 web 工程 怎么自动合并到 一个 主web 工程 且修改文件 自动更新修改,等于在一个web project 部署多个web 开发

求一个递归修改文件夹内全部子文件和文件夹名的程序(batch或者perl)

问题描述 求一个递归修改文件夹内全部子文件和文件夹名的程序(batch或者perl) 需求是这样的: 递归修改文件夹中所有名字带"aaa"字符串的 文件夹名或者文件名改成 bbb 例如: 01_aaa |_01_aaa_01 |_nbdaaa_01.txt |_nbcaaa_02.txt |_02_aaa_01 改成 01_bbb |_01_bbb_01 |_nbdbbb_01.txt |_nbcbbb_02.txt |_02_bbb_01 解决方案 http://blog.163.c

Windows命令行下修改文件访问控制权限

随着Windows XP/Server 2003的流行,越来越多的用户开始选择NTFS文件系统,NTFS的好处自然是大大增强了系统的安全性,在"安全"标签页下,我们可以在这里为不同级别的用户设置相应的访问控制权限,包括完全控制.修改.读取和运行.列出文件夹目录.读取.写入.特别的权限等,你只需要在"允许"和"拒绝"下简单勾选即可,点击"高级"按钮还可以设置更多的特殊权限,这里就不多说了. 其实,除了在图形用户界面下对文件或文件

汇编修改文件操作

想一想,如果你要写一个加密程序,或者病毒程序,都需要对文件进行修改(写操作).在dos下,系统提供有相应的功能调用来完成这样的操作,如:"打开文件\移动指针\读文件\写文件\关闭文件",在windows下,系统也提供有相应的Api函数.如"CreateFile\SetFilePointer\ReadFile\WriteFile\SetEndOfFile\CloseHandle"等,利用这些编程和dos下没什么两样,这里就不再多说啦!咱们今天要用的是利用"内

用修改文件时间的方法来加密文件

谈到文件加密已经有很多方法了,但传统的文件型加密方法都存在一些不足.例如:让人头痛的密码技术.复杂的全文加/解 密算法.会产生垃圾文件的暗贴技术等等.这里我向大家介绍一种新的文件加密思路. 在Win 95/98中选定一个文件后单激鼠标右键可以查看文件的属性.其中会列出该文件的创建时间.修改时间和访问时间.这 些信息的设置一般都是由操作系统(也就是由Dos/Windows等等)自动完成的,不会让用户轻易修改.利用这一特性就可以实现 很隐蔽的加密技术. 加密原理 用特定的时间信息替换原来的文件时间信

如何在LINUX中修改文件字符集

有些情况下,我们需要修改文件的字符集,以便解决乱码或者其他问题.在linux下,操作系统为我们提供了ICONV这个命令,下面我们来看一下这个命令的具体使用方法. [root@oadata ~]# iconv --help 用法: iconv [选项...] [文件...] 转换给定文件的编码. 输入/输出格式规范: -f, --from-code=名称 原始文本编码 -t, --to-code=名称 输出编码 信息: -l, --list 列举所有已知的字符集 输出控制: -c 从输出中忽略无效

linux中如何使用touch修改文件的修改时间

rsync有时候因为服务器时间错了,需要更改文件的修改时间时间,可以使用 touch命令来修改文件的修改时间: 1 touch -c -m -t 201101110000 teadme.txt 修改readme.txt为2011年1月11日零时零分修改 如果批量修改文件和目录,则使用 1 find /home/www/site -exec touch -c -m -t 201101110000 {} \; 即可把/home/www/site下的所有文件和目录都改变修改时间. 注意上面命令中的空格

Ubuntu如何查看和批量修改文件编码

我们都知道在Windows下文件编码默认为gbk或者是gb2312,但很多用户有时需要把Windows下的文件移到Linux系统中,所以转移后就经常出现乱码的情况,这该怎么办呢?接下来小编就给大家介绍下Ubuntu查看和批量修改文件编码的方法. 使用enca工具可以进行文件编码的查看. Ubuntu下的安装命令: sudo apt-get install enca enca查看文件 enca -L zh_CN file 查看文件编码 enca -L zh_CN -x UTF-8 file 更改文

Win8系统如何修改文件关联和打开方式?

Win8系统如何修改文件关联和打开方式? 1.首先打开控制面板,选择默认程序. 2.选择设置默认程序. 3.在左侧窗格选定一个应用程序,然后点击选择此程序的默认值. 4.可以选择此程序关联的文件类型. 5.回到控制面板,默认程序界面,选择将文件类型或协议与程序关联. 6.选择一个要更改的文件类型,然后点击右上角的更改程序. 7.会出现如下窗口,可以自行选择使用何种程序打开该文件类型. 8.另外一种操作方式,选中一个文件,点击右键在菜单中的打开方式,也可选择使用何种程序打开此类文件.