google / google/jimfs

FileSystemProvider.newDirectoryStream order

Open
#362 5 comments 0 reactions 0 assignees View on GitHub
P3 type=enhancement
Dominant language
Java
Stars
2.6k
Forks
296
Avg merge
9m
Merged PRs (30d)
7

Description

[FileSystemProvider#newDirectoryStream](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/nio/file/spi/FileSystemProvider.html#newDirectoryStream(java.nio.file.Path,java.nio.file.DirectoryStream.Filter)) does not specify the order of the directory entries in the stream.

Both `sun.nio.fs.LinuxFileSystem` and `com.google.common.jimfs.JimfsFileSystem` seem to return them in alphabetical order.

Whereas `sun.nio.fs.MacOSXFileSystem` seemingly returns them in creation time order.

---

- Is this something [Configuration#osX()](https://javadoc.io/static/com.google.jimfs/jimfs/1.3.0/com/google/common/jimfs/Configuration.html#osX()) should consider?
- Should there be a new configuration option?—It would be useful in tests: A random order would ensure that tests do not rely on a specific order?

---

JimfsTest.java
```java
import com.google.common.jimfs.Configuration;
import com.google.common.jimfs.FileTimeSource;
import com.google.common.jimfs.Jimfs;
import java.io.IOException;
import java.nio.file.FileSystem;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.attribute.BasicFileAttributes;
import java.nio.file.attribute.FileTime;
import java.time.Instant;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
import java.util.stream.Stream;

public class JimfsTest {
public static void main(String[] args) throws IOException, InterruptedException {
new JimfsTest().run();
}

private void run() throws IOException, InterruptedException {
Path platformPath = Files.createTempDirectory("test");
platformPath.toFile().deleteOnExit();

FileSystem fsUnix = Jimfs.newFileSystem(Configuration.unix());
Path unixPath = fsUnix.getPath("/tmp");
Files.createDirectory(unixPath);

FileSystem osXFs = Jimfs.newFileSystem(Configuration.osX());
Path osXPath = osXFs.getPath("/tmp");
Files.createDirectory(osXPath);

FileSystem osXWithFileTimeSourceFs =
Jimfs.newFileSystem(
Configuration.osX().toBuilder()
.setFileTimeSource(
new FileTimeSource() {
final AtomicLong seq = new AtomicLong(1);

@Override
public FileTime now() {
return FileTime.fromMillis(seq.getAndIncrement());
}
})
.build());
Path fileTimePath = osXWithFileTimeSourceFs.getPath("/tmp");
Files.createDirectory(fileTimePath);

test(platformPath);
test(unixPath);
test(osXPath);
test(fileTimePath);
}

private void test(Path dir) throws IOException, InterruptedException {
System.out.println(dir.getFileSystem());
Path a = dir.resolve("a");
Files.createFile(a);
TimeUnit.SECONDS.sleep(1);
Files.createFile(dir.resolve("c"));
TimeUnit.SECONDS.sleep(1);
Files.createFile(dir.resolve("b"));
TimeUnit.SECONDS.sleep(1);
Files.setLastModifiedTime(a, FileTime.from(Instant.now()));
try (Stream paths = Files.list(dir)) {
paths
.map(
p -> {
try {
BasicFileAttributes attr = Files.readAttributes(p, BasicFileAttributes.class);
return p.getFileName()
+ " - "
+ attr.creationTime()
+ " - "
+ attr.lastModifiedTime();
} catch (IOException e) {
return p.getFileName();
}
})
.forEachOrdered(System.out::println);
}
}
}
```

## macOS

```shell
$ curl -L -O -s https://repo1.maven.org/maven2/com/google/guava/guava/32.1.1-jre/guava-32.1.1-jre.jar
$ curl -L -O -s https://repo1.maven.org/maven2/com/google/jimfs/jimfs/1.3.0/jimfs-1.3.0.jar

$ sw_vers
ProductName: macOS
ProductVersion: 12.7.6
BuildVersion: 21H1320

$ sdk use java 21.0.4-tem
$ java --version
openjdk 21.0.4 2024-07-16 LTS
OpenJDK Runtime Environment Temurin-21.0.4+7 (build 21.0.4+7-LTS)
OpenJDK 64-Bit Server VM Temurin-21.0.4+7 (build 21.0.4+7-LTS, mixed mode)
$ java -cp "guava-32.1.1-jre.jar:jimfs-1.3.0.jar" JimfsTest.java
sun.nio.fs.MacOSXFileSystem@2d6c53fc
a - 2024-08-20T17:34:22Z - 2024-08-20T17:34:24.078945Z
c - 2024-08-20T17:34:23Z - 2024-08-20T17:34:23.073769373Z
b - 2024-08-20T17:34:24Z - 2024-08-20T17:34:24.078076154Z
com.google.common.jimfs.JimfsFileSystem@41ab013
a - 2024-08-20T17:34:24.088Z - 2024-08-20T17:34:26.096155Z
b - 2024-08-20T17:34:26.096Z - 2024-08-20T17:34:26.096Z
c - 2024-08-20T17:34:25.091Z - 2024-08-20T17:34:25.091Z
com.google.common.jimfs.JimfsFileSystem@d771cc9
a - 2024-08-20T17:34:26.109Z - 2024-08-20T17:34:28.118222Z
b - 2024-08-20T17:34:28.118Z - 2024-08-20T17:34:28.118Z
c - 2024-08-20T17:34:27.112Z - 2024-08-20T17:34:27.112Z
com.google.common.jimfs.JimfsFileSystem@481ba2cf
a - 1970-01-01T00:00:00.005Z - 2024-08-20T17:34:30.124005Z
b - 1970-01-01T00:00:00.009Z - 1970-01-01T00:00:00.009Z
c - 1970-01-01T00:00:00.007Z - 1970-01-01T00:00:00.007Z

$ sdk use java 17.0.12-tem
$ java --version
openjdk 17.0.12 2024-07-16
OpenJDK Runtime Environment Temurin-17.0.12+7 (build 17.0.12+7)
OpenJDK 64-Bit Server VM Temurin-17.0.12+7 (build 17.0.12+7, mixed mode)
$ javac -cp "guava-32.1.1-jre.jar:jimfs-1.3.0.jar" JimfsTest.java
$ java -cp ".:guava-32.1.1-jre.jar:jimfs-1.3.0.jar" JimfsTest
sun.nio.fs.MacOSXFileSystem@6328d34a
a - 2024-08-20T17:35:00Z - 2024-08-20T17:35:02.719599Z
c - 2024-08-20T17:35:01Z - 2024-08-20T17:35:01.708488131Z
b - 2024-08-20T17:35:02Z - 2024-08-20T17:35:02.712525544Z
com.google.common.jimfs.JimfsFileSystem@23282c25
a - 2024-08-20T17:35:02.745Z - 2024-08-20T17:35:04.753207Z
b - 2024-08-20T17:35:04.753Z - 2024-08-20T17:35:04.753Z
c - 2024-08-20T17:35:03.748Z - 2024-08-20T17:35:03.748Z
com.google.common.jimfs.JimfsFileSystem@1198b989
a - 2024-08-20T17:35:04.767Z - 2024-08-20T17:35:06.769316Z
b - 2024-08-20T17:35:06.769Z - 2024-08-20T17:35:06.769Z
c - 2024-08-20T17:35:05.768Z - 2024-08-20T17:35:05.768Z
com.google.common.jimfs.JimfsFileSystem@78dd667e
a - 1970-01-01T00:00:00.005Z - 2024-08-20T17:35:08.79657Z
b - 1970-01-01T00:00:00.009Z - 1970-01-01T00:00:00.009Z
c - 1970-01-01T00:00:00.007Z - 1970-01-01T00:00:00.007Z

$ sdk use java 11.0.24-tem
$ java --version
openjdk 11.0.24 2024-07-16
OpenJDK Runtime Environment Temurin-11.0.24+8 (build 11.0.24+8)
OpenJDK 64-Bit Server VM Temurin-11.0.24+8 (build 11.0.24+8, mixed mode)
$ javac -cp "guava-32.1.1-jre.jar:jimfs-1.3.0.jar" JimfsTest.java
$ java -cp ".:guava-32.1.1-jre.jar:jimfs-1.3.0.jar" JimfsTest
sun.nio.fs.MacOSXFileSystem@57175e74
a - 2024-08-20T17:36:20Z - 2024-08-20T17:36:22.960207Z
c - 2024-08-20T17:36:21Z - 2024-08-20T17:36:21.954277Z
b - 2024-08-20T17:36:22Z - 2024-08-20T17:36:22.957319Z
com.google.common.jimfs.JimfsFileSystem@258e2e41
a - 2024-08-20T17:36:23.003Z - 2024-08-20T17:36:25.009945Z
b - 2024-08-20T17:36:25.009Z - 2024-08-20T17:36:25.009Z
c - 2024-08-20T17:36:24.007Z - 2024-08-20T17:36:24.007Z
com.google.common.jimfs.JimfsFileSystem@4b44655e
a - 2024-08-20T17:36:25.023Z - 2024-08-20T17:36:27.030574Z
b - 2024-08-20T17:36:27.03Z - 2024-08-20T17:36:27.03Z
c - 2024-08-20T17:36:26.027Z - 2024-08-20T17:36:26.027Z
com.google.common.jimfs.JimfsFileSystem@27c86f2d
a - 1970-01-01T00:00:00.005Z - 2024-08-20T17:36:29.039141Z
b - 1970-01-01T00:00:00.009Z - 1970-01-01T00:00:00.009Z
c - 1970-01-01T00:00:00.007Z - 1970-01-01T00:00:00.007Z

$ sdk use java 8.0.422-tem
$ java -version
openjdk version "1.8.0_422"
OpenJDK Runtime Environment (Temurin)(build 1.8.0_422-b05)
OpenJDK 64-Bit Server VM (Temurin)(build 25.422-b05, mixed mode)
$ javac -cp "guava-32.1.1-jre.jar:jimfs-1.3.0.jar" JimfsTest.java
$ java -cp ".:guava-32.1.1-jre.jar:jimfs-1.3.0.jar" JimfsTest
sun.nio.fs.MacOSXFileSystem@1517365b
a - 2024-08-20T17:36:49Z - 2024-08-20T17:36:52Z
c - 2024-08-20T17:36:51Z - 2024-08-20T17:36:51Z
b - 2024-08-20T17:36:52Z - 2024-08-20T17:36:52Z
com.google.common.jimfs.JimfsFileSystem@5a01ccaa
a - 2024-08-20T17:36:52.137Z - 2024-08-20T17:36:54.149Z
b - 2024-08-20T17:36:54.149Z - 2024-08-20T17:36:54.149Z
c - 2024-08-20T17:36:53.146Z - 2024-08-20T17:36:53.146Z
com.google.common.jimfs.JimfsFileSystem@58ceff1
a - 2024-08-20T17:36:54.163Z - 2024-08-20T17:36:56.169Z
b - 2024-08-20T17:36:56.169Z - 2024-08-20T17:36:56.169Z
c - 2024-08-20T17:36:55.165Z - 2024-08-20T17:36:55.165Z
com.google.common.jimfs.JimfsFileSystem@6a5fc7f7
a - 1970-01-01T00:00:00.005Z - 2024-08-20T17:36:58.266Z
b - 1970-01-01T00:00:00.009Z - 1970-01-01T00:00:00.009Z
c - 1970-01-01T00:00:00.007Z - 1970-01-01T00:00:00.007Z
```

### Linux

```shell
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 12 (bookworm)
Release: 12
Codename: bookworm

$ java --version
openjdk 21.0.4 2024-07-16 LTS
OpenJDK Runtime Environment Temurin-21.0.4+7 (build 21.0.4+7-LTS)
OpenJDK 64-Bit Server VM Temurin-21.0.4+7 (build 21.0.4+7-LTS, mixed mode, sharing)
$ java -cp "guava-32.1.1-jre.jar:jimfs-1.3.0.jar" JimfsTest.java
sun.nio.fs.LinuxFileSystem@2d52216b
a - 2024-08-20T17:32:38.733978788Z - 2024-08-20T17:32:40.73833389Z
b - 2024-08-20T17:32:40.73397506Z - 2024-08-20T17:32:40.73397506Z
c - 2024-08-20T17:32:39.733976868Z - 2024-08-20T17:32:39.733976868Z
com.google.common.jimfs.JimfsFileSystem@65c7a252
a - 2024-08-20T17:32:40.752Z - 2024-08-20T17:32:42.757084793Z
b - 2024-08-20T17:32:42.757Z - 2024-08-20T17:32:42.757Z
c - 2024-08-20T17:32:41.755Z - 2024-08-20T17:32:41.755Z
com.google.common.jimfs.JimfsFileSystem@5b1669c0
a - 2024-08-20T17:32:42.764Z - 2024-08-20T17:32:44.7660104Z
b - 2024-08-20T17:32:44.765Z - 2024-08-20T17:32:44.765Z
c - 2024-08-20T17:32:43.764Z - 2024-08-20T17:32:43.764Z
com.google.common.jimfs.JimfsFileSystem@470734c3
a - 1970-01-01T00:00:00.005Z - 2024-08-20T17:32:46.771503266Z
b - 1970-01-01T00:00:00.009Z - 1970-01-01T00:00:00.009Z
c - 1970-01-01T00:00:00.007Z - 1970-01-01T00:00:00.007Z
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.