Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ganesh_JavaSE7_Programming_1z0-804_study_guide.pdf
Скачиваний:
94
Добавлен:
02.02.2015
Размер:
5.88 Mб
Скачать

chapter 9 Java File i/O (NiO.2)

even if two Path objects point to the same file/directory, it is not guaranteed that you will get true from the equals() method. You need to make sure that both are absolute and normalized paths for an equality comparison to succeed for paths.

Using the Files Class

The previous section discussed how to create a Path instance and extract useful information from it. Now you will use Path objects to manipulate files/directories. Java 7 offers a new Files class (in the java.nio.file package) that you can use to perform various file-related operations on files or directories. Note that Files is a utility class, meaning that it is a final class with a private constructor and consists only of static methods. So you can make use of the Files class by calling the static methods it provides, such as copy() to copy files. This class provides a wide range of functionality. With this class you can create directories, files, or symbolic links; create streams such as directory streams, byte channels, or input/output streams; examine the attributes of the files; walk the file tree; or perform file operations such as read, write, copy, or delete. Table 9-2 provides a sample of the important methods in the Files class.

Table 9-2. Some Methods Related to File Attributes in the Files Class

Method

Description

Path createDirectory(Path dirPath, FileAttribute<?>. . . dirAttrs)

Path createDirectories(Path dir, FileAttribute<?>. . . attrs)

Creates a file given by the dirPath, and sets the attributes given by dirAttributes. May throw exceptions such as FileAlreadyExistsException or UnsupportedOperationException (e.g., when the file attributes cannot be set as given by dirAttrs). The difference between createDirectory and

createDirectories is that createDirectories creates intermediate directories given by dirPath if they are not already present.

Path createTempFile(Path dir, String prefix, String suffix, FileAttribute<?>. . . attrs)

Path createTempDirectory(Path dir,

String prefix, FileAttribute<?>. . . attrs)

Path copy(Path source, Path target, CopyOption. . . options)

Path move(Path source, Path target, CopyOption. . . options)

boolean isSameFile(Path path, Path path2)

Creates a temporary file with given prefix, suffix, and attributes in the directory given by dir.

Creates a temporary directory with the given prefix, directory attributes in the path specified by dir.

Copy the file from source to target. CopyOption could be REPLACE_EXISTING, COPY_ATTRIBUTES, or NOFOLLOW_LINKS. Can throw exceptions such as

FileAlreadyExistsException.

Similar to the copy operation except that the source file is removed; if the source and target are in the same directory, it is a file rename operation.

Checks if the two Path objects are located the same file or not.

boolean exists(Path path,

Checks if a file/directory exists in the given path; can

LinkOption. . . options)

specify LinkOption.NOFOLLOW_LINKS to not to follow

 

symbolic links.

 

 

 

(continued)

258

 

chapter 9 Java File I/O (NIO.2)

Table 9-2.(continued)

 

 

 

Method

Description

Boolean isRegularFile(Path path,

Returns true if the file represented by path is a

LinkOption. . .)

regular file.

Boolean isSymbolicLink(Path path)

Returns true if the file presented by path is a

 

symbolic link.

Boolean isHidden(Path path)

Return true if the file represented by path is a

 

hidden file.

long size(Path path)

UserPrincipal getOwner(Path path, LinkOption. . .), Path setOwner(Path path, UserPrincipal owner)

FileTime getLastModifiedTime(Path path, LinkOption. . .), Path setLastModifiedTime(Path path, FileTime time)

Returns the size of the file in bytes represented by path.

Gets/sets the owner of the file.

Gets/sets the last modified time for the specified time.

Object

getAttribute(Path

path, String attribute,

Gets/sets the specified attribute of the specified file.

LinkOption. . .), Path setAttribute(Path path,

 

String

attribute, Object

value, LinkOption. . .)

 

 

 

 

 

Checking File Properties and Metadata

In the last section on the Path interface, you tried to figure out whether two paths are pointing to the same file or not (see Listing 9-3). There is another way to find out the same thing. You can use the isSameFile() method from the Files class. Listing 9-4 shows how to do it.

Listing 9-4.  PathCompare2.java

import java.io.IOException; import java.nio.file.*;

// illustrates how to use File class to compare two paths class PathCompare2 {

public static void main(String[] args) throws IOException { Path path1 = Paths.get("Test");

Path path2 = Paths.get("D:\\OCPJP7\\programs\\NIO2\\Test");

System.out.println("Files.isSameFile(path1, path2) is: " + Files.isSameFile(path1, path2));

}

}

The program prints the following:

Files.isSameFile(path1, path2) is: true

In this case, you create the Test directory in the path D:\OCPJP7\programs\NIO2\ and it worked fine. However, if the Test file/directory does not exist in the given path, you’ll get a NoSuchFileException. But how

can you figure out if a file/directory exists in the given path? The Files class offers the exists() method to do that.

259

chapter 9 Java File I/O (NIO.2)

In fact, you can distinguish between a file and a directory using another method called isDirectory() from the Files class. Listing 9-5 uses these methods.

Listing 9-5.  PathExists.java

import java.nio.file.*;

class PathExists {

public static void main(String[] args) { Path path = Paths.get(args[0]);

if(Files.exists(path, LinkOption.NOFOLLOW_LINKS)) {

System.out.println("The file/directory " + path.getFileName() + " exists"); // check whether it is a file or a directory

if(Files.isDirectory(path, LinkOption.NOFOLLOW_LINKS)) { System.out.println(path.getFileName() + " is a directory");

}

else {

System.out.println(path.getFileName() + " is a file");

}

}

else {

System.out.println("The file/directory " + path.getFileName() + " does not exist");

}

}

}

In this program, you are accepting a file/directory name from the command line and creating a Path object. Then, you are using the exists() method from the Files class to find out whether the file/directory exists or not. The second parameter of the exists() method is link-option, which is used to specify whether you want to follow symbolic links or not; in this case, you are not following symbolic links. If the file/directory associated with the input path exists, then you are checking whether the input path is indicating a file or a directory using the isDirectory() method of the Files class.

We ran this program with two different command line arguments and we got the following output:

D:\OCPJP7\programs\NIO2\src>java PathExists PathExists.java The file/directory PathExists.java exists

PathExists.java is a file

D:\OCPJP7\programs\NIO2\src>java PathExists D:\OCPJP7\ The file/directory OCPJP7 exists

OCPJP7 is a directory

D:\OCPJP7\programs\NIO2\src>java PathExists D:\ The file/directory null exists

null is a directory

In these outputs, you may have noticed the behavior when the root name (drive name in Windows in this case) is given as an argument. A root name is a directory, but path.getFileName() returns null if the path is a root name, hence the output.

260

chapter 9 Java File I/O (NIO.2)

Existing files might not allow you to read, write, or execute based on your credentials. You can check the ability of a program to read, write, or execute programmatically. The Files class provides the methods isReadable(), isWriteable(), and isExecutable() to do that. Listing 9-6 uses these methods in a small example.

Listing 9-6.  FilePermissions.java

import java.nio.file.*;

class FilePermissions {

public static void main(String[] args) { Path path = Paths.get(args[0]);

System.out.printf( "Readable: %b, Writable: %b, Executable: %b ", Files.isReadable(path), Files.isWritable(path), Files.isExecutable(path));

}

}

Let’s execute this program with two different inputs; here is the output:

D:\OCPJP7\programs\NIO2\src>java FilePermissions readonly.txt Readable: true, Writable: false, Executable: true D:\OCPJP7\programs\NIO2\src>java FilePermissions FilePermissions.java Readable: true, Writable: true, Executable: true

For the readonly.txt file, the permissions are readable, and executable, but not writable. The file FilePermissions.java itself has all the three permissions: readable, writable, and executable.

There are many other methods that can be used to fetch file properties. Let’s use the getAttribute() method to get some attributes of a file. The method takes variable number of parameters: first, a Path object; second, an attribute name; and subsequently, the link options (see Listing 9-7).

Listing 9-7.  FileAttributes.java

import java.io.IOException; import java.nio.file.*;

class FileAttributes {

public static void main(String[] args) { Path path = Paths.get(args[0]); try {

Object object = Files.getAttribute(path, "creationTime", LinkOption.NOFOLLOW_LINKS);

System.out.println("Creation time: " + object);

object = Files.getAttribute(path, "lastModifiedTime", LinkOption.NOFOLLOW_LINKS);

System.out.println("Last modified time: " + object);

object = Files.getAttribute(path, "size", LinkOption.NOFOLLOW_LINKS); System.out.println("Size: " + object);

object = Files.getAttribute(path, "dos:hidden", LinkOption.NOFOLLOW_LINKS); System.out.println("isHidden: " + object);

261

chapter 9 Java File I/O (NIO.2)

object = Files.getAttribute(path, "isDirectory", LinkOption.NOFOLLOW_LINKS); System.out.println("isDirectory: " + object);

} catch (IOException e) { e.printStackTrace();

}

}

}

Let’s first execute this program by giving the name of this program itself and then look at what happens:

D:\> java FileAttributes FileAttributes.java Creation time: 2012-10-06T10:20:10.34375Z

Last modified time: 2012-10-06T10:21:54.859375Z Size: 914

isHidden: false isDirectory: false

The tricky part of the example is the second parameter of the getAttribute() method. You need to provide a correct attribute name to extract the associated value. The expected string should be specified in view:attribute format, where view is the type of FileAttributeView and attribute is the name of the attribute supported by view. If no view is specified, the view is assumed as basic. In this case, you specified all attributes belonging to a basic view except one attribute from dos view. If you do not specify the correct view name,

you will get an UnsupportedOperationException, and if you mess up with the attribute name, you will get an

IllegalArgumentException.

For example, if you type sized instead of size, you’ll get this exception:

Exception in thread “main” java.lang.IllegalArgumentException: ‘sized’ not recognized [ . . . stack trace elided . . . ]

Well, you now know how to read metadata associated with files using the getAttribute() method. However, if you want to read many attributes in one shot, then calling the getAttribute() method for each attribute might not be a good idea (from a performance standpoint). In this case, Java 7 offers a solution: an API— readAttributes()—to read the attributes in one shot. The API comes in two flavors:

Map<String,Object> readAttributes(Path path, String attributes, LinkOption. . . options)

<A extends BasicFileAttributes> A readAttributes(Path path, Class<A> type, LinkOption. . . options)

The first method returns a Map of attribute value pairs and takes variable length parameters. The attributes parameter is the key parameter where you need to specify what you want to retrieve. This parameter is similar to what you used in the getAttribute() method; however, here you can specify a list of attributes you want, and you can also use '*' to specify all attributes. For instance, using "*" means all attributes of the default FileAttributeView, such as BasicFileAttributes (specified as basic-file-attributes). Another example is: dos:*, which refers to all attributes of dos file attributes.

The second method uses generics syntax (Chapter 6). The second parameter here takes a class from the BasicFileAttributes hierarchy. We’ll talk about the hierarchy shortly. The method returns an instance from the

BasicFileAttributes hierarchy.

The file attributes hierarchy is shown in Figure 9-1. The BasicFileAttributes is the base interface from which DosFileAttributes and PosixFileAttributes are derived. Note that these attribute interfaces are provided in the java.nio.file.attribute package.

262

chapter 9 Java File I/O (NIO.2)

BasicFileAttributes

 

 

 

 

 

 

 

 

 

 

 

 

DosFileAttributes

 

 

PosixFileAttributes

 

 

 

 

 

 

Figure 9-1.  The hierarchy of BasicFileAttributes

As you can observe, the BasicFileAttributes interface defines the basic attributes supported by all common platforms. However, specific platforms define their own file attributes, which are captured by DosFileAttributes and PosixFileAttributes. You can specify any one of these interfaces to retrieve associated file attributes. Listing 9-8 contains a program to retrieve all attributes of a file using BasicFileAttributes.

Listing 9-8.  FileAttributes2.java

import java.io.IOException; import java.nio.file.*;

import java.nio.file.attribute.*;

class FileAttributes2 {

public static void main(String[] args) { Path path = Paths.get(args[0]); try {

BasicFileAttributes fileAttributes = Files.readAttributes(path, BasicFileAttributes.class);

System.out.println("File size: " + fileAttributes.size()); System.out.println("isDirectory: " + fileAttributes.isDirectory()); System.out.println("isRegularFile: " + fileAttributes.isRegularFile()); System.out.println("isSymbolicLink: " + fileAttributes.isSymbolicLink()); System.out.println("File last accessed time: " +

fileAttributes.lastAccessTime());

System.out.println("File last modified time: " + fileAttributes.lastModifiedTime());

System.out.println("File creation time: " + fileAttributes.creationTime()); } catch (IOException e) {

e.printStackTrace();

}

}

}

The following is a sample output of the program:

D:\>java FileAttributes2 FileAttributes2.java File size: 904

isDirectory: false isRegularFile: true isSymbolicLink: false

File last accessed time: 2012-10-06T10:28:29.0625Z File last modified time: 2012-10-06T10:28:22.4375Z File creation time: 2012-10-06T10:26:39.1875Z

263

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]