我在我的程序中要读取一个文件的内容,在读取的时候有可能其他的程序(该程序不可修改)会对文件进行写操作。怎样才不会让进行写操作的程序访问这个文件时候被拒绝 我在我的程序中要读取一个文件的内容,在读取的时候有可能其他的程序(该程序不可修改)会对文件进行写操作。怎样才不会让进行写操作的程序访问这个文件时候被拒绝,或者说我的这个程序怎么保证2者间不出现冲突 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我测试了一下:可以同时从两个线程写同一个文件的。代码如下package io;import java.io.File;import java.io.FileWriter;import java.io.IOException;public class FileShareRead { public static void main(String[] args) throws IOException { String fileName="haha.txt"; File file = new File(fileName); file.createNewFile(); if(!file.exists()){ System.err.print("File: "+fileName+" not exist!"); return ; } if(!file.isFile()){ System.err.print("File: "+fileName+" is a Dir.!"); return ; } System.err.println("file.canWrite() = "+file.canWrite());// file.setReadOnly(); new AnotherThread(fileName).start(); FileWriter writer=new FileWriter(file); for(int i=0;i<100;i++){ writer.write(Thread.currentThread().getName()+i+"\n"); try { Thread.sleep(10+i); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } writer.close(); System.out.println(Thread.currentThread().getName()+" : Over !"); } static class AnotherThread extends Thread{ String fileName; public AnotherThread(){ } public AnotherThread(String fileName){ this.fileName=fileName; } public void run(){ File file = new File(fileName); if(!file.exists()){ System.err.print("File: "+fileName+" not exist!"); return ; } if(!file.isFile()){ System.err.print("File: "+fileName+" is a Dir.!"); return ; } FileWriter writer=null; try { writer=new FileWriter(file); for(int i=0;i<100;i++){ writer.write(Thread.currentThread().getName()+i+"\n"); try { Thread.sleep(5+i); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println(Thread.currentThread().getName()+" : Over !"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { writer.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }}运行结果如下:main0main1main2main3main4main5main6main7main8main9main10main11main12main13main14main15main16main17main18main19main20main21main22main23main24main25main26main27main28main29main30main31main32main33main34main35main36main37main38main39main40main41main42main43main44main45main46main47main48main49main50main51main52main53main54main55main56main57main58main59main60main61main62main63main64main65main66main67main68main69main70main71main72main73main74main75main76main77main78main79main80main81main82main83main84main85main86main87main88main89main90main91main92main93main94main95main96main97main98main99063Thread-064Thread-065Thread-066Thread-067Thread-068Thread-069Thread-070Thread-071Thread-072Thread-073Thread-074Thread-075Thread-076Thread-077Thread-078Thread-079Thread-080Thread-081Thread-082Thread-083Thread-084Thread-085Thread-086Thread-087Thread-088Thread-089Thread-090Thread-091Thread-092Thread-093Thread-094Thread-095Thread-096Thread-097Thread-098Thread-099 那就不妨变通一下,先copy一份,读这个copy出来的文件,读完了再删,其他程序写入时就没影响了 但是你copy文件的时候不也是打开字符流然后一行一行的readLine()在你copy的时候可能另一个程序要写还是会冲突 不知道 RandomAccessFile bfin=new RandomAccessFile(filename,"r");这样行不行 有些文件本身就没办法读取的,比如像SAM,NTUSER.DAT这样被锁定的文件。 文件锁阿FileLock lock = new FileOutputStream("d:\\a.txt").getChannel().tryLock(); 一高手说:用windows api/jni的方法可以比方说,你可以设置这边往一个文件里写时,另一方也可以同时写 这个可能是你得那个写的程序进行了独占锁定来写,或者它的写的方式不同导致的。你可以尝试在那个写的程序打开工作的时候,copy这个文件的一个副本看看能否copy成功,如果能copy成功,那用普通的读取的方法还是可以read的 那样不还是打开文件,然后一行行的读取里面的内容吗?和我读取不是一样难道有其他复制txt的方法 楼主他们说的线程同步就可以实现了,你用一个临时空间,临时空间的get和set方法必须是线程同步的,然后你写文件的线程调用set方法,你取文件的线程调用get方法………………这样就解决问题了……………… 如何实现单击出现一个新的Applet窗口? java中XPath表示中有冒号,如何处理? process 是怎么运行带main函数的class 希望高手提供实例 谢谢 MidiSystem.getSequencer(false/true) 的作用 不同表空间不同用户的Type及Clob导入 java怎么获取package包中所有类的名字 用JAVA如何判断远程文件的存在 传值?传引用的副本?一个问题请大家回答。 applet调用的问题 如何把draw方法转换buffImage对象 最大匹配子串。 问过好多高手的,他们说没有遇到这种问题
可以同时从两个线程写同一个文件的。
代码如下package io;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;public class FileShareRead {
public static void main(String[] args) throws IOException {
String fileName="haha.txt";
File file = new File(fileName);
file.createNewFile();
if(!file.exists()){
System.err.print("File: "+fileName+" not exist!");
return ;
}
if(!file.isFile()){
System.err.print("File: "+fileName+" is a Dir.!");
return ;
}
System.err.println("file.canWrite() = "+file.canWrite());
// file.setReadOnly();
new AnotherThread(fileName).start();
FileWriter writer=new FileWriter(file);
for(int i=0;i<100;i++){
writer.write(Thread.currentThread().getName()+i+"\n");
try {
Thread.sleep(10+i);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
writer.close();
System.out.println(Thread.currentThread().getName()+" : Over !");
}
static class AnotherThread extends Thread{
String fileName;
public AnotherThread(){
}
public AnotherThread(String fileName){
this.fileName=fileName;
}
public void run(){
File file = new File(fileName);
if(!file.exists()){
System.err.print("File: "+fileName+" not exist!");
return ;
}
if(!file.isFile()){
System.err.print("File: "+fileName+" is a Dir.!");
return ;
}
FileWriter writer=null;
try {
writer=new FileWriter(file);
for(int i=0;i<100;i++){
writer.write(Thread.currentThread().getName()+i+"\n");
try {
Thread.sleep(5+i);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+" : Over !");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}}运行结果如下:
main0
main1
main2
main3
main4
main5
main6
main7
main8
main9
main10
main11
main12
main13
main14
main15
main16
main17
main18
main19
main20
main21
main22
main23
main24
main25
main26
main27
main28
main29
main30
main31
main32
main33
main34
main35
main36
main37
main38
main39
main40
main41
main42
main43
main44
main45
main46
main47
main48
main49
main50
main51
main52
main53
main54
main55
main56
main57
main58
main59
main60
main61
main62
main63
main64
main65
main66
main67
main68
main69
main70
main71
main72
main73
main74
main75
main76
main77
main78
main79
main80
main81
main82
main83
main84
main85
main86
main87
main88
main89
main90
main91
main92
main93
main94
main95
main96
main97
main98
main99
063
Thread-064
Thread-065
Thread-066
Thread-067
Thread-068
Thread-069
Thread-070
Thread-071
Thread-072
Thread-073
Thread-074
Thread-075
Thread-076
Thread-077
Thread-078
Thread-079
Thread-080
Thread-081
Thread-082
Thread-083
Thread-084
Thread-085
Thread-086
Thread-087
Thread-088
Thread-089
Thread-090
Thread-091
Thread-092
Thread-093
Thread-094
Thread-095
Thread-096
Thread-097
Thread-098
Thread-099
在你copy的时候可能另一个程序要写
还是会冲突
RandomAccessFile bfin=new RandomAccessFile(filename,"r");这样行不行
FileLock lock = new FileOutputStream("d:\\a.txt").getChannel().tryLock();
比方说,你可以设置这边往一个文件里写时,另一方也可以同时写
你可以尝试在那个写的程序打开工作的时候,copy这个文件的一个副本看看能否copy成功,如果能copy成功,那用普通的读取的方法还是可以read的
难道有其他复制txt的方法