【问题标题】:Writing to a file in Java: Cannot find the path specified用 Java 写入文件:找不到指定的路径
【发布时间】:2011-08-17 15:05:31
【问题描述】:

我在用 Java 写入一个简单的文本文件时遇到了巨大的困难。我对收到的 IO 异常所做的每一次搜索都会找到很多建议,但没有一个适用于这种情况。

这是我的项目结构:

MyEclipseProject/
    src/
        com.myprogram.utils
            MyProgram
    bin/

还有我的 MyProgram.java 代码:

package com.myprogram.utils;

import java.io.FileWriter;

public class MyProgram
{
    public static void main(String[] args)
    {
        FileWriter oWriter = new FileWriter(new File("logs/system.log"));
        oWriter.write("This never gets logged because JRE can't find the file");
    }
}

我收到的异常消息指出:logs\system.log(系统找不到指定的路径)。

第一次尝试时,我没有先创建logs/ 目录及其后续日志文件。我的理解是,如果 Java 找不到该文件,它会为您创建它。

我现在放置了一个 logs 文件夹 - 有一个空白的 system.log 文件 - 里面:(1) 我的项目根目录 (MyEclipseProject),(2) src/ 文件夹,(3) @987654328 @ 包,和 (4) bin 文件夹,我得到了同样的错误。我想知道:我可以进行操作系统/权限的事情吗?我的应用程序是否可以尝试创建文件夹和日志文件,但被 Windows 7 拒绝这样做?如果是这样,我该怎么办?!?!

如果不是,我应该把logs/system.log放在哪里???

感谢您对此的澄清!

【问题讨论】:

  • 您是否尝试将文件名更改为简单的 system.log,然后发布会发生什么?

标签: java logging io file-writing


【解决方案1】:

要查看您所在的目录,请添加以下打印语句:

System.out.println(new File(".").getAbsolutePath());

这将告诉您应该在哪里创建 logs 目录。

【讨论】:

  • 感谢您的帮助!我听从了您的建议,找到了放置所有内容的正确目录。但是我现在面临一个单独的问题:每次运行程序时,都会创建一个新版本的日志文件;完全覆盖以前在其中的任何数据。为了使事情变得更复杂,它用空白(0字节)文件覆盖以前的文件 - 实际上没有记录任何内容。但我也没有得到任何已检查/未检查的异常......想法?
  • @Mara 您需要使用附加选项创建FileWriter,以便它附加到文件而不是覆盖它。您还需要在写信后flush() 和close()作者。
  • @Mara 另外,请使用BufferedWriter。看看 File IO 教程download.oracle.com/javase/tutorial/essential/io/file.html 了解写入文件的正确方法。
【解决方案2】:

试试 BufferedWriter

public static void main(String[] args {

String filename = "C:\\mynewtextfile.txt";
FileWriter fstream;
   try {
   fstream = new FileWriter(filename);
   BufferedWriter out = new BufferedWriter(fstream);
            out.write("My Name is Bobby");
            out.newLine();
            out.write("This is my text file.");                       
            out.flush();
            out.close();
        } 
   catch (IOException e) {
            e.getClass();
        }

}

【讨论】:

    【解决方案3】:

    您使用的路径是相对于当前工作目录的。您当前的工作目录取决于您如何运行应用程序。我猜它是 MyEclipseProject。因此,您必须在项目下创建目录log(与src 和bin 目录所在的级别相同),然后在该目录中创建文件system.log。然后再试一次。我相信您的代码将开始工作。

    它不会在写入文件之前尝试打印new File("logs/system.log").getAbsolutePath()。它将向您显示系统希望在哪里看到您的文件。

    【讨论】:

      【解决方案4】:

      在现代文件系统上创建文件路径时(至少对于 Windows、Mac 和我熟悉的 Linux 版本都是如此),有绝对路径和相对路径。绝对路径是通过文件系统到达您要查找的特定文件的路径,例如C:\Program Files\Application\application.exe。相对路径(隐含)相对于当前位置。

      例如,如果我使用“System.out.println(new File(".").getAbsolutePath());”行运行main(),我会得到输出

      C:\my-workspace\myproject\.

      . 代表当前目录。这就是为什么您可以使用它来查找应该创建目录的位置。

      如果找不到文件,Java 将创建该文件是正确的,但目录并非如此。您必须在运行代码之前或使用File#mkdir() 方法在代码本身中创建目录。

      【讨论】:

        【解决方案5】:

        取决于您如何调用应用程序,但您应该在项目根目录中创建日志目录,并且您应该能够在其中写入文件。

        Java 在打开流期间不会自行创建此目录。

        您可能会遇到权限问题。试试:

        System.out.println("can write: " + new File(./logs).canWrite());
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-24
          • 1970-01-01
          • 1970-01-01
          • 2020-12-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多