Запись в файл на Java: не удается найти указанный путь - PullRequest
3 голосов
/ 17 августа 2011

У меня огромная трудность записи в простой текстовый файл на Java.Каждый поиск, который я выполняю для исключения ввода-вывода, который я получаю, вызывает множество предложений, но ни одно из них не применимо к этой ситуации.

Вот структура моего проекта:

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)root моего проекта (MyEclipseProject), (2) папка src/, (3) пакет src/com.myprogram.utils и (4) папка bin, и я получаю точно такую ​​же ошибку.Я задаюсь вопросом: могу ли я иметь дело с OS / persmissions?Может ли мое приложение пытаться создать папку и файл журнала, но получит отказ в разрешении на это в Windows 7?Если да, то что мне делать?!?!

Если нет, то куда я могу поставить logs/system.log ???

Спасибо за ясность в этом!

Ответы [ 5 ]

6 голосов
/ 17 августа 2011

Чтобы увидеть, в каком каталоге вы находитесь, добавьте следующий оператор печати:

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

Это скажет вам, где вы должны создать каталог logs.

0 голосов
/ 17 августа 2011

зависит от того, как вы вызываете приложение, но вы должны создать каталог журналов внутри корня проекта, и вы сможете написать туда файл.

Java сама по себе не создаст этот каталог при открытии потока.

У вас могут быть проблемы с разрешениями.Попробуйте:

System.out.println("can write: " + new File(./logs).canWrite());
0 голосов
/ 17 августа 2011

При создании пути к файлу в современных файловых системах (по крайней мере, это верно для Windows, Mac и разновидностей Linux, с которыми я знаком), существуют абсолютные пути и относительные пути.Абсолютный путь - это путь через файловую систему до конкретного файла, который вы ищете, например, C:\Program Files\Application\application.exe.Относительные пути (как подразумевается) относительно текущего местоположения.

Если я запускаю main() со строкой 'System.out.println (новый файл ("."). GetAbsolutePath ());',например, я получаю вывод

C:\my-workspace\myproject\.

. представляет текущий каталог.Вот почему вы можете использовать это, чтобы найти, где должен быть создан каталог.

Вы правы, что Java создаст файл, если не сможет его найти, но то же самое не верно для каталога.Вы должны создать каталог либо до запуска кода, либо в самом коде, используя метод File#mkdir().

0 голосов
/ 17 августа 2011

Путь, который вы используете, относительно текущего рабочего каталога. Ваш текущий рабочий каталог зависит от того, как вы запускаете ваше приложение. Я предполагаю, что это MyEclipseProject. Итак, вы должны создать каталог log в своем проекте (на том же уровне, где находятся каталоги src и bin), а затем создать файл system.log в этом каталоге. Тогда попробуйте еще раз. Я верю, что ваш код начнет работать.

Он не пытается напечатать new File("logs/system.log").getAbsolutePath() перед записью в файл. Он покажет вам, где система ожидает увидеть ваш файл.

0 голосов
/ 17 августа 2011

попробуй 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();
        }

}

...