2014-09-19 77 views
0

好吧,我不確定爲什麼這不起作用,但我試圖使用JFileChooser來選擇源文件(C,C++,Java),然後將其複製到工作區我的項目。當我運行它時,它會選擇我選擇的文件,它會將我的工作區識別爲目標,但出於某種原因不會複製文件。將文件從JFileChooser複製到新目錄

 JButton btnSelectFile = new JButton("Select File"); 
    btnSelectFile.addMouseListener(new MouseAdapter(){ 
     public void mouseClicked(MouseEvent e){ 
      JFileChooser FileChooser = new JFileChooser(); 
      FileNameExtensionFilter filter = new FileNameExtensionFilter("C, C++ or Java Files", "c", "cpp", "java"); 
      FileChooser.setFileFilter(filter); 
      int returnValue = FileChooser.showOpenDialog(null); 
      if (returnValue == JFileChooser.APPROVE_OPTION){ 
       selectedFile = FileChooser.getSelectedFile(); 
       filePath = selectedFile.getAbsolutePath(); 
       InputStream inStream = null; 
       OutputStream outStream = null; 
       try{ 
        File source =new File(filePath); 
        File dest =new File(System.getProperty("user.dir") + selectedFile.getName()); 
        inStream = new FileInputStream(source); 
        outStream = new FileOutputStream(dest); 

        byte[] buffer = new byte[1024]; 

        int length; 
        while ((length = inStream.read(buffer)) > 0){ 
         outStream.write(buffer, 0, length); 
        } 

        if (inStream != null)inStream.close(); 
        if (outStream != null)outStream.close(); 
        System.out.println("File Copied.."); 
       }catch(IOException e1){ 
        e1.printStackTrace(); 
       } 
       textArea.setText("File Loaded: " + selectedFile.getName() + "\n\n\n" + "Hit 'Run Code'"); 
      } 
      else System.out.println("Failed to Load"); 
       //UnitXMLReader.ChosenFile = filePath; 

     } 
    }); 
+0

你是否得到任何運行時錯誤?如果是,什麼? – afzalex 2014-09-19 20:14:08

+1

你用什麼證據證明它不復制文件?例如,Eclipse只是因爲工作空間目錄中的文件發生更改而不必更新項目中的文件列表;您需要在文件更改後「刷新」該項目,以確保IDE知道文件更改。如果你依靠IDE來告訴你文件被複制,並且你沒有刷新項目,你可能會認爲它沒有被複制,但實際上它是複製的。 – arcy 2014-09-19 20:16:48

+0

是否有你沒有使用[Files.copy](http://docs.oracle.com/javase/tutorial/essential/io/copy.html)的特定原因?我知道這些文件在技術上是inputStreams,但Files.copy提供了更多的靈活性。 – Compass 2014-09-19 20:20:15

回答

1

使用時創建以下目標File

File dest =new File(System.getProperty("user.dir"), selectedFile.getName()); 

,而不是這個

File dest =new File(System.getProperty("user.dir") + selectedFile.getName()); 


假設System.getProperty("user.dir")回報C:\Users\Me\WorkspaceselectedFile.getName()回報myfile.cpp
然後在你的情況下dest代表C:\Users\Me\Workspacemyfile.cpp而不是 C:\Users\Me\Workspace\myfile.cpp

告訴我,如果它仍然不清楚。

+0

不,這樣做很有意義。謝謝。 – nhoughto 2014-09-19 20:38:19

+0

如果您發現正確(或最佳),您可以接受答案。 @nhoughto。只是告訴你,如果你不知道。這樣OP將獲得+2,回答者將獲得+15的聲望。這是它的工作原理。 – afzalex 2014-09-19 21:06:04

0

對於File dest,不要添加這兩個,請嘗試用逗號分隔它們。

爲dest做一個sysout作爲加法版本和逗號版本,看看爲什麼有這樣的問題。

+0

在這裏添加評論,因爲我沒有代表尚未將其添加到afzalex的帖子... Afzalex是正確的。 +不包括文件夾和文件之間的\,這意味着你必須做File dest = new File(System.getProperty(「user.dir」)+「\\」+ selectedFile.getName());使其正確。只是做逗號比較容易。 – 2014-09-19 20:26:20