【问题标题】:Copy file from JFileChooser to new directory将文件从 JFileChooser 复制到新目录
【发布时间】:2014-11-14 12:10:47
【问题描述】:

好的,我不确定为什么这不起作用,但我正在尝试使用 JFileChooser 选择源文件(C、C++、Java),然后将其复制到我的项目的工作区中。当我运行它时,它会选择我选择的文件,它将我的工作区识别为目标,但由于某种原因只是不复制文件。

        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;

        }
    });

【问题讨论】:

  • 您是否遇到任何运行时错误?如果是,是什么?
  • 您使用什么证据表明它不会复制文件?例如,Eclipse 不一定会因为工作区目录中的文件发生变化而更新其在项目中的文件列表;您需要在文件更改后“刷新”项目,以确保 IDE 知道文件更改。如果您依靠 IDE 告诉您文件已被复制,并且您没有刷新项目,您可能会认为它没有被复制,但实际上确实如此。
  • 您没有使用Files.copy 是否有特定原因?我知道这些文件在技术上是 inputStreams,但 Files.copy 提供了更多的灵活性。
  • 我尝试了 Files.copy 和上面的方法。两者都没有给出运行时错误。在这两种方法中,我都没有给出任何错误指示,但它根本没有创建新文件。我尝试了@afzalex 提供的建议,它适用于上述方法。然后我转换回 Files.copy 方法,对目标路径进行了相同的更正,它工作了,所以我现在成功使用 Files.copy
  • 当你使用@user时,他会收到通知。如果您想让他看到您在写什么,请使用它。 (我以为你不想在这里通知我。不过如果你想要的话很好:))。

标签: java swing file-io directory


【解决方案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

如果还不清楚,请告诉我。

【讨论】:

  • 不,这完全有道理。谢谢。
  • 如果您认为答案正确(或最佳),您可以接受。 @nhoughto。只是告诉你,如果你不知道。这样 OP 将获得 +2 并且应答者将获得 +15 声望。这就是它的工作原理。
【解决方案2】:

对于 File dest,不要将两者相加,而是尝试用逗号分隔它们。

将 dest 的 sysout 作为附加版本和逗号版本,看看为什么这样做会出现问题。

【讨论】:

  • 在此处添加评论,因为我还没有代表将其添加到 afzalex 的帖子中... Afzalex 是正确的。 + 不包括文件夹和文件之间的 \,这意味着您必须执行 File dest =new File(System.getProperty("user.dir") + "\\" + selectedFile.getName());使其正确。只用逗号更容易。
猜你喜欢
  • 2022-01-21
  • 2012-03-18
  • 2012-07-12
  • 1970-01-01
  • 2018-10-27
  • 2017-11-18
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多