EnderEgg
EnderEgg

Reputation: 335

How to read a file from a different folder than the project

I'm trying to read a txt file that is in a folder called "levels". The class where I'm using the Scanner is in src/anotherPackageName, if that's relevant. When I execute:

Scanner s = new Scanner(new File("levels/level0")); //adding .txt doesn't fix

it throws an exception. I don't want to use an absolute path, but rather relative to the project if possible. This is my folder structure:

D:\OneDrive\Folder\AnotherFolder\ProjectName

ProjectName
   src
       packageOne
           ClassWhereImUsingScanner
           OtherClasses
       (...)
   levels
       level0
       level1
       (...)

Upvotes: 0

Views: 1818

Answers (3)

Ricardo Ferreira
Ricardo Ferreira

Reputation: 59

Usually the path is relative to your execution, but it also depends on your project setup on eclipse, could you send more information about you directory structure?

Based on you structure try something like this:

Scanner s = new Scanner(new File("../levels/level0"));

Upvotes: 1

Daniel Pryden
Daniel Pryden

Reputation: 60957

Bear in mind that in most Java code, the end state of the project is not run from the IDE, but rather from some production system (e.g. an app or a server). In that case, your development source code structure won't be available.

There are two main ways to read text files or other resources in Java: either you can find the path to the actual file, in which case you need to deal with possibly not running out of your development source tree, or else you need to find a way to bundle the text file into your project.

Most Java projects end up getting compiled into some kind of archive, either a JAR file or a WAR file (for web applications) or something like an Android APK. In most cases you can add your own text files into the project archive. (For example, in a Maven project, if you just put your text file in the src/main/resources folder it should be included in the compiled JAR.)

However, in this case, the text file is no longer a separate file on disk, but rather a blob of data inside an archive. You could unzip the archive to get an actual File object, but that's wasteful if all you actually need is to read the bytes.

Thus, the most common way that text files like this are read is by using the existing ClassLoader mechanism, which is what is reading the .class files from disk (or from an archive, or over the network, or whatever). The ClassLoader already knows how to load bytes that are "alongside" your compiled code, so you can just make use of that.

In your case, you should be able to do something like this:

Scanner scanner = new Scanner(
    getClass().getResourceAsStream("/path/to/file.txt"));

In this case, the /path/to/file.txt path is relative to the path your class was loaded from. E.g. if your class is named my.package.Foo then the actual class bytes will be in a folder (either a filesystem folder or in a JAR file or something) named my/package/Foo.class -- in this case, the path/to/file.txt and my/package/Foo.class will be relative to the same root.

See the documentation on resources for more information.

Upvotes: 1

AKotro
AKotro

Reputation: 36

So in order to access a file you could do something like this:

FileReader sourceFile = new FileReader("levels/level0.txt");
BufferedReader inStream = new BufferedReader(sourceFile);
String Line = inStream.readLine();

Then, you can use a tokenizer depending on your data and how you want to store it.

You could see this example: http://www.mkyong.com/java/how-to-read-file-from-java-bufferedreader-example/

Upvotes: 2

Related Questions