2010-03-26 2 views
0

Это сводит меня с ума! У меня есть панель, которая отображает список файлов из каталога. Список сохраняется в векторе. Когда я нажимаю кнопку, в том же каталоге создается новый файл, и список необходимо обновить.Не найдено ни одного отзыва

Я не понимаю, почему Java не может видеть новый файл, даже если я добавлю хороший старый DIR в Dos, Dos может видеть файл. Как будто новый файл невидим, хотя я вижу его, и Dos может его увидеть. Я попытался дать ему некоторое время (спать, урожай), но это бесполезно. Я также попытался копировать в новый файл temp и читать temp, но снова безрезультатно. Вот какой код (удалены некоторые нерелевантные строки):

public class Button extends EncapsulatedButton { 

public Button() 
{ 
    super("button pressed"); 
} 

public void actionPerformed(ActionEvent arg0) { 

//removed function here where the new file is created in the directory 
//remove call to DOS that regenerates /myFileList.txt after a new file was added in the directory 
//at this point, DOS can see the new file and myFileList.txt is updated, however it is read by java without the update!!!!! 

//now trying to read the directory after the new file was created 

    Vector data = new Vector<String>(); 
    String s = null; 

// Create the readers to read the file. 

    try { 
    File f = new File("/myFileList.txt"); 
    BufferedReader stream = new BufferedReader(new InputStreamReader(new FileInputStream(f))); 

    while((s = stream.readLine()) != null) 
    { 
    data.addElement(s.trim()); 
    } 
    stream.close(); 

    } catch (IOException e) { 
    e.printStackTrace(); 
    } 

    util(); 

} 

void util(){ 
//giving it time is not helping 
    Thread.yield(); 
    try { 
    Thread.sleep(10000); 
    } catch (InterruptedException e1) { 
    e1.printStackTrace(); 
    } 
    //get the file listing through java instead of DOS - still invisible 
    File fLocation = new File("/myDir"); 
    File[] filesFound = fLocation.listFiles(); 

    for (int i = 0; i < filesFound.length; i++) { 
     if (filesFound[i].isFile()) { 
     System.out.println("**********" + filesFound[i].getName()); 
     } 
    } 

//last resort: copy to a temp then read from there - still not good 
    try{ 
    //copy to a temp file 
     File inputFile = new File("/myFileList.txt"); 
     File outputFile = new File("/myFileList_temp.txt"); 

     FileReader in = new FileReader(inputFile); 
     FileWriter out = new FileWriter(outputFile); 
     int c; 

     while ((c = in.read()) != -1) 
     out.write(c); 

     in.close(); 
     out.close(); 

    //read the copy to see if it is updated 
     // Open the file that is the first 
     // command line parameter 
     FileInputStream fstream = new FileInputStream("/myFileList_temp.txt"); 
     // Get the object of DataInputStream 
     DataInputStream in1 = new DataInputStream(fstream); 
     BufferedReader br = new BufferedReader(new InputStreamReader(in1)); 
     String strLine; 
     //Read File Line By Line 
     while ((strLine = br.readLine()) != null) { 
     // Print the content on the console 
     System.out.println ("Test file read: " + strLine); 
     } 
     //Close the input stream 
     in1.close(); 
     }catch (Exception e){//Catch exception if any 
     System.err.println("Error: " + e.getMessage()); 
     } 
} 

} 

Я был бы признателен (а) любым выводам. Спасибо.

myFileList.txt lokks, как это:

myline1 
myline2 
myline3 

После добавления нового файла в папке,

myline4 должен появиться в нем, то он будет читать и отображаться на панели.

+0

Где именно вы пытаетесь прочитать этот файл? Действительно корневой каталог? А что такое/myDir? – FRotthowe

+0

Файлы и каталоги динамически генерируются во время выполнения. Представленные здесь местоположения - это просто фиктивные замены в локальном каталоге. Кодовая база довольно сложная, но я думал, что это будет хорошим приближением. Во всяком случае, это не случай чтения неправильного файла или неправильного каталога. Я вижу файлы, открытые в текстовом редакторе, и у них есть новая строка. – alex

+0

Почему, в имени богов, вы просто не читаете каталог/для класса File есть метод для этого), а не файл, в котором, как предполагается, указано содержимое каталога? – Ingo

ответ

0

Честно говоря, ваш код беспорядок.

Вы читаете от /myFileList.txt и ничего не делаете с тем, что вы читаете, за исключением хранения его в временном Vector. В лучшем случае это не влияет; в худшем случае (если файл не существует, например), он выдает исключение. Независимо от того, что он делает, он не создает новый файл.

Кроме того, я не вижу ссылки на панель в вашем графическом интерфейсе, которая предположительно отображает список файлов. Как вы ожидаете, что он будет обновлен?

+0

Некоторые строки кода были отредактированы, чтобы сделать представленный здесь код немного легче и защитить IP-адрес моей компании. Вектор фактически находится в другой функции, и он считывается, затем содержимое заканчивается на панели. Я согласен, что это не ясно, но это лучшее, что я могу сделать. Существует функция util(), которая отображает в оболочку всю информацию (содержимое myFileList.txt). – alex

+0

Ну, если вы не можете поделиться неудачным кодом, я не могу вам помочь. Сожалею. – Thomas

+0

Все в порядке. Я ищу больше, чтобы найти теоретические предложения или альтернативные способы перечислить каталог, а затем прочитать файл. Мне кажется, что окна как-то блокируют индекс каталога, а io не может прочитать «последнюю» версию. Что-то странное. Я думаю, что io имеет проблемы с замками. – alex

0

Это работает для меня: Чтобы обновить список каталогов, снова вызовите .listFiles().

filesFound = fLocation.listFiles(); должен показать самый обновленный список каталогов. Надеюсь, это поможет вам.

Смежные вопросы