1.1.3.2.10 获取文件信息 迄今为止我们的讨论围绕单一的文件输入输出。但是加速I/O性能还有另一方面--和得到文件特性有关。例如,考虑一个打印文件长度的小程序:
7 S" |4 n2 J( Y. A& z3 G+ ~ import java.io.*;
0 H! e" _. d% t9 y y public class length1 {$ R8 z2 _. R3 V7 ?' v
public static void main(String args[]) {
; J% T" U- n( b1 A& A2 G if (args.length != 1) {' Y8 g- Y# ~& Z. k1 \
System.err.println("missing filename");
/ a9 T0 d% `) R System.exit(1);! Y- V% B0 w t$ ]9 Y( y
}- X; q% p- [& G
File f = new File(args[0]);
" B6 U- _5 E, c4 u" s/ r long len = f.length();
7 x* J1 O2 b0 Y4 l- m) c' r System.out.println(len);
3 X1 I& c( S2 [3 {6 u6 J }
+ g2 U1 j) m+ e1 `% b$ A) u( M }
" b" e6 S" S4 y* x4 i Java运行时系统自身并不知道文件的长度,因此必须向底层的操作系统查询以获得这个信息,对于文件的其他信息这也成立,例如文件是否是一个目录,文件上次修改时间等等。 java.io包中的File 类提供一套查询这些信息的方法。这些方法总体来说在时间上开销很大因此应该尽可能少用。3 N( f0 G. A8 O
下面是一个查询文件信息的更长的范例,它递归整个文件系统写出所有的文件路径:
3 A3 s7 ?" _) \3 u% V3 {' L$ a" @/ | import java.io.*;/ o2 d+ }5 y$ v# F: ]6 D7 W, O; i
public class roots {
# V& H! U+ V( T Q' Y( B public static void visit(File f) {1 W8 `9 c+ ]+ R9 w
System.out.println(f);2 T R* c" ]$ K% e/ A d5 R
}1 O. x; k& @ _
public static void walk(File f) {
3 Q* J0 w L. q' ^. C visit(f);
) f# P& t0 i) A7 ] if (f.isDirectory()) {
# L( ~% w( }& @% V W String list[] = f.list();, H# C3 G" b5 t2 h: x' j0 K5 S' B
for (int i = 0; i < list.length; i++)
$ r( {- K7 v ]4 F9 j3 A- B; \0 k walk(new File(f, list));
7 g9 s. x( w' d1 C$ e }+ v) k5 F8 S' L
}1 O" f& y1 f9 W% D. Z
public static void main(String args[]) {) z2 K+ ]4 B8 v+ K
File list[] = File.listRoots();4 U+ V2 D1 |3 ^$ Y g
for (int i = 0; i < list.length; i++) {
8 U* h; T6 v4 ^' N9 l if (list.exists())
( W( {' B) b+ c# e' k walk(list);' d1 u8 {4 s) O3 j: X
else7 W' p( ^' c# F9 ]
System.err.println("not accessible: " + list);
6 S M9 k* _' c" u }
3 a- f8 Q+ V3 B# L }' n9 {9 |6 M* \+ i' A3 V8 N
}
; }% c8 n, Z1 A0 [" I 这个范例使用 File 方法,例如 isDirectory 和 exists,穿越目录结构。每个文件都被查询一次它的类型 (普通文件或者目录)。
, I c( x# n2 |; }0 f+ N 这个范例使用 File 方法,例如 isDirectory 和 exists,穿越目录结构。每个文件都被查询一次它的类型 (普通文件或者目录)。
# b+ c( o' m6 L9 F+ b8 G 这个范例使用 File 方法,例如 isDirectory 和 exists,穿越目录结构。每个文件都被查询一次它的类型 (普通文件或者目录)。 |