我在使用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)src/com.myprogram.utils
包,以及(4)bin
文件夹,我得到了同样的错误。我想知道:我可以继续操作OS / persmissions吗?我的应用程序可以尝试来创建文件夹和日志文件,但是被Windows 7拒绝这样做吗?如果是这样,我该怎么办?!?!
如果没有,我在哪里放置logs/system.log
???
感谢你明白这一点!
答案 0 :(得分:6)
要查看您所在的目录,请添加以下print语句:
System.out.println(new File(".").getAbsolutePath());
这将告诉您应在何处创建logs
目录。
答案 1 :(得分:0)
尝试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();
}
}
答案 2 :(得分:0)
您使用的路径是相对于当前工作目录的。您当前的工作目录取决于您如何运行您的应用程序。我想这是MyEclipseProject。因此,您必须在项目下创建目录log
(在src
和bin
目录所在的同一级别),然后在此目录中创建文件system.log
。然后再试一次。我相信你的代码将开始工作。
在写入文件之前,它不会尝试打印new File("logs/system.log").getAbsolutePath()
。它将显示系统期望查看文件的位置。
答案 3 :(得分:0)
在现代文件系统上创建文件路径时(至少,对于Windows,Mac和我熟悉的Linux版本都是如此),存在绝对路径并且存在相对路径。绝对路径是指通过文件系统直到您要查找的特定文件的路径,例如C:\Program Files\Application\application.exe
。相对路径是(如所暗示的)相对于当前位置。
如果我使用'System.out.println(new File(“。”)。getAbsolutePath());'来运行main()
,例如,我得到输出
C:\my-workspace\myproject\.
.
代表当前目录。这就是为什么你可以用它来找到应该创建目录的地方。
如果找不到它,Java会创建该文件是正确的,但该目录的情况也是如此。您必须在运行代码之前或使用File#mkdir()
方法在代码本身中创建目录。
答案 4 :(得分:0)
取决于你如何调用应用程序,但你应该在项目根目录中创建日志目录,你应该能够在那里写一个文件。
在打开流时,Java本身不会创建此目录。
您可能遇到权限问题。尝试:
System.out.println("can write: " + new File(./logs).canWrite());