我在我的程序中要读取一个文件的内容,在读取的时候有可能其他的程序(该程序不可修改)会对文件进行写操作。怎样才不会让进行写操作的程序访问这个文件时候被拒绝,或者说我的这个程序怎么保证2者间不出现冲突

解决方案 »

  1.   

    我测试了一下:
    可以同时从两个线程写同一个文件的。
    代码如下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
      

  2.   

    那就不妨变通一下,先copy一份,读这个copy出来的文件,读完了再删,其他程序写入时就没影响了
      

  3.   

    但是你copy文件的时候不也是打开字符流然后一行一行的readLine()
    在你copy的时候可能另一个程序要写
    还是会冲突
      

  4.   

    不知道
     RandomAccessFile bfin=new  RandomAccessFile(filename,"r");这样行不行
      

  5.   

    有些文件本身就没办法读取的,比如像SAM,NTUSER.DAT这样被锁定的文件。
      

  6.   

    文件锁阿
    FileLock lock = new FileOutputStream("d:\\a.txt").getChannel().tryLock();
      

  7.   

    一高手说:用windows api/jni的方法可以
    比方说,你可以设置这边往一个文件里写时,另一方也可以同时写
      

  8.   

    这个可能是你得那个写的程序进行了独占锁定来写,或者它的写的方式不同导致的。
    你可以尝试在那个写的程序打开工作的时候,copy这个文件的一个副本看看能否copy成功,如果能copy成功,那用普通的读取的方法还是可以read的
      

  9.   

    那样不还是打开文件,然后一行行的读取里面的内容吗?和我读取不是一样
    难道有其他复制txt的方法
      

  10.   

    楼主他们说的线程同步就可以实现了,你用一个临时空间,临时空间的get和set方法必须是线程同步的,然后你写文件的线程调用set方法,你取文件的线程调用get方法………………这样就解决问题了………………