FileOutputStream打开的FileNotFoundException

时间:2014-01-05 19:23:22

标签: java guava

当我尝试创建FileOutputStream时,我遇到了FileNotFoundException。该文件根据file.exists存在。我已经尝试过像file.mkdir(s)这样的所有东西...... 我在Mac上,我正在使用gauva。 文件输入为''

java.io.FileNotFoundException: /Users/big_Xplosion/mods/Blaze-Installer/installer/test
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:194)
at com.google.common.io.Files$FileByteSink.openStream(Files.java:223)
at com.google.common.io.Files$FileByteSink.openStream(Files.java:211)
at com.google.common.io.ByteSource.copyTo(ByteSource.java:203)
at com.google.common.io.Files.copy(Files.java:382)
at com.big_Xplosion.blazeInstaller.util.DownloadUtil.downloadFile(DownloadUtil.java:80)
at com.big_Xplosion.blazeInstaller.action.MCPInstall.downloadMCP(MCPInstall.java:78)
at com.big_Xplosion.blazeInstaller.action.MCPInstall.install(MCPInstall.java:30)
at com.big_Xplosion.blazeInstaller.util.InstallType.install(InstallType.java:37)
at com.big_Xplosion.blazeInstaller.BlazeInstaller.handleOptions(BlazeInstaller.java:51)
at com.big_Xplosion.blazeInstaller.BlazeInstaller.main(BlazeInstaller.java:26)

主类中的代码。

File file = mcpSpec.value(options); //the file input given is 'test'

        try
        {
            InstallType.MCP.install(file.getAbsoluteFile());
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }

执行代码 mcpTarget文件必须是目录

public boolean install(File mcpTarget) throws IOException
{
    mcpTarget.mkdirs();

    if (isMCPInstalled(mcpTarget))
        System.out.println(String.format("MCP is already installed in %s, skipped download and extraction.", mcpTarget));
    else if (isMCPDownloaded(mcpTarget))
    {
        if (!unpackMCPZip(mcpTarget))
            return false;
    }
    else
    {
        if (!downloadMCP(mcpTarget))
            return false;

        if (!unpackMCPZip(mcpTarget))
            return false;
    }

    System.out.println("Successfully downloaded and unpacked MCP");

    return false;
}

下载MCP方法

public boolean downloadMCP(File targetFile)
{
    String mcpURL = new UnresolvedString(LibURL.MCP_DOWNLOAD_URL, new VersionResolver()).call();

    if (!DownloadUtil.downloadFile("MCP", targetFile, mcpURL))
    {
        System.out.println("Failed to download MCP, please try again and if it still doesn't work contact a dev.");
        return false;
    }

    return true;
}

和DownloadUtil.DownloadFile方法

public static boolean downloadFile(String name, File path, String downloadUrl)
{
    System.out.println(String.format("Attempt at downloading file: %s", name));

    try
    {
        URL url = new URL(downloadUrl);
        final URLConnection connection = url.openConnection();
        connection.setConnectTimeout(6000);
        connection.setReadTimeout(6000);

        InputSupplier<InputStream> urlSupplier = new InputSupplier<InputStream>()
        {
            @Override
            public InputStream getInput() throws IOException
            {
                return connection.getInputStream();
            }
        };

        Files.copy(urlSupplier, path);

        return true;
    }
    catch (Exception e)
    {
        e.printStackTrace();

        return false;
    }
}

1 个答案:

答案 0 :(得分:2)

mcpTarget.mkdirs();
mcpTarget.mkdir();

这就是问题所在。您正在指定的文件中创建一个文件夹。将其替换为

mcpTarget.getParentFile().mkdirs();

(或者,因为你使用Guava,请使用:Files.createParentDirs(mcpTarget)

此外,后者是前者的子集,因此您永远不需要调用两个mkdir方法。