You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2023/04/13 15:10:49 UTC

[commons-io] 03/03: Add FileSystem.getBlockSize()

This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-io.git

commit 9a70427dea06b0cf09cf8665ebb816f803e4757c
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Thu Apr 13 11:10:41 2023 -0400

    Add FileSystem.getBlockSize()
---
 src/changes/changes.xml                            |  3 ++
 .../java/org/apache/commons/io/FileSystem.java     | 37 +++++++++++++++-------
 .../java/org/apache/commons/io/FileSystemTest.java |  8 +++--
 3 files changed, 33 insertions(+), 15 deletions(-)

diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 687777f1..7cbdb7dc 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -465,6 +465,9 @@ The <action> type attribute can be add,update,fix,remove.
       <action issue="IO-786" dev="ggregory" type="add" due-to="Gary Gregory, Benoit Tellier">
         Add UnsynchronizedBufferedInputStream.
       </action>
+      <action dev="ggregory" type="add" due-to="Gary Gregory">
+        Add FileSystem.getBlockSize().
+      </action>
       <!-- UPDATE -->
       <action dev="kinow" type="update" due-to="Dependabot, Gary Gregory">
         Bump actions/cache from 2.1.6 to 3.0.10 #307, #337, #393.
diff --git a/src/main/java/org/apache/commons/io/FileSystem.java b/src/main/java/org/apache/commons/io/FileSystem.java
index 42f51672..d71bd373 100644
--- a/src/main/java/org/apache/commons/io/FileSystem.java
+++ b/src/main/java/org/apache/commons/io/FileSystem.java
@@ -36,12 +36,12 @@ public enum FileSystem {
     /**
      * Generic file system.
      */
-    GENERIC(false, false, Integer.MAX_VALUE, Integer.MAX_VALUE, new int[] { 0 }, new String[] {}, false, false, '/'),
+    GENERIC(4096, false, false, Integer.MAX_VALUE, Integer.MAX_VALUE, new int[] { 0 }, new String[] {}, false, false, '/'),
 
     /**
      * Linux file system.
      */
-    LINUX(true, true, 255, 4096, new int[] {
+    LINUX(8192, true, true, 255, 4096, new int[] {
             // KEEP THIS ARRAY SORTED!
             // @formatter:off
             // ASCII NUL
@@ -53,7 +53,7 @@ public enum FileSystem {
     /**
      * MacOS file system.
      */
-    MAC_OSX(true, true, 255, 1024, new int[] {
+    MAC_OSX(4096, true, true, 255, 1024, new int[] {
             // KEEP THIS ARRAY SORTED!
             // @formatter:off
             // ASCII NUL
@@ -76,8 +76,9 @@ public enum FileSystem {
      * @see <a href="https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilea#consoles">
      *      CreateFileA function - Consoles (microsoft.com)</a>
      */
-    WINDOWS(false, true, 255,
-            32000, new int[] {
+    WINDOWS(4096, false, true,
+            255, 32000, // KEEP THIS ARRAY SORTED!
+            new int[] {
                     // KEEP THIS ARRAY SORTED!
                     // @formatter:off
                     // ASCII NUL
@@ -87,9 +88,8 @@ public enum FileSystem {
                     29, 30, 31,
                     '"', '*', '/', ':', '<', '>', '?', '\\', '|'
                     // @formatter:on
-            }, // KEEP THIS ARRAY SORTED!
-            new String[] { "AUX", "COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9", "CON", "CONIN$", "CONOUT$",
-                    "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9", "NUL", "PRN" }, true, true, '\\');
+            }, new String[] { "AUX", "COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9", "CON", "CONIN$", "CONOUT$",
+                            "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9", "NUL", "PRN" }, true, true, '\\');
 
     /**
      * <p>
@@ -296,6 +296,8 @@ public enum FileSystem {
     private static String replace(final String path, final char oldChar, final char newChar) {
         return path == null ? null : path.replace(oldChar, newChar);
     }
+
+    private final int blockSize;
     private final boolean casePreserving;
     private final boolean caseSensitive;
     private final int[] illegalFileNameChars;
@@ -305,12 +307,12 @@ public enum FileSystem {
     private final boolean reservedFileNamesExtensions;
     private final boolean supportsDriveLetter;
     private final char nameSeparator;
-
     private final char nameSeparatorOther;
 
     /**
      * Constructs a new instance.
      *
+     * @param blockSize file allocation block size in bytes.
      * @param caseSensitive Whether this file system is case-sensitive.
      * @param casePreserving Whether this file system is case-preserving.
      * @param maxFileLength The maximum length for file names. The file name does not include folders.
@@ -321,9 +323,10 @@ public enum FileSystem {
      * @param supportsDriveLetter Whether this file system support driver letters.
      * @param nameSeparator The name separator, '\\' on Windows, '/' on Linux.
      */
-    FileSystem(final boolean caseSensitive, final boolean casePreserving, final int maxFileLength,
-        final int maxPathLength, final int[] illegalFileNameChars, final String[] reservedFileNames,
-        final boolean reservedFileNamesExtensions, final boolean supportsDriveLetter, final char nameSeparator) {
+    FileSystem(final int blockSize, final boolean caseSensitive, final boolean casePreserving,
+        final int maxFileLength, final int maxPathLength, final int[] illegalFileNameChars,
+        final String[] reservedFileNames, final boolean reservedFileNamesExtensions, final boolean supportsDriveLetter, final char nameSeparator) {
+        this.blockSize = blockSize;
         this.maxFileNameLength = maxFileLength;
         this.maxPathLength = maxPathLength;
         this.illegalFileNameChars = Objects.requireNonNull(illegalFileNameChars, "illegalFileNameChars");
@@ -336,6 +339,16 @@ public enum FileSystem {
         this.nameSeparatorOther = FilenameUtils.flipSeparator(nameSeparator);
     }
 
+    /**
+     * Gets the file allocation block size in bytes.
+     * @return the file allocation block size in bytes.
+     *
+     * @since 2.12.0
+     */
+    public int getBlockSize() {
+        return blockSize;
+    }
+
     /**
      * Gets a cloned copy of the illegal characters for this file system.
      *
diff --git a/src/test/java/org/apache/commons/io/FileSystemTest.java b/src/test/java/org/apache/commons/io/FileSystemTest.java
index a1e24331..8e7a8c5d 100644
--- a/src/test/java/org/apache/commons/io/FileSystemTest.java
+++ b/src/test/java/org/apache/commons/io/FileSystemTest.java
@@ -21,8 +21,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
-import java.io.IOException;
-
 import org.apache.commons.lang3.SystemUtils;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.condition.EnabledOnOs;
@@ -33,6 +31,10 @@ import org.junit.jupiter.api.condition.OS;
  */
 public class FileSystemTest {
 
+    @Test
+    public void testGetBlockSize() {
+        assertTrue(FileSystem.getCurrent().getBlockSize() >= 0);
+    }
 
     @Test
     public void testGetCurrent() {
@@ -72,7 +74,7 @@ public class FileSystemTest {
 
     @Test
     @EnabledOnOs(OS.WINDOWS)
-    public void testIsReservedFileNameOnWindows() throws IOException {
+    public void testIsReservedFileNameOnWindows() {
         final FileSystem fs = FileSystem.WINDOWS;
         for (final String candidate : fs.getReservedFileNames()) {
             // System.out.printf("Reserved %s exists: %s%n", candidate, Files.exists(Paths.get(candidate)));