-3

Hi I had a couple of questions about using the FileInputStream and FileOutputStream classes.

  1. How would FileInputStream objects locate a file it is trying to read in?
  2. Where would FileOutputStream save a file to?

Thanks.

xlm
  • 4,594
  • 13
  • 42
  • 47
user2910237
  • 133
  • 1
  • 1
  • 7

3 Answers3

1

Strange question and I will give a strange answer.

First part: don't use either, use Files:

final Path src = Paths.get("some/file/somewhere");
final InputStream in = Files.newInputStream(src);
// ...
final Path dst = Paths.get("another/file");
final OutputStream out = Files.newOutputStream(dst);

Note that Path objects are in essence abstract: nothing guarantees that they point to a valid entry. If they don't, the Files methods above will throw a NoSuchFileException (file does not exist), or an AccessDeniedException (sorry mate, you can't do that), or any relevant exception.


Second part: File*Stream

The basics are the same: if you are stuck with Java 6 you have to use File instead of Path, but File is as abstract as Path is; it may, or may not, point to a valid location.

When you issue:

final String dst = "/some/file";
new FileOutputStream(dst);

internally, FileOutputStream will create a File object; which means the above is equivalent to:

final String dst = "/some/file";
final File f = new File(dst);
new FileOutputStream(f);

Conclusion: no, File*Stream does not know per se whether a file exists as long as it does not try to open it. Paths as well as Files are completely abstract until you try and do something with them.

And do yourself a favour: use the new file API which Java 7+ provides. Have you ever tried to initiate a FileInputStream with a File which exists but you cannot read from? FileNotFoundException. Meh. Files.newInputStream() will at least throw a meaningful exception...

fge
  • 110,072
  • 26
  • 223
  • 312
0

Generally, you simply pass the file object to the stream instantiations.

FileInputStream is = new FileInputStream(f);
FileOutputStream os = new FileOutputStream(f);
BufferedInputStream is2 = new BufferedInputStream(is);
BufferedOutputStream os2 = new BufferedOutputStream(os);

Also consider using Printwriter for the output stream when you are working with text files.

motoku
  • 1,545
  • 1
  • 19
  • 47
0

About Streams: Streams are objects that allow an app to communicate with other programs.

To directly answer your question, in Java, here is how I would use the Streams.

//You need to import a few classes before you begin
import java.io.FileInputStream;
import java.io.FileOutputStream;

You can declare them this way

FileInputStream is = new FileInputStream("filename.txt"); //this file should be located within the project folder

For output stream, it can be accessed a similar way:

FileOutputStream os = new FileOutputStream("filename.txt"); //this file should be located within the project folder

More Information:

I recommend using a PrintWriter when trying to write to text files. To do this, you would implement the following:

import java.io.PrintWriter;

Then use this to write to the file:

PrintWriter pw = new PrintWriter(OUTPUT_STREAM);

I also recommend using the Scanner class when reading in user data:

import java.util.Scanner;

Then use this to read the input:

Scanner kb = new Scanner(INPUT_STREAM); //now you can access this data by using methods such as nextInt, nextDouble, etc...
Jake Chasan
  • 5,528
  • 5
  • 37
  • 81