How to Read in From a File in Java and Print Results on Another
This page discusses the details of reading, writing, creating, and opening files. In that location are a wide array of file I/O methods to choose from. To help brand sense of the API, the post-obit diagram arranges the file I/O methods by complexity.
On the far left of the diagram are the utility methods readAllBytes, readAllLines, and the write methods, designed for simple, common cases. To the right of those are the methods used to iterate over a stream or lines of text, such as newBufferedReader, newBufferedWriter, then newInputStream and newOutputStream. These methods are interoperable with the java.io bundle. To the right of those are the methods for dealing with ByteChannels, SeekableByteChannels, and ByteBuffers, such every bit the newByteChannel method. Finally, on the far right are the methods that use FileChannel for advanced applications needing file locking or memory-mapped I/O.
Note: The methods for creating a new file enable you to specify an optional set of initial attributes for the file. For example, on a file system that supports the POSIX set up of standards (such as UNIX), you can specify a file owner, group possessor, or file permissions at the time the file is created. The Managing Metadata folio explains file attributes, and how to access and set them.
This page has the following topics:
- The
OpenOptionsParameter - Commonly Used Methods for Small-scale Files
- Buffered I/O Methods for Text Files
- Methods for Unbuffered Streams and Interoperable with
java.ioAPIs - Methods for Channels and
ByteBuffers - Methods for Creating Regular and Temporary Files
The OpenOptions Parameter
Several of the methods in this section take an optional OpenOptions parameter. This parameter is optional and the API tells you what the default behavior 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 end of the file. This option is used with theWRITEorCREATEoptions. -
TRUNCATE_EXISTING– Truncates the file to naught bytes. This choice is used with theWRITEoption. -
CREATE_NEW– Creates a new file and throws an exception if the file already exists. -
CREATE– Opens the file if information technology exists or creates a new file if information technology does not. -
DELETE_ON_CLOSE– Deletes the file when the stream is closed. This option is useful for temporary files. -
SPARSE– Hints that a newly created file will be thin. This advanced option is honored on some file systems, such as NTFS, where large files with data "gaps" tin be stored in a more than efficient mode 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 you have a pocket-size-ish file and yous would like to read its entire contents in i pass, yous can use the readAllBytes(Path) or readAllLines(Path, Charset) method. These methods accept care of nigh of the piece of work for you, such every bit opening and endmost the stream, but are non intended for handling large files. The following code shows how to utilize the readAllBytes method:
Path file = ...; byte[] fileArray; fileArray = Files.readAllBytes(file);
Writing All Bytes or Lines to a File
Yous can use one 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 utilize a write method.
Path file = ...; byte[] buf = ...; Files.write(file, buf);
Buffered I/O Methods for Text Files
The java.nio.file package supports channel I/O, which moves data in buffers, bypassing some of the layers that can bottleneck 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 "U.s.a.-ASCII."
Charset charset = Charset.forName("United states of america-ASCII"); try (BufferedReader reader = Files.newBufferedReader(file, charset)) { String line = nothing; while ((line = reader.readLine()) != null) { System.out.println(line); } } catch (IOException ten) { Organization.err.format("IOException: %southward%n", x); } Writing a File by Using Buffered Stream I/O
You can employ the newBufferedWriter(Path, Charset, OpenOption...) method to write to a file using a BufferedWriter.
The following code snippet shows how to create a file encoded in "United states of america-ASCII" using this method:
Charset charset = Charset.forName("US-ASCII"); Cord s = ...; attempt (BufferedWriter writer = Files.newBufferedWriter(file, charset)) { writer.write(south, 0, s.length()); } catch (IOException x) { System.err.format("IOException: %south%due north", 10); } Methods for Unbuffered Streams and Interoperable with java.io APIs
Reading a File by Using Stream I/O
To open a file for reading, yous tin use the newInputStream(Path, OpenOption...) method. This method returns an unbuffered input stream for reading bytes from the file.
Path file = ...; try (InputStream in = Files.newInputStream(file); BufferedReader reader = new BufferedReader(new InputStreamReader(in))) { String line = zip; while ((line = reader.readLine()) != zilch) { System.out.println(line); } } take hold of (IOException x) { System.err.println(x); } Creating and Writing a File by Using Stream I/O
You tin can create a file, append to a file, or write to a file past 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 not exist, a new file is created. If the file exists, it is truncated. This selection is equivalent to invoking the method with the CREATE and TRUNCATE_EXISTING options.
The post-obit example opens a log file. If the file does not exist, it is created. If the file exists, information technology is opened for appending.
import static java.nio.file.StandardOpenOption.*; import coffee.nio.file.*; import coffee.io.*; public class LogFileTest { public static void main(String[] args) { // Convert the string to a // byte array. String s = "How-do-you-do World! "; byte data[] = s.getBytes(); Path p = Paths.get("./logfile.txt"); effort (OutputStream out = new BufferedOutputStream( Files.newOutputStream(p, CREATE, APPEND))) { out.write(data, 0, information.length); } catch (IOException ten) { Arrangement.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 basic read and write functionality. A SeekableByteChannel is a ByteChannel that has the adequacy to maintain a position in the channel and to change that position. A SeekableByteChannel besides supports truncating the file associated with the aqueduct and querying the file for its size.
The capability to motion to dissimilar points in the file and so read from or write to that location makes random access of a file possible. See Random Access Files for more data.
There are two methods for reading and writing channel I/O.
-
newByteChannel(Path, OpenOption...) -
newByteChannel(Path, Fix<? extends OpenOption>, FileAttribute<?>...)
Note: The newByteChannel methods return an instance of a SeekableByteChannel. With a default file system, you can cast this seekable byte channel to a FileChannel providing access to more advanced features such mapping a region of the file directly into memory for faster access, locking a region of the file so other processes cannot access it, or reading and writing bytes from an absolute position without affecting the channel's current position.
Both newByteChannel methods enable you to specify a list of OpenOption options. The aforementioned open options used past the newOutputStream methods are supported, in add-on to one more selection: 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, then the channel is opened for reading.
The following code snippet reads a file and prints information technology to standard output:
public static void readFile(Path path) throws IOException { // Files.newByteChannel() defaults to StandardOpenOption.READ try (SeekableByteChannel sbc = Files.newByteChannel(path)) { final int BUFFER_CAPACITY = 10; ByteBuffer buf = ByteBuffer.allocate(BUFFER_CAPACITY); // Read the bytes with the proper encoding for this platform. If // you lot skip this pace, you might meet strange or illegible // characters. Cord encoding = System.getProperty("file.encoding"); while (sbc.read(buf) > 0) { buf.flip(); System.out.impress(Charset.forName(encoding).decode(buf)); buf.clear(); } } } The following example, written for UNIX and other POSIX file systems, creates a log file with a specific set of file permissions. This code creates a log file or appends to the log file if it already exists. The log file is created with read/write permissions for possessor and read merely permissions for grouping.
import static coffee.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(Cord[] args) { // Create the set of options for appending to the file. Set<OpenOption> options = new HashSet<OpenOption>(); options.add(APPEND); options.add(CREATE); // Create the custom permissions attribute. Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rw-r-----"); FileAttribute<Fix<PosixFilePermission>> attr = PosixFilePermissions.asFileAttribute(perms); // Convert the string to a ByteBuffer. Cord s = "Hello Earth! "; byte information[] = s.getBytes(); ByteBuffer bb = ByteBuffer.wrap(data); Path file = Paths.get("./permissions.log"); effort (SeekableByteChannel sbc = Files.newByteChannel(file, options, attr)) { sbc.write(bb); } take hold of (IOException x) { Organisation.out.println("Exception thrown: " + ten); } } } Methods for Creating Regular and Temporary Files
Creating Files
You can create an empty file with an initial set of attributes by using the createFile(Path, FileAttribute<?>) method. For case, if, at the time of creation, you want a file to have a particular fix of file permissions, utilise the createFile method to exercise and so. If yous 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 functioning, the createFile method checks for the being of the file and creates that file with the specified attributes, which makes the procedure more secure against malicious lawmaking.
The following lawmaking snippet creates a file with default attributes:
Path file = ...; endeavor { // Create the empty file with default permissions, etc. Files.createFile(file); } grab (FileAlreadyExistsException 10) { System.err.format("file named %s" + " already exists%northward", file); } catch (IOException x) { // Another sort of failure, such as permissions. System.err.format("createFile error: %s%n", x); } POSIX File Permissions has an example that uses createFile(Path, FileAttribute<?>) to create a file with pre-set permissions.
You tin can besides create a new file by using the newOutputStream methods, as described in Creating and Writing a File using Stream I/O. If you open up a new output stream and close information technology immediately, an empty file is created.
Creating Temporary Files
You tin create a temporary file using one of the following createTempFile methods:
-
createTempFile(Path, String, String, FileAttribute<?>) -
createTempFile(Cord, Cord, FileAttribute<?>)
The first 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 yous to specify a suffix for the filename and the first method allows you lot to besides specify a prefix. The following code snippet gives an example of the 2nd method:
endeavor { Path tempFile = Files.createTempFile(cipher, ".myapp"); Organisation.out.format("The temporary file" + " has been created: %due south%n", tempFile) ; } catch (IOException x) { System.err.format("IOException: %s%northward", x); } The result of running this file would be something similar the following:
The temporary file has been created: /tmp/509668702974537184.myapp
The specific format of the temporary file proper noun is platform specific.
Source: https://docs.oracle.com/javase/tutorial/essential/io/file.html
0 Response to "How to Read in From a File in Java and Print Results on Another"
Post a Comment