|
CSR :
|
|
|
Relates :
|
Summary
-------
Change `java.nio.file.Path::getExtension` to return a non-`null` string representing the file extension of the path's file name with the period separator character included.
Problem
-------
The present incarnation of `Path::getExtension` can return `null` in cases where no extension is found. This creates scenarios where `NullPointerException`s can become a problem. Not including the extension separator character in the extension also makes other path manipulations such as removing or replacing the extension somewhat more complex.
Solution
--------
Define the the path's file name's file extension to be that portion of the string representation of the file name after _and including_ the last period character as opposed to the portion of the file name string _after_ the last period. A returned empty string `""` instead of `null` now signifies that no extension was found, and a string containing only a single period character `"."` instead of solely an empty string `""` now signifies an empty extension.
Specification
-------------
--- a/src/java.base/share/classes/java/nio/file/Path.java
+++ b/src/java.base/share/classes/java/nio/file/Path.java
@@ -257,53 +257,47 @@ public static Path of(URI uri) {
* determined by the position of a period character ('.', U+002E FULL STOP)
* within the file name string. If the file name element is {@code null},
* or if the file name string does not contain a period character, or if
- * the only period in the file name string is its first character, then
- * the extension is {@code null}. Otherwise, the extension is the substring
- * after the last period in the file name string. If this last period is
- * also the last character in the file name string, then the extension is
- * {@linkplain String#isEmpty empty}.
+ * the only period in the file name string is its first character, then
+ * the extension is {@linkplain String#isEmpty empty}. Otherwise, the
+ * extension is the substring starting with the last period in the file
+ * name string. If this last period is also the last character in the file
+ * name string, then the extension contains only a single period character.
+ *
+ * @apiNote
+ * Unless no extension is found, in which case an empty string is returned,
+ * the returned extension includes the period separator character. For
+ * example, the extension which would be returned for a path with file name
+ * "photograph.jpg" is ".jpg".
*
* @implSpec
* The default implementation is equivalent for this path to:
* <pre>{@code
* int lastPeriod = fileName.lastIndexOf('.');
- * if (lastPeriod <= 0)
- * return null;
- * return (lastPeriod == fileName.length() - 1)
- * ? ""
- * : fileName.substring(lastPeriod + 1);
+ * return lastPeriod <= 0 ? return "" : fileName.substring(lastPeriod);
* }</pre>
*
- * @return the file name extension of this path, which might be the
- * empty string, or {@code null} if no extension is found
+ * @return the non-{@code null} file extension of this path's file name,
+ * possibly only a single period character, or an empty string if
+ * no extension is found
*
* @since 20
*/
default String getExtension() {}