Skip to content

Commit c57eb22

Browse files
committed
is_readable,is_writable: default use Java true
1 parent 9be9352 commit c57eb22

File tree

5 files changed

+64
-23
lines changed

5 files changed

+64
-23
lines changed

+stdlib/absolute.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
p (1,1) string
2222
base (1,1) string = ""
2323
expand_tilde (1,1) logical = true
24-
use_java (1,1) logical = true
24+
use_java (1,1) logical = false
2525
end
2626

2727
if expand_tilde

+stdlib/is_readable.m

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,35 @@
55
function ok = is_readable(file, use_java)
66
arguments
77
file (1,1) string
8-
use_java (1,1) logical = false
8+
use_java (1,1) logical = true
99
end
1010

11+
ok = false;
12+
if ~stdlib.exists(file, use_java), return, end
13+
% exists() check speeds up by factor of 50x on macOS for Java or non-Java
14+
1115
if use_java
12-
% java is about 10x slower than fileattrib
16+
% https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/nio/file/Files.html#isReadable(java.nio.file.Path)
17+
% java.nio.file.Files is about 10x slower than fileattrib
1318
% needs absolute()
14-
file = stdlib.absolute(file, "", false, use_java);
19+
% file = stdlib.absolute(file, "", false, true);
20+
% ok = java.nio.file.Files.isReadable(java.io.File(file).toPath());
21+
try
22+
ok = java.io.File(file).canRead();
23+
catch e
24+
if strcmp(e.identifier, "Octave:undefined-function")
25+
ok = javaObject("java.io.File", file).canRead();
26+
else
27+
rethrow(e);
28+
end
29+
end
1530

16-
% https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/nio/file/Files.html#isReadable(java.nio.file.Path)
17-
%ok = java.nio.file.Files.isReadable(java.io.File(file).toPath());
31+
else % use_java
1832

19-
% java.io.File().canRead() is about twice as fast as
20-
% java.nio.file.Files.isReadable()
21-
ok = java.io.File(file).canRead();
22-
else
23-
[status, v] = fileattrib(file);
33+
[status, v] = fileattrib(file);
34+
35+
ok = status ~= 0 && (v.UserRead || (~isnan(v.GroupRead) && v.GroupRead) || (~isnan(v.OtherRead) && v.OtherRead));
2436

25-
ok = status ~= 0 && (v.UserRead || (~isnan(v.GroupRead) && v.GroupRead) || (~isnan(v.OtherRead) && v.OtherRead));
2637
end
2738

2839
end

+stdlib/is_writable.m

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,37 @@
55
function ok = is_writable(file, use_java)
66
arguments
77
file (1,1) string
8-
use_java (1,1) logical = false
8+
use_java (1,1) logical = true
99
end
1010

11+
ok = false;
12+
if ~stdlib.exists(file, use_java), return, end
13+
% exists() check speeds up by factor of 50x on macOS for Java or non-Java
1114

12-
if use_java
13-
% java is about 10x slower than fileattrib
14-
% needs absolute()
15-
file = stdlib.absolute(file, "", false, true);
1615

16+
if use_java
1717
% https://docs.oracle.com/en/java/javase/22/docs/api/java.base/java/nio/file/Files.html#isWritable(java.nio.file.Path)
18-
%ok = java.nio.file.Files.isWritable(java.io.File(file).toPath());
18+
% java.nio.file.Files java is about 10x slower than fileattrib
19+
% needs absolute()
20+
% file = stdlib.absolute(file, "", false, true);
21+
% ok = java.nio.file.Files.isWritable(java.io.File(file).toPath());
1922

20-
% java.io.File().canWrite() is about twice as fast
23+
try
2124
ok = java.io.File(file).canWrite();
25+
catch e
26+
if strcmp(e.identifier, "Octave:undefined-function")
27+
ok = javaObject("java.io.File", file).canWrite();
28+
else
29+
rethrow(e);
30+
end
31+
end
32+
2233
else
23-
[status, v] = fileattrib(file);
2434

25-
ok = status ~= 0 && (v.UserWrite || (~isnan(v.GroupWrite) && v.GroupWrite) || (~isnan(v.OtherWrite) && v.OtherWrite));
35+
[status, v] = fileattrib(file);
36+
37+
ok = status ~= 0 && (v.UserWrite || (~isnan(v.GroupWrite) && v.GroupWrite) || (~isnan(v.OtherWrite) && v.OtherWrite));
38+
2639
end
2740

2841
end

example/bench_is_writable.m

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
%% benchmark
2+
3+
f = mfilename("fullpath") + ".m";
4+
addpath(fullfile(fileparts(f), ".."))
5+
6+
%f = tempname;
7+
8+
fno = @() stdlib.is_writable(f, false);
9+
fjava = @() stdlib.is_writable(f, true);
10+
11+
t_no = timeit(fno);
12+
t_java = timeit(fjava);
13+
14+
disp("No Java: " + t_no + " s")
15+
disp("Java: " + t_java + " s")
16+
17+
disp("Java is " + t_no/t_java + " times faster")

test/TestFileImpure.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,12 @@ function test_file_size(tc)
3030

3131

3232
function test_is_readable(tc, p_exists)
33-
tc.verifyEqual(stdlib.is_readable(p_exists{1}), p_exists{2})
33+
tc.verifyEqual(stdlib.is_readable(p_exists{1}, stdlib.has_java()), p_exists{2})
3434
end
3535

3636

3737
function test_is_writable(tc, p_is_writable)
38-
tc.verifyEqual(stdlib.is_writable(p_is_writable{1}), p_is_writable{2})
38+
tc.verifyEqual(stdlib.is_writable(p_is_writable{1}, stdlib.has_java()), p_is_writable{2})
3939
end
4040

4141

0 commit comments

Comments
 (0)