1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
/* * @(#)FileNameExtensionFilter.java 1.1 06/02/02 * * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package javax.swing.filechooser; import java.io.File; import java.util.Locale; /** * An implementation of {@code FileFilter} that filters using a * specified set of extensions. The extension for a file is the * portion of the file name after the last ".". Files whose name does * not contain a "." have no file name extension. File name extension * comparisons are case insensitive. * <p> * The following example creates a * {@code FileNameExtensionFilter} that will show {@code jpg} files: * <pre> * FileFilter filter = new FileNameExtensionFilter("JPEG file", "jpg", "jpeg"); * JFileChooser fileChooser = ...; * fileChooser.addChoosableFileFilter(filter); * </pre> * * @see FileFilter * @see javax.swing.JFileChooser#setFileFilter * @see javax.swing.JFileChooser#addChoosableFileFilter * @see javax.swing.JFileChooser#getFileFilter * * @version 1.1 02/02/06 * @since 1.6 */ public final class FileNameExtensionFilter extends FileFilter { // Description of this filter. private final String description; // Known extensions. private final String[] extensions; // Cached ext private final String[] lowerCaseExtensions; /** * Creates a {@code FileNameExtensionFilter} with the specified * description and file name extensions. The returned {@code * FileNameExtensionFilter} will accept all directories and any * file with a file name extension contained in {@code extensions}. * * @param description textual description for the filter, may be * {@code null} * @param extensions the accepted file name extensions * @throws IllegalArgumentException if extensions is {@code null}, empty, * contains {@code null}, or contains an empty string * @see #accept */ public FileNameExtensionFilter(String description, String... extensions) { if (extensions == null || extensions.length == 0) { throw new IllegalArgumentException( "Extensions must be non-null and not empty"); } this.description = description; this.extensions = new String[extensions.length]; this.lowerCaseExtensions = new String[extensions.length]; for (int i = 0; i < extensions.length; i++) { if (extensions[i] == null || extensions[i].length() == 0) { throw new IllegalArgumentException( "Each extension must be non-null and not empty"); } this.extensions[i] = extensions[i]; lowerCaseExtensions[i] = extensions[i].toLowerCase(Locale.ENGLISH); } } /** * Tests the specified file, returning true if the file is * accepted, false otherwise. True is returned if the extension * matches one of the file name extensions of this {@code * FileFilter}, or the file is a directory. * * @param f the {@code File} to test * @return true if the file is to be accepted, false otherwise */ public boolean accept(File f) { if (f != null) { if (f.isDirectory()) { return true; } // NOTE: we tested implementations using Maps, binary search // on a sorted list and this implementation. All implementations // provided roughly the same speed, most likely because of // overhead associated with java.io.File. Therefor we've stuck // with the simple lightweight approach. String fileName = f.getName(); int i = fileName.lastIndexOf('.'); if (i > 0 && i < fileName.length() - 1) { String desiredExtension = fileName.substring(i+1). toLowerCase(Locale.ENGLISH); for (String extension : lowerCaseExtensions) { if (desiredExtension.equals(extension)) { return true; } } } } return false; } /** * The description of this filter. For example: "JPG and GIF Images." * * @return the description of this filter */ public String getDescription() { return description; } /** * Returns the set of file name extensions files are tested against. * * @return the set of file name extensions files are tested against */ public String[] getExtensions() { String[] result = new String[extensions.length]; System.arraycopy(extensions, 0, result, 0, extensions.length); return result; } /** * Returns a string representation of the {@code FileNameExtensionFilter}. * This method is intended to be used for debugging purposes, * and the content and format of the returned string may vary * between implementations. * * @return a string representation of this {@code FileNameExtensionFilter} */ public String toString() { return super.toString() + "[description=" + getDescription() + " extensions=" + java.util.Arrays.asList(getExtensions()) + "]"; } }