Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 305
  • Last Modified:

Lucene: "FileNotFoundException"

I'm using threads in which i'm searching an xml index and sometimes updating the index also.....

However, (probabaly on the occasions when the two threads(+) conincide) i get a "FileNotFoundException": the system cannot find the path specified...
or else an "IOException": couldn't delete _4.fl

So, i'm presuming that there is a conflict, whenever there may be an indexing and a search at the same time?

(By the way.....
I'm using Digester to parse & index the xml file
In my xmlParser class, i have a 'contacts' class (which holds all the properties or each contact entry which must be declared public and static for digester to instantiate it....)

How could i make sure these two errors never occur.......
0
vinoboy
Asked:
vinoboy
  • 5
  • 3
1 Solution
 
Mayank SAssociate Director - Product EngineeringCommented:
>> couldn't delete _4.fl

Do you also try to delete the files somewhere?
0
 
vinoboyAuthor Commented:
No, i didn't, but i presume that when its updating the index (ie, overwriting i think) that it deletes them itself
0
 
Mayank SAssociate Director - Product EngineeringCommented:
Make sure that you synchronize your file-access properly. Ideally, when a file is being read by a thread, no other thread should write to it till that one closes it. Sameway, if a file is being written into by one thread, you should not let any other thread read from it till this one closes it.
0
Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

 
vinoboyAuthor Commented:
And an easily implementable and reliable way to do the synchronisation of file access is?
0
 
Mayank SAssociate Director - Product EngineeringCommented:
Perhaps you could use a common log-file. If a file is being written to, then the program would write its name to this file. Any other threads trying to access that file would wait till the file's entry is removed from that log-file (which will be done by the thread using it, after it is done with the file).

You could also carefully use synchronization between threads, but I don't have your code to help you with that.
0
 
vinoboyAuthor Commented:
I'll give the log file a shot....Its mere existance could tell me that the 'updating index' program is been used...
0
 
Mayank SAssociate Director - Product EngineeringCommented:
Don't check only for existance. Let the log-file always be there. Let the existance of the working file-name in the log-file decide whether it is to be accessed or not. You can write a separate class for this log-file purpose.
0
 
illusionz70Commented:
use locks to lock the file before you access it so that no other thread/process can change it

import java.nio.channels.*; //works on 1.4 only

FileLock lck = new FileOutputStream("C:\\File").getChannel().tryLock();
            if(lck == null)
                               {
      System.out.println("Another thread is already accesing the file....");
            }

c:\\file can be the common file which is locked.if this file is not locked then a thread can do the required if it is locked then the thread has to wait.

cheers
0
 
Mayank SAssociate Director - Product EngineeringCommented:
Ah, indeed~! Should've thought of that! Have been working on 1.3 a lot these days! You can see more on locks here:

http://www.javaalmanac.com/egs/java.nio/SetFileLock.html

http://www.javaalmanac.com/egs/java.nio/SharedLock.html
0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

  • 5
  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now