Question: The sample program DirectoryList.java (in the code directory), given as an example in section 11.2.2 of the textbook will print a list of files in

The sample program DirectoryList.java (in the code directory), given as an example in section 11.2.2 of the textbook will print a list of files in a directory specified by the user. But some of the files in that directory might themselves be directories. And the subdirectories can themselves contain directories. And so on. Write a modified version of DirectoryList that will list all the files in a directory and all its subdirectories, to any level of nesting. You will need a recursive subroutine to do the listing. The subroutine should have a parameter of type File. You will need the constructor from the File class that has the form

public File( File dir, String fileName ) // Constructs the File object representing a file // named fileName in the directory specified by dir.

SimpleFileChooser.java

package textcollage;

import java.awt.Component;

import java.io.File;

import javax.swing.JFileChooser;

import javax.swing.JOptionPane;

/**

* This class provides a slightly simplified interface to one of Java's

* standard JFileChooser dialogs. An object of type SimpleFileChooser

* has methods that allow the user to select files for input or output.

* If the object is used several times, the same JFileChooser is used

* each time. By default, the dialog box is set to the user's home

* directory the first time it is used, and after that it remembers the

* current directory between one use and the next. However, methods

* are provided for setting the current directory. (Note: On Windows,

* the user's home directory will probably mean the user's "My Documents"

* directory".)

*/

public class SimpleFileChooser {

private JFileChooser dialog; // The dialog, which is created when needed.

/**

* Reset the default directory in the dialog box to the user's home

* directory. The next time the dialog appears, it will show the

* contents of that directory.

*/

public void setDefaultDirectory() {

if (dialog != null)

dialog.setCurrentDirectory(null);

}

/**

* Set the default directory for the dialog box. The next time the

* dialog appears, it will show the contents of that directory.

* @param directoryName A File object that specifies the directory name.

* If this name is null, then the user's home directory will be used.

*/

public void setDefaultDirectory(String directoryName) {

if (dialog == null)

dialog = new JFileChooser();

dialog.setCurrentDirectory(new File(directoryName));

}

/**

* Set the default directory for the dialog box. The next time the

* dialog appears, it will show the contents of that directory.

* @param directoryName The name of the new default directory. If the

* name is null, then the user's home directory will be used.

*/

public void setDefaultDirectory(File directory) {

if (dialog == null)

dialog = new JFileChooser();

dialog.setCurrentDirectory(directory);

}

/**

* Show a dialog box where the user can select a file for reading.

* This method simply returns getInputFile(null,null).

* @see #getInputFile(Component, String)

* @return the selected file, or null if the user did not select a file.

*/

public File getInputFile() {

return getInputFile(null,null);

}

/**

* Show a dialog box where the user can select a file for reading.

* This method simply returns getInputFile(parent,null).

* @see #getInputFile(Component, String)

* @return the selected file, or null if the user did not select a file.

*/

public File getInputFile(Component parent) {

return getInputFile(parent,null);

}

/**

* Show a dialog box where the user can select a file for reading.

* If the user cancels the dialog by clicking its "Cancel" button or

* the Close button in the title bar, then the return value of this

* method is null. Otherwise, the return value is the selected file.

* Note that the file has to exist, but it is not guaranteed that the

* user is allowed to read the file.

* @param parent If the parent is non-null, then the window that contains

* the parent component becomes the parent window of the dialog box. This

* means that the window is "blocked" until the dialog is dismissed. Also,

* the dialog box's position on the screen should be based on the position of

* the window. Generally, you should pass your application's main window or

* panel as the value of this parameter.

* @param dialogTitle a title to be displayed in the title bar of the dialog

* box. If the value of this parameter is null, then the dialog title will

* be "Select Input File".

* @return the selected file, or null if the user did not select a file.

*/

public File getInputFile(Component parent, String dialogTitle) {

if (dialog == null)

dialog = new JFileChooser();

if (dialogTitle != null)

dialog.setDialogTitle(dialogTitle);

else

dialog.setDialogTitle("Select Input File");

int option = dialog.showOpenDialog(parent);

if (option != JFileChooser.APPROVE_OPTION)

return null; // User canceled or clicked the dialog's close box.

File selectedFile = dialog.getSelectedFile();

return selectedFile;

}

/**

* Show a dialog box where the user can select a file for writing.

* This method simply calls getOutputFile(null,null,null)

* @see #getOutputFile(Component, String, String)

* @return the selcted file, or null if no file was selected.

*/

public File getOutputFile() {

return getOutputFile(null,null,null);

}

/**

* Show a dialog box where the user can select a file for writing.

* This method simply calls getOutputFile(null,null,null)

* @see #getOutputFile(Component, String, String)

* @return the selcted file, or null if no file was selected.

*/

public File getOutputFile(Component parent) {

return getOutputFile(parent,null,null);

}

/**

* Show a dialog box where the user can select a file for writing.

* This method calls getOutputFile(parent,dialogTitle,null)

* @see #getOutputFile(Component, String, String)

* @return the selcted file, or null if no file was selected.

*/

public File getOutputFile(Component parent, String dialogTitle) {

return getOutputFile(parent,dialogTitle,null);

}

/**

* Show a dialog box where the user can select a file for writing.

* If the user cancels the dialog by clicking its "Cancel" button or

* the Close button in the title bar, then the return value of this

* method is null. A non-null value indicates that the user specified

* a file name and that, if the file exists, then the user wants to

* replace that file. (If the user selects a file that already exists,

* then the user will be asked whether to replace the existing file.)

* Note that it is not quaranteed that the selected file is actually

* writable; the user might not have permission to create or modify the file.

* @param parent If the parent is non-null, then the window that contains

* the parent component becomes the parent window of the dialog box. This

* means that the window is "blocked" until the dialog is dismissed. Also,

* the dialog box's position on the screen should be based on the position of

* the window. Generally, you should pass your application's main window or

* panel as the value of this parameter.

* @param dialogTitle a title to be displayed in the title bar of the dialog

* box. If the value of this parameter is null, then the dialog title will

* be "Select Input File".

* @param defaultFile when the dialog appears, this name will be filled in

* as the name of the selected file. If the value of this parameter is null,

* then the file name box will be empty.

* @return the selected file, or null if the user did not select a file.

*/

public File getOutputFile(Component parent,

String dialogTitle, String defaultFile) {

if (dialog == null)

dialog = new JFileChooser();

if (dialogTitle != null)

dialog.setDialogTitle(dialogTitle);

else

dialog.setDialogTitle("Select Output File");

if (defaultFile == null)

dialog.setSelectedFile(null);

else

dialog.setSelectedFile(new File(defaultFile));

while (true) {

int option = dialog.showSaveDialog(parent);

if (option != JFileChooser.APPROVE_OPTION)

return null; // User canceled or clicked the dialog's close box.

File selectedFile = dialog.getSelectedFile();

if ( ! selectedFile.exists() )

return selectedFile;

else { // Ask the user whether to replace the file.

int response = JOptionPane.showConfirmDialog( parent,

"The file \"" + selectedFile.getName()

+ "\" already exists. Do you want to replace it?",

"Confirm Save",

JOptionPane.YES_NO_CANCEL_OPTION,

JOptionPane.WARNING_MESSAGE );

if (response == JOptionPane.CANCEL_OPTION)

return null; // User does not want to select a file.

if (response == JOptionPane.YES_OPTION)

return selectedFile; // User wants to replace the file

// A "No" response will cause the file dialog to be shown again.

}

}

}

}

package textcollage;

import java.awt.Dimension;

import java.awt.Toolkit;

import javax.swing.JFrame;

/**

* This main program simply shows a window that contains

* a DrawTextPanel and the menu bar for that panel.

*/

public class TextCollage {

public static void main(String[] args) {

JFrame frame = new JFrame("Text Collage");

DrawTextPanel panel = new DrawTextPanel();

frame.setContentPane( panel );

frame.setJMenuBar(panel.getMenuBar());

frame.setResizable(false);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.pack();

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

frame.setLocation( (screenSize.width - frame.getWidth())/2,

(screenSize.height - frame.getHeight())/2 );

frame.setVisible(true);

}

}

TextCollage.java

package textcollage;

import java.awt.Dimension; import java.awt.Toolkit; import javax.swing.JFrame;

/** * This main program simply shows a window that contains * a DrawTextPanel and the menu bar for that panel. */ public class TextCollage {

public static void main(String[] args) { JFrame frame = new JFrame("Text Collage"); DrawTextPanel panel = new DrawTextPanel(); frame.setContentPane( panel ); frame.setJMenuBar(panel.getMenuBar()); frame.setResizable(false); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); frame.setLocation( (screenSize.width - frame.getWidth())/2, (screenSize.height - frame.getHeight())/2 ); frame.setVisible(true); }

}

DrawTextPanel.java

package textcollage;

import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.io.File; import java.util.ArrayList; import javax.imageio.ImageIO; import javax.swing.BorderFactory; import javax.swing.JColorChooser; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.KeyStroke;

/** * A panel that contains a large drawing area where strings * can be drawn. The strings are represented by objects of * type DrawTextItem. An input box under the panel allows * the user to specify what string will be drawn when the * user clicks on the drawing area. */ public class DrawTextPanel extends JPanel {

// As it now stands, this class can only show one string at at // a time! The data for that string is in the DrawTextItem object // named theString. (If it's null, nothing is shown. This // variable should be replaced by a variable of type // ArrayList that can store multiple items.

private DrawTextItem theString; // change to an ArrayList !

private Color currentTextColor = Color.BLACK; // Color applied to new strings.

private Canvas canvas; // the drawing area. private JTextField input; // where the user inputs the string that will be added to the canvas private SimpleFileChooser fileChooser; // for letting the user select files private JMenuBar menuBar; // a menu bar with command that affect this panel private MenuHandler menuHandler; // a listener that responds whenever the user selects a menu command private JMenuItem undoMenuItem; // the "Remove Item" command from the edit menu

/** * An object of type Canvas is used for the drawing area. * The canvas simply displays all the DrawTextItems that * are stored in the ArrayList, strings. */ private class Canvas extends JPanel { Canvas() { setPreferredSize( new Dimension(800,600) ); setBackground(Color.LIGHT_GRAY); setFont( new Font( "Serif", Font.BOLD, 24 )); } protected void paintComponent(Graphics g) { super.paintComponent(g); ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); if (theString != null) theString.draw(g); } }

/** * An object of type MenuHandler is registered as the ActionListener * for all the commands in the menu bar. The MenuHandler object * simply calls doMenuCommand() when the user selects a command * from the menu. */ private class MenuHandler implements ActionListener { public void actionPerformed(ActionEvent evt) { doMenuCommand( evt.getActionCommand()); } }

/** * Creates a DrawTextPanel. The panel has a large drawing area and * a text input box where the user can specify a string. When the * user clicks the drawing area, the string is added to the drawing * area at the point where the user clicked. */ public DrawTextPanel() { fileChooser = new SimpleFileChooser(); undoMenuItem = new JMenuItem("Remove Item"); undoMenuItem.setEnabled(false); menuHandler = new MenuHandler(); setLayout(new BorderLayout(3,3)); setBackground(Color.BLACK); setBorder(BorderFactory.createLineBorder(Color.BLACK, 2)); canvas = new Canvas(); add(canvas, BorderLayout.CENTER); JPanel bottom = new JPanel(); bottom.add(new JLabel("Text to add: ")); input = new JTextField("Hello World!", 40); bottom.add(input); add(bottom, BorderLayout.SOUTH); canvas.addMouseListener( new MouseAdapter() { public void mousePressed(MouseEvent e) { doMousePress( e ); } } ); }

/** * This method is called when the user clicks the drawing area. * A new string is added to the drawing area. The center of * the string is at the point where the user clicked. * @param e the mouse event that was generated when the user clicked */ public void doMousePress( MouseEvent e ) { String text = input.getText().trim(); if (text.length() == 0) { input.setText("Hello World!"); text = "Hello World!"; } DrawTextItem s = new DrawTextItem( text, e.getX(), e.getY() ); s.setTextColor(currentTextColor); // Default is null, meaning default color of the canvas (black).

// SOME OTHER OPTIONS THAT CAN BE APPLIED TO TEXT ITEMS: // s.setFont( new Font( "Serif", Font.ITALIC + Font.BOLD, 12 )); // Default is null, meaning font of canvas. // s.setMagnification(3); // Default is 1, meaning no magnification. // s.setBorder(true); // Default is false, meaning don't draw a border. // s.setRotationAngle(25); // Default is 0, meaning no rotation. // s.setTextTransparency(0.3); // Default is 0, meaning text is not at all transparent. // s.setBackground(Color.BLUE); // Default is null, meaning don't draw a background area. // s.setBackgroundTransparency(0.7); // Default is 0, meaning background is not transparent.

theString = s; // Set this string as the ONLY string to be drawn on the canvas! undoMenuItem.setEnabled(true); canvas.repaint(); }

/** * Returns a menu bar containing commands that affect this panel. The menu * bar is meant to appear in the same window that contains this panel. */ public JMenuBar getMenuBar() { if (menuBar == null) { menuBar = new JMenuBar();

String commandKey; // for making keyboard accelerators for menu commands if (System.getProperty("mrj.version") == null) commandKey = "control "; // command key for non-Mac OS else commandKey = "meta "; // command key for Mac OS

JMenu fileMenu = new JMenu("File"); menuBar.add(fileMenu); JMenuItem saveItem = new JMenuItem("Save..."); saveItem.setAccelerator(KeyStroke.getKeyStroke(commandKey + "N")); saveItem.addActionListener(menuHandler); fileMenu.add(saveItem); JMenuItem openItem = new JMenuItem("Open..."); openItem.setAccelerator(KeyStroke.getKeyStroke(commandKey + "O")); openItem.addActionListener(menuHandler); fileMenu.add(openItem); fileMenu.addSeparator(); JMenuItem saveImageItem = new JMenuItem("Save Image..."); saveImageItem.addActionListener(menuHandler); fileMenu.add(saveImageItem);

JMenu editMenu = new JMenu("Edit"); menuBar.add(editMenu); undoMenuItem.addActionListener(menuHandler); // undoItem was created in the constructor undoMenuItem.setAccelerator(KeyStroke.getKeyStroke(commandKey + "Z")); editMenu.add(undoMenuItem); editMenu.addSeparator(); JMenuItem clearItem = new JMenuItem("Clear"); clearItem.addActionListener(menuHandler); editMenu.add(clearItem);

JMenu optionsMenu = new JMenu("Options"); menuBar.add(optionsMenu); JMenuItem colorItem = new JMenuItem("Set Text Color..."); colorItem.setAccelerator(KeyStroke.getKeyStroke(commandKey + "T")); colorItem.addActionListener(menuHandler); optionsMenu.add(colorItem); JMenuItem bgColorItem = new JMenuItem("Set Background Color..."); bgColorItem.addActionListener(menuHandler); optionsMenu.add(bgColorItem);

} return menuBar; }

/** * Carry out one of the commands from the menu bar. * @param command the text of the menu command. */ private void doMenuCommand(String command) { if (command.equals("Save...")) { // save all the string info to a file JOptionPane.showMessageDialog(this, "Sorry, the Save command is not implemented."); } else if (command.equals("Open...")) { // read a previously saved file, and reconstruct the list of strings JOptionPane.showMessageDialog(this, "Sorry, the Open command is not implemented."); canvas.repaint(); // (you'll need this to make the new list of strings take effect) } else if (command.equals("Clear")) { // remove all strings theString = null; // Remove the ONLY string from the canvas. undoMenuItem.setEnabled(false); canvas.repaint(); } else if (command.equals("Remove Item")) { // remove the most recently added string theString = null; // Remove the ONLY string from the canvas. undoMenuItem.setEnabled(false); canvas.repaint(); } else if (command.equals("Set Text Color...")) { Color c = JColorChooser.showDialog(this, "Select Text Color", currentTextColor); if (c != null) currentTextColor = c; } else if (command.equals("Set Background Color...")) { Color c = JColorChooser.showDialog(this, "Select Background Color", canvas.getBackground()); if (c != null) { canvas.setBackground(c); canvas.repaint(); } } else if (command.equals("Save Image...")) { // save a PNG image of the drawing area File imageFile = fileChooser.getOutputFile(this, "Select Image File Name", "textimage.png"); if (imageFile == null) return; try { // Because the image is not available, I will make a new BufferedImage and // draw the same data to the BufferedImage as is shown in the panel. // A BufferedImage is an image that is stored in memory, not on the screen. // There is a convenient method for writing a BufferedImage to a file. BufferedImage image = new BufferedImage(canvas.getWidth(),canvas.getHeight(), BufferedImage.TYPE_INT_RGB); Graphics g = image.getGraphics(); g.setFont(canvas.getFont()); canvas.paintComponent(g); // draws the canvas onto the BufferedImage, not the screen! boolean ok = ImageIO.write(image, "PNG", imageFile); // write to the file if (ok == false) throw new Exception("PNG format not supported (this shouldn't happen!)."); } catch (Exception e) { JOptionPane.showMessageDialog(this, "Sorry, an error occurred while trying to save the image: " + e); } } }

}

DrawTextItem.java

package textcollage;

import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D;

/** * An object of type DrawText can draw a string in * a graphics context, with various effects, such as * color, magnification, and rotation The string * is specified in the constructor and cannot be changed. * The position and other properties can be changed. */ public class DrawTextItem {

private final String string; // The String that is drawn by this item.

private Font font = null; private int x = 0; private int y = 0; private Color textColor = Color.BLACK; private Color background = null; private boolean border = false; private double rotationAngle = 0; private double magnification = 1; private double textTransparency = 0; private double backgroundTransparency = 0;

/** * Create a DrawTextItem to draw a specified string. Initially, * the position is set to (0,0) and all properties have their * default values. * @throws NullPointerException if the parameter is null */ public DrawTextItem(String stringToDraw) { this(stringToDraw,0,0); }

/** * Create a DrawTextItem to draw a specified string. Initially, * the position is set to (x,y) and all other properties have their * default values. Note that x and y give the position of * the center of the string. * @param x the x-coordinate where the string will be drawn. * @param y the y-coordinate where the string will be drawn. * @throws NullPointerException if the parameter is null */ public DrawTextItem(String stringToDraw, int x, int y) { if (stringToDraw == null) throw new NullPointerException("String can't be null."); string = stringToDraw; this.x = x; this.y = y; }

/** * Draw this item's string in the given Graphics constext, * applying all of this item's property settings. * @param g the graphics context in which the string will * be drawn. Note that this is assumed to be actually of * type Graphics2D (which should not be a problem). */ public void draw(Graphics g) { Graphics2D g2 = (Graphics2D)g.create(); if (font != null) g2.setFont(font); FontMetrics fm = g2.getFontMetrics(); int width = fm.stringWidth(string); int height = fm.getAscent() + fm.getDescent(); g2.translate(x,y); if (magnification != 1) { float pixelSize = 1/(float)magnification; g2.setStroke( new BasicStroke(pixelSize) ); // magnification won't apply to border g2.scale(magnification,magnification); } if (rotationAngle > 0) g2.rotate( -Math.PI * (rotationAngle / 180)); Color colorToUseForText = textColor; if (colorToUseForText == null) colorToUseForText = g2.getColor(); if (background != null) { if (backgroundTransparency == 0) g2.setColor(background); else g2.setColor( new Color( background.getRed(), background.getGreen(), background.getBlue(), (int)(255*(1-backgroundTransparency))) ); g2.fillRect(-width/2 - 3, -height/2 - 3, width + 6, height + 6); } if (textTransparency == 0) g2.setColor(colorToUseForText); else g2.setColor( new Color( colorToUseForText.getRed(), colorToUseForText.getGreen(), colorToUseForText.getBlue(), (int)(255*(1-textTransparency)) ) ); if (border) g2.drawRect(-width/2 -3, -height/2 - 3, width + 6, height + 6); g2.drawString(string,-width/2, -height/2 + fm.getAscent()); }

/** * Returns the string that is drawn by this DrawTextItem. The * string is set in the constructor and cannot be changed. */ public String getString() { return string; }

/** * Set the background color. If the value is non-null, then * a rectangle of this color is drawn behind the string. * If the value is null, no background rectangle is drawn. * The default value is null. */ public void setBackground(Color background) { this.background = background; }

/** * Set the level of transparency of the background color, where 0 indicates * no transparency and 1 indicates completely transparent. If the value * is not 1, then the transparency level of the background color is set to * this value. If the background color is null, then the value of * backgroundTransparency is ignored. The default value is zero. * @param backgroundTransparency the background transparency level, in the range 0 to 1 * @throws IllegalArgumentException if the parameter is less than 0 or greater than 1 */ public void setBackgroundTransparency(double backgroundTransparency) { if (backgroundTransparency < 0 || backgroundTransparency > 1) throw new IllegalArgumentException("Transparency must be in the range 0 to 1."); this.backgroundTransparency = backgroundTransparency; }

/** * If border is set to true, then a rectangular border is drawn around * the string. The default value is false. */ public void setBorder(boolean border) { this.border = border; }

/** * Sets the font to be used for drawing the string. A value of * null indicates that the font that is set for the graphics context * where the string is drawn should be used. The default value is * null. */ public void setFont(Font font) { this.font = font; }

/** * Set a magnification level that is applied when the string is drawn. * A magnification of 2 will double the size; a value of 0.5 will cut * it in half. Negative values will produce backwards, upside-down text. * Zero is not a legal value, and an attempt to set the magnification to * zero will cause an IllegalArgumentException. The default value is * 1, Indicating no magnification. */ public void setMagnification(double magnification) { if (magnification == 0) throw new IllegalArgumentException("Magnification cannot be 0."); this.magnification = magnification; }

/** * Sets the angle of the baseline of the string with respect to the * horizontal. The angle is specified in degrees. The default is * 0, which gives normal, unrotated, horizontal text. */ public void setRotationAngle(double rotationAngle) { this.rotationAngle = rotationAngle; }

/** * Sets the color to be used for drawing the text (and the border if there is one). * The default value is null, which means that the color that is set in the * graphics context where the string is drawn will be used for drawing the text. */ public void setTextColor(Color textColor) { this.textColor = textColor; }

/** * Set the level of transparency of the text color, where 0 indicates * no transparency and 1 indicates completely transparent. If the value * is not 1, then the transparency level of the text color is set to * this value. This property is also applied to the border, if there is one. * The default value is zero. * @param textTransparency the text transparency level, in the range 0 to 1 * @throws IllegalArgumentException if the parameter is less than 0 or greater than 1 */ public void setTextTransparency(double textTransparency) { if (textTransparency < 0 || textTransparency > 1) throw new IllegalArgumentException("Transparency must be in the range 0 to 1."); this.textTransparency = textTransparency; }

/** * Set the x-coordinate where the string is drawn. This gives the position of * the center of the string. */ public void setX(int x) { this.x = x; }

/** * Set the y-coordinate where the string is drawn. This gives the position of * the center of the string. */ public void setY(int y) { this.y = y; }

/** * returns the value of the background color property */ public Color getBackground() { return background; }

/** * returns the value of the background transparency property */ public double getBackgroundTransparency() { return backgroundTransparency; }

/** * returns the value of the border property */ public boolean getBorder() { return border; }

/** * returns the value of the font property */ public Font getFont() { return font; }

/** * returns the value of the magnification property */ public double getMagnification() { return magnification; }

/** * returns the value of the rotation angle property */ public double getRotationAngle() { return rotationAngle; }

/** * returns the value of the text color property */ public Color getTextColor() { return textColor; }

/** * returns the value of the text transparency property */ public double getTextTransparency() { return textTransparency; }

/** * returns the x-coord of the center of the string */ public int getX() { return x; }

/** * returns the y-coord of the center of the string */ public int getY() { return y; }

}

DirectoryList.java

import java.io.File; import java.util.Scanner;

/** * This program lists the files in a directory specified by * the user. The user is asked to type in a directory name. * If the name entered by the user is not a directory, a * message is printed and the program ends. */ public class DirectoryList {

public static void main(String[] args) {

String directoryName; // Directory name entered by the user. File directory; // File object referring to the directory. String[] files; // Array of file names in the directory. Scanner scanner; // For reading a line of input from the user.

scanner = new Scanner(System.in); // scanner reads from standard input.

System.out.print("Enter a directory name: "); directoryName = scanner.nextLine().trim(); directory = new File(directoryName);

if (directory.isDirectory() == false) { if (directory.exists() == false) System.out.println("There is no such directory!"); else System.out.println("That file is not a directory."); } else { files = directory.list(); System.out.println("Files in directory \"" + directory + "\":"); for (int i = 0; i < files.length; i++) System.out.println(" " + files[i]); }

} // end main()

} // end class DirectoryList

***Please do not forget to post the output and please do not copy and paste someone else's answer or take the answer from a website over the internet. Thanks***

Step by Step Solution

There are 3 Steps involved in it

1 Expert Approved Answer
Step: 1 Unlock blur-text-image
Question Has Been Solved by an Expert!

Get step-by-step solutions from verified subject matter experts

Step: 2 Unlock
Step: 3 Unlock

Students Have Also Explored These Related Databases Questions!