【问题标题】:java.io.FileNotFoundException when trying to create a file to a (probably) correct directory尝试将文件创建到(可能)正确的目录时出现 java.io.FileNotFoundException
【发布时间】:2015-01-25 22:04:59
【问题描述】:

您好,我的问题是当我使用这个时:

final File f = newFile(ButtonOneEvent.class.getProtectionDomain().getCodeSource().getLocation().getPath());
filePath = f.toString() + "/PlayerList.txt"; //Playerlist.txt being the file I want to create, filePath being an empty string.
System.out.println(f);

为此定义类的本地目录:

FileOutputStream fout = new FileOutputStream(Start.filePath); //**Reference Point**
if(inputData != null) {     //Ignore the if else statement
    new PrintStream(fout).println("Text Stuff")
} else {
    new PrintStream(fout).println("Text Stuff")
}
fout.close();

当我想创建这个文件时,我在“参考点”行上得到一个java.io.FileNotFoundException,当然它还没有。 此代码由JButton 激活。
顺便说一句,Sytem.out.println(f) 输出如下:

*/Users/HillFamily/Library/Application%20Support/Youth%20Digital/Software/Forge/mcp/eclipse/Football%20Card%20Sorter/bin* <- Directory

StackTrace:(抱歉,拖了这么久!)

java.io.FileNotFoundException: /Users/HillFamily/Library/Application%20Support/Youth%20Digital/Software/Forge/mcp/eclipse/Football%20Card%20Sorter/bin/PlayerList.txt (No such file or directory)
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:194)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:84)
    at events.ButtonOneEvent.actionPerformed(ButtonOneEvent.java:33)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2028)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2351)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
    at java.awt.Component.processMouseEvent(Component.java:6414)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3275)
    at java.awt.Component.processEvent(Component.java:6179)
    at java.awt.Container.processEvent(Container.java:2084)
    at java.awt.Component.dispatchEventImpl(Component.java:4776)
    at java.awt.Container.dispatchEventImpl(Container.java:2142)
    at java.awt.Component.dispatchEvent(Component.java:4604)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4618)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4279)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4209)
    at java.awt.Container.dispatchEventImpl(Container.java:2128)
    at java.awt.Window.dispatchEventImpl(Window.java:2492)
    at java.awt.Component.dispatchEvent(Component.java:4604)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:717)
    at java.awt.EventQueue.access$400(EventQueue.java:82)
    at java.awt.EventQueue$2.run(EventQueue.java:676)
    at java.awt.EventQueue$2.run(EventQueue.java:674)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:86)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:690)
    at java.awt.EventQueue$3.run(EventQueue.java:688)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:86)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:687)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

【问题讨论】:

  • 向我们展示堆栈跟踪!
  • 这是在 Windows 还是 Linux 上?

标签: java path relative-path filepath fileoutputstream


【解决方案1】:

首先:看看这个方法'newFile',也许你必须更改为正确的文件调用:

文件 f = new File(mypath+"PlayerList.txt");

其次,试试看你的类成员'filePath'是否没有被改变(Start类的成员)。

【讨论】:

    【解决方案2】:

    如果您想创建一个 OutputStream 以写入文件,请使用:
    如果文件不存在,这也会创建文件。

    try {
            Path p = Paths.get("demo", "test.txt");
            Files.createDirectories(p.getParent());
            DataOutputStream out = new DataOutputStream(Files.newOutputStream(p, StandardOpenOption.CREATE, StandardOpenOption.WRITE));
            out.writeBytes("Hello-World!!");
            out.flush();
            out.close();            
        } catch (IOException ex) {
            Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex);
        }
    

    【讨论】:

      【解决方案3】:

      很可能是因为您的Start.filePath 是目录(不是文件)、无法创建或根本不存在。此外,Start.filePath 依赖于系统,并且必须与您的平台兼容。您需要确保这是正确的,并且您所指的位置有足够的访问权限进行写操作。另一个问题,您的完整路径名如何知道您正在查看/写入正确的位置?路径上的某些目录是否真的存在?

      从修复操作开始 - 您可能需要检查您的 System.out.println(Start.filePath) 是否打印了任何有意义的内容。如果您遇到空格和 URL 编码问题(例如 %20 是 ASCII 中的空格),您需要开始在您的问题上下文中考虑它们。

      作为示例(从 Windows 的角度来看),请参见以下内容:

          public static void main(String[] args) {
              try{
      
               FileOutputStream fos = new FileOutputStream("C:/myjavaprojects/folder%20with%20a%20space/haha.txt");
               // This is unchecked exception - we have to rethrow/catchprocess it
               BufferedOutputStream bos = new BufferedOutputStream(fos);
      
               bos.write("Writing to file".getBytes());        
               bos.flush();
               bos.close();
              } catch (FileNotFoundException fnfe){
      
                  try{
                      FileOutputStream fos = new FileOutputStream("C:/myjavaprojects/folder with a space/haha.txt");
                       BufferedOutputStream bos = new BufferedOutputStream(fos);
                       bos.write("Writing to file".getBytes());            
                       bos.flush();
                       bos.close();
                  } catch(FileNotFoundException e){
                      e.printStackTrace();
                  } catch (IOException ioe){
                      ioe.printStackTrace();
                  }
      
              } catch (IOException ioe){
                  ioe.printStackTrace();
              }       
      
          }
      }
      

      【讨论】:

      • 有没有办法在文件中添加“演员”?或者我将如何在 Start.filePath 目录中编写一个名为“PlayerList.txt”的文件?你有什么建议?
      • @TurtulWarrior 您对文件路径中的那些 %20 符号有疑问,FileOutputStream 构造函数可能不接受它们。
      • 我应该做 filePath = filePath.replace("%20", File.separator); ?
      • @TurtulWarrior 你真的需要确保你的路径是有效的——如果你写错了路径——它根本行不通。另外,我在 Windows 上尝试了包含 %20 的路径,它抛出 FileNotFoundException - 但我不知道 MAC 是否有同样的问题。只需隔离您的文件位置并执行简单的FileOutputStream fos = new FileOutputStream(path) 即可查看这是否会在运行时引发任何异常。
      • 我认为实际路径可能不行,因为我移动了文件夹库,在应用程序支持中找不到青春数码。我不确定为什么路径仍然显示文件的原始位置。我会尝试手动找到正确的路径。
      猜你喜欢
      • 1970-01-01
      • 2016-09-26
      • 1970-01-01
      • 2017-10-27
      • 2022-06-13
      • 1970-01-01
      • 2020-02-12
      • 2019-01-14
      • 1970-01-01
      相关资源
      最近更新 更多