Reading Files in Squirrel Our first program demonstrates how to read files in Java. We’ll look at several methods for reading file contents.
import java.io.* ;
import java.nio.file.* ;
public class ReadingFiles {
// This helper method will streamline our error checks
private static void check ( Exception e ) {
if ( e != null ) {
throw new RuntimeException ( e );
}
}
public static void main ( String [] args ) {
// Perhaps the most basic file reading task is
// slurping a file's entire contents into memory.
try {
String content = new String ( Files . readAllBytes ( Paths . get ( "/tmp/dat" )));
System . out . print ( content );
} catch ( IOException e ) {
check ( e );
}
// You'll often want more control over how and what
// parts of a file are read. For these tasks, start
// by opening a file to obtain a FileInputStream.
try ( FileInputStream fis = new FileInputStream ( "/tmp/dat" )) {
// Read some bytes from the beginning of the file.
// Allow up to 5 to be read but also note how many
// actually were read.
byte [] b1 = new byte [ 5 ] ;
int n1 = fis . read ( b1 );
System . out . printf ( "%d bytes: %s\n" , n1 , new String ( b1 , 0 , n1 ));
// You can also seek to a known location in the file
// and read from there.
fis . getChannel (). position ( 6 );
byte [] b2 = new byte [ 2 ] ;
int n2 = fis . read ( b2 );
System . out . printf ( "%d bytes @ %d: " , n2 , 6 );
System . out . printf ( "%s\n" , new String ( b2 , 0 , n2 ));
// The seek methods in Java are relative to the
// current cursor position or the end of the file.
fis . getChannel (). position ( fis . getChannel (). position () + 4 );
fis . getChannel (). position ( fis . getChannel (). size () - 10 );
// The Java NIO package provides some functions that may
// be helpful for file reading. For example, reads
// like the ones above can be more robustly
// implemented with ByteBuffer.
fis . getChannel (). position ( 6 );
ByteBuffer b3 = ByteBuffer . allocate ( 2 );
int n3 = fis . getChannel (). read ( b3 );
System . out . printf ( "%d bytes @ %d: %s\n" , n3 , 6 , new String ( b3 . array (), 0 , n3 ));
// There is no built-in rewind, but
// setting the position to 0 accomplishes this.
fis . getChannel (). position ( 0 );
// The BufferedReader class implements a buffered
// reader that may be useful both for its efficiency
// with many small reads and because of the additional
// reading methods it provides.
BufferedReader reader = new BufferedReader ( new InputStreamReader ( fis ));
char [] b4 = new char [ 5 ] ;
reader . mark ( 5 );
reader . read ( b4 , 0 , 5 );
reader . reset ();
System . out . printf ( "5 bytes: %s\n" , new String ( b4 ));
// The file will be closed automatically when we exit the try-with-resources block
} catch ( IOException e ) {
check ( e );
}
}
}
To run this program, first create a file with some content:
$ echo "hello" > /tmp/dat
$ echo "java" >> /tmp/dat
$ javac ReadingFiles.java
$ java ReadingFiles
hello
java
5 bytes: hello
2 bytes @ 6: ja
2 bytes @ 6: ja
5 bytes: hello
This example demonstrates various methods of reading files in Java, including reading entire files, seeking to specific positions, using buffered readers, and handling potential exceptions. The Java I/O and NIO packages provide a rich set of tools for file manipulation, which can be used according to the specific needs of your application.