1818
1919import java .io .File ;
2020import java .io .IOException ;
21+ import java .nio .charset .Charset ;
2122import java .security .MessageDigest ;
2223import java .util .Arrays ;
2324import java .util .Locale ;
2728import org .apache .commons .codec .digest .MessageDigestAlgorithms ;
2829
2930/**
30- * A minimal command line to run digest over files.
31+ * A minimal command line to run digest over files, directories or a string
3132 *
3233 * @see #main(String[])
3334 * @since 1.11
@@ -44,7 +45,8 @@ public class Digest {
4445 *
4546 * @param args
4647 * {@code args[0]} is one of {@link MessageDigestAlgorithms} name, {@link MessageDigest} name, {@code ALL}
47- * , or {@code *}. {@code args[1]} is a FILE.
48+ * , or {@code *}.
49+ * {@code args[1]} is a FILE.
4850 * @throws IOException
4951 */
5052 public static void main (String [] args ) throws IOException {
@@ -68,13 +70,17 @@ private Digest(final String[] args) {
6870 source = args .length == 1 ? null : args [1 ];
6971 }
7072
71- private void println (String prefix , final byte [] digest ) {
72- final String sourceDesc = source == null ? "-" : source ;
73+ private void println (final String prefix , final byte [] digest ) {
74+ println (prefix , digest , null );
75+ }
76+
77+ private void println (final String prefix , final byte [] digest , String fileName ) {
7378 // The standard appears to be to print
74- // hex, space, then either space or '*' followed by file
79+ // hex, space, then either space or '*' followed by filename
7580 // where '*' is used for binary files
7681 // shasum(1) has a -b option which generates " *" separator
77- System .out .println (prefix + Hex .encodeHexString (digest ) + " " + sourceDesc );
82+ // we don't distinguish binary files at present
83+ System .out .println (prefix + Hex .encodeHexString (digest ) + (fileName != null ? " " + fileName : "" ));
7884 }
7985
8086 private void run () throws IOException {
@@ -105,18 +111,20 @@ private void run(String prefix, final MessageDigest messageDigest) throws IOExce
105111 }
106112 final File file = new File (source );
107113 if (file .isFile ()) {
108- println (prefix , DigestUtils .digest (messageDigest , file ));
114+ println (prefix , DigestUtils .digest (messageDigest , file ), source );
109115 } else if (file .isDirectory ()) {
110116 run (prefix , messageDigest , file .listFiles ());
111117 } else {
112- System .err .println ("Parameter is file nor directory: '" + file + "'" );
118+ // use the default charset for the command-line parameter
119+ final byte [] bytes = source .getBytes (Charset .defaultCharset ());
120+ println (prefix , DigestUtils .digest (messageDigest , bytes ));
113121 }
114122 }
115123
116124 private void run (String prefix , MessageDigest messageDigest , File [] files ) throws IOException {
117125 for (File file : files ) {
118126 if (file .isFile ()) {
119- println (prefix , DigestUtils .digest (messageDigest , file ));
127+ println (prefix , DigestUtils .digest (messageDigest , file ), file . getName () );
120128 }
121129 }
122130 }
0 commit comments