繁体   English   中英

尝试将文件创建到(可能是)正确目录时出现java.io.FileNotFoundException

[英]java.io.FileNotFoundException when trying to create a file to a (probably) correct directory

嗨,我的问题是当我使用此功能时:

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)

很有可能是因为您的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();
        }       

    }
}

首先:查看此方法“ newFile”,也许您必须更改为适当的File调用:

文件f =新文件(mypath +“ PlayerList.txt”);

其次,尝试查看您的类成员'filePath'是否未更改(Start类的成员)。

如果要创建一个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);
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM