FileNotFoundException для действительного файла, использующего FileInputStream - PullRequest
0 голосов
/ 16 февраля 2020

Когда я пишу FileInputStream, когда у меня есть действительный файл, он генерирует исключение FileNotFoundException. Я использовал это:

package io;
import java.io.*;
public class implementIo {
    public static int i;
    public static FileOutputStream output;
    public static FileInputStream input;
    public static void main(String args[]) {
    try {
                output = new FileOutputStream("writeModification.txt");
            input = new FileInputStream("modification.txt");
            do {
        i = input.read();
        if(i != -1) output.write(i);
        }while(i != -1);
    } catch (Exception e) {
        System.out.println("Exception caught " + e);
    } finally {
        try {
            if(output == null) input.close();
        }catch(IOException e) {
            System.out.println("IOException caught: " + e);
        }
    }
}

}

Хотя у меня было два отдельных файла с именами "ification.txt " и " printModification.txt " в той же папке пакета, но система выбросила FileNotFoundException. Пожалуйста, помогите!

1 Ответ

0 голосов
/ 16 февраля 2020

Это потому, что FileInputStream не обеспечивает создание файла во время инициализации, как new FileOutputStream(). Поэтому, если они были сказаны, мы можем помнить одну интересную вещь: ification.txt будет создаваться каждый раз, когда вы инициализируете FileOutputStreamне будет перезаписать) и вот почему, скорее всего, ваш код разрывается на строку new FileInputStream().

Как вы можете обработать ваше исключение? Вы либо создаете свой файл перед выполнением кода (вручную с помощью New -> Text Document et c.), Либо изменяете свой код и используете класс File:

File file = new File("modification.txt");
    try {
        file.createNewFile();
        input = new FileInputStream(file);
        //your code here - output etc.

Ваш код все еще не работает, даже если у вас есть файлы, созданные в той же папке пакета? Это потому, что по умолчанию ваши потоки ищут ваши файлы - это текущий рабочий каталог. Вот пример:

myproject
   |___src
   |    |___main
   |          |___java
   |                |___io
   |                     |___implementIo
   |___writeModification.txt
   |___modification.txt

Это правильная структура, если вы хотите использовать потоки, как вы (с простым именем файла в аргументе конструктора потока). Но если ваших файлов там нет, вы должны указать абсолютный путь. Вот пример:

 myproject
   |___src
        |___main
              |___java
                    |___io
                         |___implementIo
                         |___writeModification.txt
                         |___modification.txt

И правильный способ доступа к файлам такой:

FileInputStream input = new FileInputStream("C://myproject//src//main//java//io//modification.txt");

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

...