Java io filenotfoundexception in jar file

java.io.FileNotFoundException (Access is denied) – Causes and Fix

java.io.FileNotFoundException (Access is denied) – Causes and Fix tutorial shows what are the possible causes and fix for java.io.FileNotFoundException (Access is denied) exception.

How to fix java.io.FileNotFoundException (Access is denied) exception?

There are several possible causes due to which you may encounter java.io.FileNotFoundException (Access is denied) exception as given below.

1) Trying to open and read a directory

You cannot open and read a directory like normal files. Trying to do that will result in the exception. Please see the below-given code example where I try to open a directory and try to read it.

Make sure that you are not trying to open a directory for reading or writing.

2) You do not have permission to read the file

If you try to open and read a file for which you do not have the read permission, you will get this exception.

Make sure you have permission to read the file before opening and reading it.

3) Trying to overwrite a read-only file

If you try to overwrite a read-only file either using stream or writer, you will get the “Access is denied” exception.

Always check that if the file with the same name exists and it is not read-only before actually writing the file. If the file exists and it is read-only, make it writable as given in the below example.

4) Trying to create a file in the root folder of the system drive in Windows

In some versions of Windows, the system does not allow some users to write to the root of the system drive if they do not have the required privileges. Try to create a file in a subfolder, for example, C:/somedir/somefile.txt instead of the root “C:/somefile.txt”.

5) File is being used by another process

If the file is already opened exclusively by some other process, opening it for either reading or writing will cause java.io.FileNotFoundException (Access is denied) exception.

Make sure that the file is not opened by any other program or process.

Читайте также:  Массив добавление в начало php

This example is a part of the Java File tutorial.

Please let me know your views in the comments section below.

Источник

Как избежать Java FileNotFoundException при загрузке ресурсов

В этом руководстве мы рассмотрим проблему, которая может возникнуть при чтении файлов ресурсов в приложении Java: во время выполнения папка ресурсов редко находится в том же месте на диске, что и в нашем исходном коде.

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

2. Чтение файлов​

Допустим, наше приложение читает файл при запуске:

 try (FileReader fileReader = new FileReader("src/main/resources/input.txt");   BufferedReader reader = new BufferedReader(fileReader))    String contents = reader.lines()   .collect(Collectors.joining(System.lineSeparator()));   > 

Если мы запустим приведенный выше код в среде IDE, файл загрузится без ошибки. Это связано с тем, что наша IDE использует каталог нашего проекта в качестве текущего рабочего каталога , а каталог src/main/resources находится прямо там, чтобы приложение могло его прочитать.

Теперь предположим, что мы используем подключаемый модуль Maven JAR для упаковки нашего кода в виде JAR.

Когда мы запускаем его в командной строке:

Мы увидим следующую ошибку:

Exception in thread "main" java.io.FileNotFoundException:  src/main/resources/input.txt (No such file or directory)  at java.io.FileInputStream.open0(Native Method)  at java.io.FileInputStream.open(FileInputStream.java:195)  at java.io.FileInputStream.(FileInputStream.java:138)  at java.io.FileInputStream.(FileInputStream.java:93)  at java.io.FileReader.(FileReader.java:58)  at com.foreach.resource.MyResourceLoader.loadResourceWithReader(MyResourceLoader.java:14)  at com.foreach.resource.MyResourceLoader.main(MyResourceLoader.java:37) 

3. Исходный код против скомпилированного кода​

Когда мы создаем JAR, ресурсы помещаются в корневой каталог упакованных артефактов.

В нашем примере мы видим, что установка исходного кода имеет input.txt в src/main/resources в нашем каталоге исходного кода.

Однако в соответствующей структуре JAR мы видим:

META-INF/MANIFEST.MF META-INF/ com/ com/foreach/ com/foreach/resource/ META-INF/maven/ META-INF/maven/com.foreach/ META-INF/maven/com.foreach/core-java-io-files/ input.txt com/foreach/resource/MyResourceLoader.class META-INF/maven/com.foreach/core-java-io-files/pom.xml META-INF/maven/com.foreach/core-java-io-files/pom.properties 

Здесь input.txt находится в корневом каталоге JAR. Итак, когда код выполнится, мы увидим FileNotFoundException .

Даже если бы мы изменили путь на /input.txt , исходный код не смог бы загрузить этот файл, поскольку ресурсы обычно не адресуются как файлы на диске. Файлы ресурсов упакованы внутри JAR, поэтому нам нужен другой способ доступа к ним.

4. Ресурсы​

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

 try (InputStream inputStream = getClass().getResourceAsStream("/input.txt");   BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)))    String contents = reader.lines()   .collect(Collectors.joining(System.lineSeparator()));   > 

ClassLoader.getResourceAsStream() просматривает путь к классам для данного ресурса. Начальная косая черта на входе для getResourceAsStream() указывает загрузчику читать из базы пути к классам. Содержимое нашего JAR-файла находится в пути к классам , поэтому этот метод работает.

IDE обычно включает src/main/resources в свой путь к классам и, таким образом, находит файлы.

5. Вывод​

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

Как всегда, код примера доступен на GitHub .

Источник

Как избежать Java FileNotFoundException при загрузке ресурсов

В этом руководстве мы рассмотрим проблему, которая может возникнуть при чтении файлов ресурсов в приложении Java: во время выполнения папка ресурсов редко находится в том же месте на диске, что и в нашем исходном коде.

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

2. Чтение файлов​

Допустим, наше приложение читает файл при запуске:

 try (FileReader fileReader = new FileReader("src/main/resources/input.txt");   BufferedReader reader = new BufferedReader(fileReader))    String contents = reader.lines()   .collect(Collectors.joining(System.lineSeparator()));   > 

Если мы запустим приведенный выше код в среде IDE, файл загрузится без ошибки. Это связано с тем, что наша IDE использует каталог нашего проекта в качестве текущего рабочего каталога , а каталог src/main/resources находится прямо там, чтобы приложение могло его прочитать.

Теперь предположим, что мы используем подключаемый модуль Maven JAR для упаковки нашего кода в виде JAR.

Когда мы запускаем его в командной строке:

Мы увидим следующую ошибку:

Exception in thread "main" java.io.FileNotFoundException:  src/main/resources/input.txt (No such file or directory)  at java.io.FileInputStream.open0(Native Method)  at java.io.FileInputStream.open(FileInputStream.java:195)  at java.io.FileInputStream.(FileInputStream.java:138)  at java.io.FileInputStream.(FileInputStream.java:93)  at java.io.FileReader.(FileReader.java:58)  at com.foreach.resource.MyResourceLoader.loadResourceWithReader(MyResourceLoader.java:14)  at com.foreach.resource.MyResourceLoader.main(MyResourceLoader.java:37) 

3. Исходный код против скомпилированного кода​

Когда мы создаем JAR, ресурсы помещаются в корневой каталог упакованных артефактов.

В нашем примере мы видим, что установка исходного кода имеет input.txt в src/main/resources в нашем каталоге исходного кода.

Однако в соответствующей структуре JAR мы видим:

META-INF/MANIFEST.MF META-INF/ com/ com/foreach/ com/foreach/resource/ META-INF/maven/ META-INF/maven/com.foreach/ META-INF/maven/com.foreach/core-java-io-files/ input.txt com/foreach/resource/MyResourceLoader.class META-INF/maven/com.foreach/core-java-io-files/pom.xml META-INF/maven/com.foreach/core-java-io-files/pom.properties 

Здесь input.txt находится в корневом каталоге JAR. Итак, когда код выполнится, мы увидим FileNotFoundException .

Даже если бы мы изменили путь на /input.txt , исходный код не смог бы загрузить этот файл, поскольку ресурсы обычно не адресуются как файлы на диске. Файлы ресурсов упакованы внутри JAR, поэтому нам нужен другой способ доступа к ним.

4. Ресурсы​

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

 try (InputStream inputStream = getClass().getResourceAsStream("/input.txt");   BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)))    String contents = reader.lines()   .collect(Collectors.joining(System.lineSeparator()));   > 

ClassLoader.getResourceAsStream() просматривает путь к классам для данного ресурса. Начальная косая черта на входе для getResourceAsStream() указывает загрузчику читать из базы пути к классам. Содержимое нашего JAR-файла находится в пути к классам , поэтому этот метод работает.

IDE обычно включает src/main/resources в свой путь к классам и, таким образом, находит файлы.

5. Вывод​

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

Как всегда, код примера доступен на GitHub .

Источник

How to Fix the FileNotFoundException in Java.io

How to Fix the FileNotFoundException in Java.io

The java.io.FileNotFoundException is a checked exception in Java that occurs when an attempt to open a file denoted by a specified pathname fails. This exception is thrown by the FileInputStream , FileOutputStream , and RandomAccessFile constructors when a file with the specified pathname either does not exist or is inaccessible.

Since FileNotFoundException is a checked exception, it must be explicitly handled in methods which can throw this exception — either by using a try-catch block or by throwing it using the throws clause.

What Causes FileNotFoundException

There are two main scenarios when the FileNotFoundException occurs:

  • If a file with the specified pathname does not exist.
  • If a file with the specified pathname is inaccessible, for example, if the file is read-only and is attempted to be opened for writing.

FileNotFoundException Example

Here’s an example of a FileNotFoundException thrown when trying to access a file that does not exist in the system:

public class FileNotFoundExceptionExample < public static void main(String args[]) < BufferedReader br = null; try < br = new BufferedReader(new FileReader("myfile.txt")); String data = null; while ((data = br.readLine()) != null) < System.out.println(data); >> catch (IOException ioe) < ioe.printStackTrace(); >finally < try < if (br != null) < br.close(); >> catch (IOException ioe) < ioe.printStackTrace(); >> > >

In the above example, a file with the name myfile.txt is attempted to be accessed. However, since no such file exists in the system, a FileNotFoundException is thrown:

java.io.FileNotFoundException: myfile.txt (No such file or directory) at java.base/java.io.FileInputStream.open0(Native Method) at java.base/java.io.FileInputStream.open(FileInputStream.java:212) at java.base/java.io.FileInputStream.(FileInputStream.java:154) at java.base/java.io.FileInputStream.(FileInputStream.java:109) at java.base/java.io.FileReader.(FileReader.java:60) at FileNotFoundExceptionExample.main(FileNotFoundExceptionExample.java:10)

How to Fix FileNotFoundException

Since FileNotFoundException is a checked exception, a try-catch block should be used to handle it. The try block should contain the lines of code that can throw the exception and the catch block should catch and handle the exception appropriately.

Some ways to fix the exception are:

  • If the message of the exception indicates that no such file or directory exists, the file pathname should be checked again to ensure it is correct and if the file exists at the specified location.
  • If the message indicates that access is denied, the permissions of the file should be verified and whether the file is in use by another program.
  • If the message indicates that the specified file is a directory, the name of the file should be changed or the existing directory should be deleted if not in use.

Track, Analyze and Manage Errors With Rollbar

Managing errors and exceptions in your code is challenging. It can make deploying production code an unnerving experience. Being able to track, analyze, and manage errors in real-time can help you to proceed with more confidence. Rollbar automates error monitoring and triaging, making fixing Java errors easier than ever. Sign Up Today!

Источник

Оцените статью