Where to Put Files to Read in Java

This page discusses the details of reading, writing, creating, and opening files. In that location are a broad assortment of file I/O methods to choose from. To assistance make sense of the API, the following diagram arranges the file I/O methods by complexity.

Line drawing with file I/O methods arranged from least complex (on the left) to most complex (on the right).
File I/O Methods Arranged from Less Circuitous to More Circuitous

On the far left of the diagram are the utility methods readAllBytes, readAllLines, and the write methods, designed for unproblematic, mutual cases. To the right of those are the methods used to iterate over a stream or lines of text, such every bit newBufferedReader, newBufferedWriter, then newInputStream and newOutputStream. These methods are interoperable with the coffee.io package. To the right of those are the methods for dealing with ByteChannels, SeekableByteChannels, and ByteBuffers, such as the newByteChannel method. Finally, on the far right are the methods that use FileChannel for advanced applications needing file locking or retentiveness-mapped I/O.


Note: The methods for creating a new file enable you to specify an optional prepare of initial attributes for the file. For example, on a file system that supports the POSIX set of standards (such as UNIX), y'all can specify a file possessor, group owner, or file permissions at the fourth dimension the file is created. The Managing Metadata page explains file attributes, and how to access and prepare them.


This page has the following topics:

  • The OpenOptions Parameter
  • Usually Used Methods for Small Files
  • Buffered I/O Methods for Text Files
  • Methods for Unbuffered Streams and Interoperable with java.io APIs
  • Methods for Channels and ByteBuffers
  • Methods for Creating Regular and Temporary Files

The OpenOptions Parameter

Several of the methods in this section accept an optional OpenOptions parameter. This parameter is optional and the API tells you what the default beliefs is for the method when none is specified.

The following StandardOpenOptions enums are supported:

  • WRITE – Opens the file for write access.
  • APPEND – Appends the new data to the finish of the file. This option is used with the WRITE or CREATE options.
  • TRUNCATE_EXISTING – Truncates the file to zero bytes. This pick is used with the WRITE pick.
  • CREATE_NEW – Creates a new file and throws an exception if the file already exists.
  • CREATE – Opens the file if it exists or creates a new file if information technology does not.
  • DELETE_ON_CLOSE – Deletes the file when the stream is airtight. This option is useful for temporary files.
  • SPARSE – Hints that a newly created file will be thin. This advanced selection is honored on some file systems, such as NTFS, where large files with data "gaps" can be stored in a more efficient manner where those empty gaps do not consume disk space.
  • SYNC – Keeps the file (both content and metadata) synchronized with the underlying storage device.
  • DSYNC – Keeps the file content synchronized with the underlying storage device.

Unremarkably Used Methods for Small Files

Reading All Bytes or Lines from a File

If yous have a small-ish file and y'all would like to read its entire contents in one pass, you can utilize the readAllBytes(Path) or readAllLines(Path, Charset) method. These methods take care of about of the work for you, such as opening and endmost the stream, but are not intended for handling large files. The post-obit code shows how to employ the readAllBytes method:

Path file = ...; byte[] fileArray; fileArray = Files.readAllBytes(file);          

Writing All Bytes or Lines to a File

You tin can use i of the write methods to write bytes, or lines, to a file.

  • write(Path, byte[], OpenOption...)
  • write(Path, Iterable< extends CharSequence>, Charset, OpenOption...)

The following code snippet shows how to use a write method.

Path file = ...; byte[] buf = ...; Files.write(file, buf);          

Buffered I/O Methods for Text Files

The java.nio.file package supports aqueduct I/O, which moves data in buffers, bypassing some of the layers that tin clogging stream I/O.

Reading a File by Using Buffered Stream I/O

The newBufferedReader(Path, Charset) method opens a file for reading, returning a BufferedReader that can be used to read text from a file in an efficient manner.

The following code snippet shows how to use the newBufferedReader method to read from a file. The file is encoded in "US-ASCII."

Charset charset = Charset.forName("US-ASCII"); try (BufferedReader reader = Files.newBufferedReader(file, charset)) {     String line = null;     while ((line = reader.readLine()) != nothing) {         System.out.println(line);     } } grab (IOException ten) {     System.err.format("IOException: %s%northward", x); }          

Writing a File by Using Buffered Stream I/O

You can use the newBufferedWriter(Path, Charset, OpenOption...) method to write to a file using a BufferedWriter.

The post-obit code snippet shows how to create a file encoded in "United states-ASCII" using this method:

Charset charset = Charset.forName("U.s.a.-ASCII"); String due south = ...; endeavor (BufferedWriter author = Files.newBufferedWriter(file, charset)) {     writer.write(s, 0, southward.length()); } take hold of (IOException 10) {     System.err.format("IOException: %southward%n", x); }          

Methods for Unbuffered Streams and Interoperable with coffee.io APIs

Reading a File by Using Stream I/O

To open up a file for reading, you can use the newInputStream(Path, OpenOption...) method. This method returns an unbuffered input stream for reading bytes from the file.

Path file = ...; endeavor (InputStream in = Files.newInputStream(file);     BufferedReader reader =       new BufferedReader(new InputStreamReader(in))) {     String line = naught;     while ((line = reader.readLine()) != aught) {         System.out.println(line);     } } catch (IOException x) {     System.err.println(x); }          

Creating and Writing a File by Using Stream I/O

Y'all tin can create a file, append to a file, or write to a file by using the newOutputStream(Path, OpenOption...) method. This method opens or creates a file for writing bytes and returns an unbuffered output stream.

The method takes an optional OpenOption parameter. If no open up options are specified, and the file does non exist, a new file is created. If the file exists, it is truncated. This pick is equivalent to invoking the method with the CREATE and TRUNCATE_EXISTING options.

The following example opens a log file. If the file does non exist, it is created. If the file exists, it is opened for appending.

import static java.nio.file.StandardOpenOption.*; import java.nio.file.*; import java.io.*;  public class LogFileTest {    public static void main(String[] args) {      // Convert the cord to a     // byte assortment.     Cord south = "Hello Globe! ";     byte data[] = due south.getBytes();     Path p = Paths.get("./logfile.txt");      endeavour (OutputStream out = new BufferedOutputStream(       Files.newOutputStream(p, CREATE, Suspend))) {       out.write(information, 0, data.length);     } catch (IOException x) {       Organization.err.println(10);     }   } }          

Methods for Channels and ByteBuffers

Reading and Writing Files by Using Channel I/O

While stream I/O reads a character at a time, channel I/O reads a buffer at a time. The ByteChannel interface provides bones read and write functionality. A SeekableByteChannel is a ByteChannel that has the capability to maintain a position in the aqueduct and to change that position. A SeekableByteChannel also supports truncating the file associated with the channel and querying the file for its size.

The adequacy to move to different points in the file and so read from or write to that location makes random admission of a file possible. See Random Admission Files for more data.

There are two methods for reading and writing aqueduct I/O.

  • newByteChannel(Path, OpenOption...)
  • newByteChannel(Path, Prepare<? extends OpenOption>, FileAttribute<?>...)

Note: The newByteChannel methods return an instance of a SeekableByteChannel. With a default file organization, you can cast this seekable byte channel to a FileChannel providing access to more than advanced features such mapping a region of the file directly into memory for faster admission, locking a region of the file so other processes cannot access it, or reading and writing bytes from an absolute position without affecting the aqueduct'south current position.


Both newByteChannel methods enable yous to specify a list of OpenOption options. The aforementioned open options used by the newOutputStream methods are supported, in addition to one more than option: READ is required because the SeekableByteChannel supports both reading and writing.

Specifying READ opens the channel for reading. Specifying WRITE or APPEND opens the channel for writing. If none of these options are specified, and so the aqueduct is opened for reading.

The following code snippet reads a file and prints it to standard output:

public static void readFile(Path path) throws IOException {      // Files.newByteChannel() defaults to StandardOpenOption.READ     endeavour (SeekableByteChannel sbc = Files.newByteChannel(path)) {         final int BUFFER_CAPACITY = 10;         ByteBuffer buf = ByteBuffer.classify(BUFFER_CAPACITY);          // Read the bytes with the proper encoding for this platform. If         // yous skip this pace, you might see foreign or illegible         // characters.         Cord encoding = Arrangement.getProperty("file.encoding");         while (sbc.read(buf) > 0) {             buf.flip();             System.out.impress(Charset.forName(encoding).decode(buf));             buf.clear();         }     }     }          

The following instance, written for UNIX and other POSIX file systems, creates a log file with a specific prepare of file permissions. This lawmaking creates a log file or appends to the log file if it already exists. The log file is created with read/write permissions for owner and read only permissions for group.

import static java.nio.file.StandardOpenOption.*; import coffee.nio.*; import java.nio.channels.*; import java.nio.file.*; import coffee.nio.file.attribute.*; import java.io.*; import java.util.*;  public class LogFilePermissionsTest {    public static void main(String[] args) {        // Create the ready of options for appending to the file.     Prepare<OpenOption> options = new HashSet<OpenOption>();     options.add(Append);     options.add(CREATE);      // Create the custom permissions attribute.     Fix<PosixFilePermission> perms =       PosixFilePermissions.fromString("rw-r-----");     FileAttribute<Prepare<PosixFilePermission>> attr =       PosixFilePermissions.asFileAttribute(perms);      // Convert the string to a ByteBuffer.     String s = "Hello World! ";     byte data[] = s.getBytes();     ByteBuffer bb = ByteBuffer.wrap(data);          Path file = Paths.go("./permissions.log");      try (SeekableByteChannel sbc =       Files.newByteChannel(file, options, attr)) {       sbc.write(bb);     } catch (IOException x) {       System.out.println("Exception thrown: " + x);     }   } }          

Methods for Creating Regular and Temporary Files

Creating Files

You tin create an empty file with an initial gear up of attributes by using the createFile(Path, FileAttribute<?>) method. For instance, if, at the time of creation, you want a file to have a particular set of file permissions, use the createFile method to exercise so. If you lot do not specify any attributes, the file is created with default attributes. If the file already exists, createFile throws an exception.

In a single diminutive operation, the createFile method checks for the existence of the file and creates that file with the specified attributes, which makes the process more than secure against malicious code.

The post-obit lawmaking snippet creates a file with default attributes:

Path file = ...; try {     // Create the empty file with default permissions, etc.     Files.createFile(file); } take hold of (FileAlreadyExistsException x) {     System.err.format("file named %s" +         " already exists%n", file); } catch (IOException ten) {     // Some other sort of failure, such as permissions.     System.err.format("createFile error: %s%n", x); }          

POSIX File Permissions has an instance that uses createFile(Path, FileAttribute<?>) to create a file with pre-set permissions.

You can also create a new file by using the newOutputStream methods, equally described in Creating and Writing a File using Stream I/O. If you open a new output stream and close it immediately, an empty file is created.

Creating Temporary Files

You tin can create a temporary file using ane of the following createTempFile methods:

  • createTempFile(Path, String, String, FileAttribute<?>)
  • createTempFile(String, String, FileAttribute<?>)

The start method allows the code to specify a directory for the temporary file and the second method creates a new file in the default temporary-file directory. Both methods allow y'all to specify a suffix for the filename and the first method allows you to also specify a prefix. The following lawmaking snippet gives an example of the second method:

try {     Path tempFile = Files.createTempFile(null, ".myapp");     System.out.format("The temporary file" +         " has been created: %s%n", tempFile) ; } grab (IOException x) {     System.err.format("IOException: %southward%due north", ten); }          

The result of running this file would be something like the following:

The temporary file has been created: /tmp/509668702974537184.myapp          

The specific format of the temporary file proper noun is platform specific.

friersonpicketwor.blogspot.com

Source: https://docs.oracle.com/javase/tutorial/essential/io/file.html

0 Response to "Where to Put Files to Read in Java"

Post a Comment

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel