Thanks for the thorough review. Responses in-line. > On 26 Nov 2018, at 19:49, Roger Riggs <roger.ri...@oracle.com> wrote: > > Hi, > > Thanks for updating this proposal. Some comments on the javadoc/spec. > > The class name Hex isn't very evocative of its function. > HexFormat would convey a more complete idea as to its function and be similar > to > to the existing DecimalFormat and NumberFormat classes though they do not > share > any of the APIs or framework.
OK > > - The 2nd example using Files.newInputStream is not recommended > since the stream to the file may not be closed. > The recommended form would use try-with-resources. > try (InputStream is = Files.newInputStream(Paths.get("mydata"))) { > Hex.dumpAsStream(is, 64, > (offset, chunk, fromIndex, toIndex) -> > String.format("%d %s", > offset / 64 + 1, > Hex.toPrintableString(chunk, fromIndex, toIndex))) > .forEachOrdered(System.out::println); > } catch (IOException ioe) { > ... > } > The 'forEachOrdered' should not be necessary and may raise questions about > why. > if there's no good reason, use 'forEach’. OK > > > - The HEXDUMP_FORMATTER should be explicit about the format it generates. > Though it may declare itself compatible with hexdump(1) it should specify > the format it produces to avoid an external reference that might change > unexpectedly. OK > > - toFormattedHexString: > References to the line-separator should be javadoc linked to > System#lineSeparator. OK. And maybe shorten this method to simply: toFormattedString ? > > Alternatively, should this class follow the lead of String.align/indent and > use > the normalized line terminator "\n" consistently? In which case, it should be > explicit. > > Clarify exactly the behavior: > > "If the final chunk is less than 16 +bytes+ then +the result+ is padded with > spaces to match the length of the preceding chunks. " > > Only the built-in formatter asserts that every result is the same length. A > provided formatter > may not conform. soften "will be" -> "may be" in "the final chunk …" OK > > - everywhere: "binary buffer" -> "byte buffer" or byte array OK > > - toPrintableString: The ASCII limitation seems quite dated, 8-bit clean is > the norm and > except for control characters and 0x7f, the rest of the range is printable > in most Locales. > Strict conformance to hexdump is not a requirement. I can see the benefit to including the accented letters > 0x7F but is it really useful to also display graphical and non-printable characters > 0x7F ? > > - dumpAsStream(InputStream) > It is inconsistent (and possibly wrong) that the final chunk may be shorter > since the HEXDUMP_FORMATTER > uses the formatter that always pads. (Btw, the implementation appends \n > and should be using lineSeparator.) > "If the input is not a multiple of 16 bytes then the final chunk will be > shorter than the preceding chunks.” I’ve clarified the language. The final chunk will indeed be shorter but the output 'will be' padded by HEXDUMP_FORMATTER and 'may be' padded when a custom formatter is supplied. > > - dumpAsStream(bytes, from, to, chunk, formatter) > > Can it more explicit about the unchecked exception? > "If an error occurs in the formatter then an unchecked exception will be > thrown from the underlying Stream method.” What do you suggest? The formatter may throw any exception and it doesn’t get thrown until the stream is processed. > > - Another thought about the methods returning Stream<String>. > They require a concrete string to be created for each chunk. > There may be some efficiency and flexibility to be gained if formatters can > return a CharSequence. > In many cases it would be a string, but it would allow the formatter to > return a StringBuilder > that could be used directly without needing to construct a short lived > string. Sounds OK but I’ll need to prototype this and get back to you. > > Thanks, Roger > > > p.s. > I wrote code for the use case of formatting bytes in the form that can be > compiled with javac. > it took rather more code than I expected but I don't have any specific > suggestions. > > > byte[] b = ...; > final String indent = " ".repeat(8); > final StringBuilder sb = new StringBuilder(16 * 5); > sb.append(indent); > > System.out.print(" byte[] bytes = {\n"); > try (ByteArrayInputStream is = new ByteArrayInputStream(b)) { > dumpAsStream(is, 16, (o, c, s, e) -> { > sb.setLength(indent.length()); > for (int i = s; i < e; i++) { > sb.append(c[i]); > sb.append(", "); > } > sb.append(System.lineSeparator()); > return sb.toString(); > }).forEach(s -> System.out.print(s)); > } > System.out.print(" }\n"); > > > On 11/23/2018 09:51 AM, Vincent Ryan wrote: >> Hello, >> >> Please review this proposal for a new API to conveniently generate and >> display binary data using hexadecimal string representation. >> It supports both bulk and stream operations and it can also generate the >> well-known hexdump format [1]. >> >> This latest revision addresses review comments provided earlier. >> These include adding methods to support for data supplied in a ByteBuffer, >> exposing the default formatter implementation as a public >> static and dropping the superfluous 'Hex' term from several method names. >> >> Thanks >> >> >> Bug: https://bugs.openjdk.java.net/browse/JDK-8170769 >> <https://bugs.openjdk.java.net/browse/JDK-8170769> >> API: >> http://cr.openjdk.java.net/~vinnie/8170769/javadoc.06/api/java.base/java/util/Hex.html >> >> <http://cr.openjdk.java.net/~vinnie/8170769/javadoc.06/api/java.base/java/util/Hex.html> >> Webrev: http://cr.openjdk.java.net/~vinnie/8170769/webrev.06/ >> <http://cr.openjdk.java.net/~vinnie/8170769/webrev.06/> >> >> >> ____ >> [1] https://docs.oracle.com/cd/E88353_01/html/E37839/hexdump-1.html >> <https://docs.oracle.com/cd/E88353_01/html/E37839/hexdump-1.html> >