1+ /*********************************************************************************
2+ * (Directory size) Listing 20.7, DirectorySize.java, gives a recursive method *
3+ * for finding a directory size. Rewrite this method without using recursion. *
4+ * Your program should use a queue to store the subdirectories under a directory. *
5+ *********************************************************************************/
6+ import java .io .File ;
7+ import java .util .*;
8+
9+ public class Exercise_20_18 {
10+ public static void main (String []args ) {
11+ // Prompt the user to enter a directory or a file
12+ System .out .print ("Enter a directory or a file: " );
13+ Scanner input =new Scanner (System .in );
14+ String directory =input .nextLine ();
15+
16+ // Display the size
17+ System .out .println (getSize (new File (directory )) +" bytes" );
18+ }
19+
20+ /** Returns the size of a directory */
21+ public static long getSize (File file ) {
22+ // Create a Queue
23+ Queue <File >queue =new LinkedList <>();
24+ long size =0 ;// Accumulates the directory size
25+
26+ addDirectory (queue ,file );
27+
28+ while (!queue .isEmpty ()) {
29+ // Remove an item form the queue into t
30+ File t =queue .remove ();
31+ if (t .isFile ())
32+ size +=t .length ();
33+ else // Add all files and subdirectories under t into the queue
34+ addDirectory (queue ,t );
35+ }
36+
37+ return size ;
38+ }
39+
40+ /** Adds a Directory to the queue */
41+ private static void addDirectory (
42+ Queue <File >queue ,File directory ) {
43+ for (File file :directory .listFiles ()) {
44+ queue .offer (file );
45+ };
46+ }
47+ }