View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  package org.apache.commons.io.file;
19  
20  import java.io.BufferedReader;
21  import java.io.BufferedWriter;
22  import java.io.IOException;
23  import java.io.InputStream;
24  import java.io.OutputStream;
25  import java.io.Reader;
26  import java.io.UncheckedIOException;
27  import java.nio.channels.SeekableByteChannel;
28  import java.nio.charset.Charset;
29  import java.nio.file.CopyOption;
30  import java.nio.file.DirectoryStream;
31  import java.nio.file.FileStore;
32  import java.nio.file.FileVisitOption;
33  import java.nio.file.FileVisitor;
34  import java.nio.file.Files;
35  import java.nio.file.LinkOption;
36  import java.nio.file.OpenOption;
37  import java.nio.file.Path;
38  import java.nio.file.attribute.BasicFileAttributes;
39  import java.nio.file.attribute.FileAttribute;
40  import java.nio.file.attribute.FileTime;
41  import java.nio.file.attribute.PosixFilePermission;
42  import java.nio.file.attribute.UserPrincipal;
43  import java.util.List;
44  import java.util.Map;
45  import java.util.Set;
46  import java.util.function.BiPredicate;
47  import java.util.stream.Stream;
48  
49  import org.apache.commons.io.function.Uncheck;
50  
51  /**
52   * Delegates to {@link Files} to uncheck calls by throwing {@link UncheckedIOException} instead of {@link IOException}.
53   *
54   * @see Files
55   * @see IOException
56   * @see UncheckedIOException
57   * @since 2.12.0
58   */
59  public final class FilesUncheck {
60  
61      /**
62       * Delegates to {@link Files#copy(InputStream, Path, CopyOption...)} throwing {@link UncheckedIOException} instead of
63       * {@link IOException}.
64       *
65       * @param in See delegate.
66       * @param target See delegate.
67       * @param options See delegate.
68       * @return See delegate.
69       * @throws UncheckedIOException Wraps an {@link IOException}.
70       * @see Files#copy(InputStream, Path,CopyOption...)
71       */
72      public static long copy(final InputStream in, final Path target, final CopyOption... options) {
73          return Uncheck.apply(Files::copy, in, target, options);
74      }
75  
76      /**
77       * Delegates to {@link Files#copy(Path, OutputStream)} throwing {@link UncheckedIOException} instead of
78       * {@link IOException}.
79       *
80       * @param source See delegate. See delegate.
81       * @param out See delegate. See delegate.
82       * @return See delegate. See delegate.
83       * @throws UncheckedIOException Wraps an {@link IOException}.
84       */
85      public static long copy(final Path source, final OutputStream out) {
86          return Uncheck.apply(Files::copy, source, out);
87      }
88  
89      /**
90       * Delegates to {@link Files#copy(Path, Path, CopyOption...)} throwing {@link UncheckedIOException} instead of
91       * {@link IOException}.
92       *
93       * @param source See delegate.
94       * @param target See delegate.
95       * @param options See delegate.
96       * @return See delegate.
97       * @throws UncheckedIOException Wraps an {@link IOException}.
98       */
99      public static Path copy(final Path source, final Path target, final CopyOption... options) {
100         return Uncheck.apply(Files::copy, source, target, options);
101     }
102 
103     /**
104      * Delegates to {@link Files#createDirectories(Path, FileAttribute...)} throwing {@link UncheckedIOException} instead of
105      * {@link IOException}.
106      *
107      * @param dir See delegate.
108      * @param attrs See delegate.
109      * @return See delegate.
110      * @throws UncheckedIOException Wraps an {@link IOException}.
111      */
112     public static Path createDirectories(final Path dir, final FileAttribute<?>... attrs) {
113         return Uncheck.apply(Files::createDirectories, dir, attrs);
114     }
115 
116     /**
117      * Delegates to {@link Files#createDirectory(Path, FileAttribute...)} throwing {@link UncheckedIOException} instead of
118      * {@link IOException}.
119      *
120      * @param dir See delegate.
121      * @param attrs See delegate.
122      * @return See delegate.
123      * @throws UncheckedIOException Wraps an {@link IOException}.
124      */
125     public static Path createDirectory(final Path dir, final FileAttribute<?>... attrs) {
126         return Uncheck.apply(Files::createDirectory, dir, attrs);
127     }
128 
129     /**
130      * Delegates to {@link Files#createFile(Path, FileAttribute...)} throwing {@link UncheckedIOException} instead of
131      * {@link IOException}.
132      *
133      * @param path See delegate.
134      * @param attrs See delegate.
135      * @return See delegate.
136      * @throws UncheckedIOException Wraps an {@link IOException}.
137      */
138     public static Path createFile(final Path path, final FileAttribute<?>... attrs) {
139         return Uncheck.apply(Files::createFile, path, attrs);
140     }
141 
142     /**
143      * Delegates to {@link Files#createLink(Path, Path)} throwing {@link UncheckedIOException} instead of
144      * {@link IOException}.
145      *
146      * @param link See delegate.
147      * @param existing See delegate.
148      * @return See delegate.
149      * @throws UncheckedIOException Wraps an {@link IOException}.
150      */
151     public static Path createLink(final Path link, final Path existing) {
152         return Uncheck.apply(Files::createLink, link, existing);
153     }
154 
155     /**
156      * Delegates to {@link Files#createSymbolicLink(Path, Path, FileAttribute...)} throwing {@link UncheckedIOException}
157      * instead of {@link IOException}.
158      *
159      * @param link See delegate.
160      * @param target See delegate.
161      * @param attrs See delegate.
162      * @return See delegate.
163      * @throws UncheckedIOException Wraps an {@link IOException}.
164      */
165     public static Path createSymbolicLink(final Path link, final Path target, final FileAttribute<?>... attrs) {
166         return Uncheck.apply(Files::createSymbolicLink, link, target, attrs);
167     }
168 
169     /**
170      * Delegates to {@link Files#createTempDirectory(Path, String, FileAttribute...)} throwing {@link UncheckedIOException}
171      * instead of {@link IOException}.
172      *
173      * @param dir See delegate.
174      * @param prefix See delegate.
175      * @param attrs See delegate.
176      * @return See delegate.
177      * @throws UncheckedIOException Wraps an {@link IOException}.
178      */
179     public static Path createTempDirectory(final Path dir, final String prefix, final FileAttribute<?>... attrs) {
180         return Uncheck.apply(Files::createTempDirectory, dir, prefix, attrs);
181     }
182 
183     /**
184      * Delegates to {@link Files#createTempDirectory(String, FileAttribute...)} throwing {@link UncheckedIOException}
185      * instead of {@link IOException}.
186      *
187      * @param prefix See delegate.
188      * @param attrs See delegate.
189      * @return See delegate.
190      * @throws UncheckedIOException Wraps an {@link IOException}.
191      */
192     public static Path createTempDirectory(final String prefix, final FileAttribute<?>... attrs) {
193         return Uncheck.apply(Files::createTempDirectory, prefix, attrs);
194     }
195 
196     /**
197      * Delegates to {@link Files#createTempFile(Path, String, String, FileAttribute...)} throwing
198      * {@link UncheckedIOException} instead of {@link IOException}.
199      *
200      * @param dir See delegate.
201      * @param prefix See delegate.
202      * @param suffix See delegate.
203      * @param attrs See delegate.
204      * @return See delegate.
205      * @throws UncheckedIOException Wraps an {@link IOException}.
206      */
207     public static Path createTempFile(final Path dir, final String prefix, final String suffix, final FileAttribute<?>... attrs) {
208         return Uncheck.apply(Files::createTempFile, dir, prefix, suffix, attrs);
209     }
210 
211     /**
212      * Delegates to {@link Files#createTempFile(String, String, FileAttribute...)} throwing {@link UncheckedIOException}
213      * instead of {@link IOException}.
214      *
215      * @param prefix See delegate.
216      * @param suffix See delegate.
217      * @param attrs See delegate.
218      * @return See delegate.
219      * @throws UncheckedIOException Wraps an {@link IOException}.
220      */
221     public static Path createTempFile(final String prefix, final String suffix, final FileAttribute<?>... attrs) {
222         return Uncheck.apply(Files::createTempFile, prefix, suffix, attrs);
223     }
224 
225     /**
226      * Delegates to {@link Files#delete(Path)} throwing {@link UncheckedIOException} instead of {@link IOException}.
227      *
228      * @param path See delegate.
229      * @throws UncheckedIOException Wraps an {@link IOException}.
230      */
231     public static void delete(final Path path) {
232         Uncheck.accept(Files::delete, path);
233     }
234 
235     /**
236      * Delegates to {@link Files#deleteIfExists(Path)} throwing {@link UncheckedIOException} instead of {@link IOException}.
237      *
238      * @param path See delegate.
239      * @return See delegate.
240      * @throws UncheckedIOException Wraps an {@link IOException}.
241      */
242     public static boolean deleteIfExists(final Path path) {
243         return Uncheck.apply(Files::deleteIfExists, path);
244     }
245 
246     /**
247      * Delegates to {@link Files#find(Path, int, BiPredicate, FileVisitOption...)} throwing {@link UncheckedIOException} instead of {@link IOException}.
248      * <p>
249      * The returned {@link Stream} wraps a {@link DirectoryStream}. When you require timely disposal of file system resources, use a {@code try}-with-resources
250      * block to ensure invocation of the stream's {@link Stream#close()} method after the stream operations are completed.
251      * </p>
252      *
253      * @param start    See delegate.
254      * @param maxDepth See delegate.
255      * @param matcher  See delegate.
256      * @param options  See delegate.
257      * @return See delegate.
258      * @throws UncheckedIOException Wraps an {@link IOException}.
259      * @since 2.14.0
260      */
261     public static Stream<Path> find(final Path start, final int maxDepth, final BiPredicate<Path, BasicFileAttributes> matcher,
262             final FileVisitOption... options) {
263         return Uncheck.apply(Files::find, start, maxDepth, matcher, options);
264     }
265 
266     /**
267      * Delegates to {@link Files#getAttribute(Path, String, LinkOption...)} throwing {@link UncheckedIOException} instead of
268      * {@link IOException}.
269      *
270      * @param path See delegate.
271      * @param attribute See delegate.
272      * @param options See delegate.
273      * @return See delegate.
274      * @throws UncheckedIOException Wraps an {@link IOException}.
275      */
276     public static Object getAttribute(final Path path, final String attribute, final LinkOption... options) {
277         return Uncheck.apply(Files::getAttribute, path, attribute, options);
278     }
279 
280     /**
281      * Delegates to {@link Files#getFileStore(Path)} throwing {@link UncheckedIOException} instead of {@link IOException}.
282      *
283      * @param path See delegate.
284      * @return See delegate.
285      * @throws UncheckedIOException Wraps an {@link IOException}.
286      */
287     public static FileStore getFileStore(final Path path) {
288         return Uncheck.apply(Files::getFileStore, path);
289     }
290 
291     /**
292      * Delegates to {@link Files#getLastModifiedTime(Path, LinkOption...)} throwing {@link UncheckedIOException} instead of
293      * {@link IOException}.
294      *
295      * @param path See delegate.
296      * @param options See delegate.
297      * @return See delegate.
298      * @throws UncheckedIOException Wraps an {@link IOException}.
299      */
300     public static FileTime getLastModifiedTime(final Path path, final LinkOption... options) {
301         return Uncheck.apply(Files::getLastModifiedTime, path, options);
302     }
303 
304     /**
305      * Delegates to {@link Files#getOwner(Path, LinkOption...)} throwing {@link UncheckedIOException} instead of
306      * {@link IOException}.
307      *
308      * @param path See delegate.
309      * @param options See delegate.
310      * @return See delegate.
311      * @throws UncheckedIOException Wraps an {@link IOException}.
312      */
313     public static UserPrincipal getOwner(final Path path, final LinkOption... options) {
314         return Uncheck.apply(Files::getOwner, path, options);
315     }
316 
317     /**
318      * Delegates to {@link Files#getPosixFilePermissions(Path, LinkOption...)} throwing {@link UncheckedIOException} instead
319      * of {@link IOException}.
320      *
321      * @param path See delegate.
322      * @param options See delegate.
323      * @return See delegate.
324      * @throws UncheckedIOException Wraps an {@link IOException}.
325      */
326     public static Set<PosixFilePermission> getPosixFilePermissions(final Path path, final LinkOption... options) {
327         return Uncheck.apply(Files::getPosixFilePermissions, path, options);
328     }
329 
330     /**
331      * Delegates to {@link Files#isHidden(Path)} throwing {@link UncheckedIOException} instead of {@link IOException}.
332      *
333      * @param path See delegate.
334      * @return See delegate.
335      * @throws UncheckedIOException Wraps an {@link IOException}.
336      */
337     public static boolean isHidden(final Path path) {
338         return Uncheck.apply(Files::isHidden, path);
339     }
340 
341     /**
342      * Delegates to {@link Files#isSameFile(Path, Path)} throwing {@link UncheckedIOException} instead of
343      * {@link IOException}.
344      *
345      * @param path See delegate.
346      * @param path2 See delegate.
347      * @return See delegate.
348      * @throws UncheckedIOException Wraps an {@link IOException}.
349      */
350     public static boolean isSameFile(final Path path, final Path path2) {
351         return Uncheck.apply(Files::isSameFile, path, path2);
352     }
353 
354     /**
355      * Delegates to {@link Files#lines(Path)} throwing {@link UncheckedIOException} instead of {@link IOException}.
356      * <p>
357      * The returned {@link Stream} wraps a {@link Reader}. When you require timely disposal of file system resources, use a {@code try}-with-resources block to
358      * ensure invocation of the stream's {@link Stream#close()} method after the stream operations are completed.
359      * </p>
360      *
361      * @param path See delegate.
362      * @return See delegate.
363      * @throws UncheckedIOException Wraps an {@link IOException}.
364      */
365     public static Stream<String> lines(final Path path) {
366         return Uncheck.apply(Files::lines, path);
367     }
368 
369     /**
370      * Delegates to {@link Files#lines(Path, Charset)} throwing {@link UncheckedIOException} instead of {@link IOException}.
371      * <p>
372      * The returned {@link Stream} wraps a {@link Reader}. When you require timely disposal of file system resources, use a {@code try}-with-resources block to
373      * ensure invocation of the stream's {@link Stream#close()} method after the stream operations are completed.
374      * </p>
375      *
376      * @param path See delegate.
377      * @param cs See delegate.
378      * @return See delegate.
379      * @throws UncheckedIOException Wraps an {@link IOException}.
380      */
381     public static Stream<String> lines(final Path path, final Charset cs) {
382         return Uncheck.apply(Files::lines, path, cs);
383     }
384 
385     /**
386      * Delegates to {@link Files#list(Path)} throwing {@link UncheckedIOException} instead of {@link IOException}.
387      * <p>
388      * The returned {@link Stream} wraps a {@link DirectoryStream}. When you require timely disposal of file system resources, use a {@code try}-with-resources
389      * block to ensure invocation of the stream's {@link Stream#close()} method after the stream operations are completed.
390      * </p>
391      *
392      * @param dir See delegate.
393      * @return See delegate.
394      * @throws UncheckedIOException Wraps an {@link IOException}.
395      */
396     public static Stream<Path> list(final Path dir) {
397         return Uncheck.apply(Files::list, dir);
398     }
399 
400     /**
401      * Delegates to {@link Files#move(Path, Path, CopyOption...)} throwing {@link UncheckedIOException} instead of
402      * {@link IOException}.
403      *
404      * @param source See delegate.
405      * @param target See delegate.
406      * @param options See delegate.
407      * @return See delegate.
408      * @throws UncheckedIOException Wraps an {@link IOException}.
409      */
410     public static Path move(final Path source, final Path target, final CopyOption... options) {
411         return Uncheck.apply(Files::move, source, target, options);
412     }
413 
414     /**
415      * Delegates to {@link Files#newBufferedReader(Path)} throwing {@link UncheckedIOException} instead of
416      * {@link IOException}.
417      *
418      * @param path See delegate.
419      * @return See delegate.
420      * @throws UncheckedIOException Wraps an {@link IOException}.
421      */
422     public static BufferedReader newBufferedReader(final Path path) {
423         return Uncheck.apply(Files::newBufferedReader, path);
424     }
425 
426     /**
427      * Delegates to {@link Files#newBufferedReader(Path, Charset)} throwing {@link UncheckedIOException} instead of
428      * {@link IOException}.
429      *
430      * @param path See delegate.
431      * @param cs See delegate.
432      * @return See delegate.
433      * @throws UncheckedIOException Wraps an {@link IOException}.
434      */
435     public static BufferedReader newBufferedReader(final Path path, final Charset cs) {
436         return Uncheck.apply(Files::newBufferedReader, path, cs);
437     }
438 
439     /**
440      * Delegates to {@link Files#newBufferedWriter(Path, Charset, OpenOption...)} throwing {@link UncheckedIOException}
441      * instead of {@link IOException}.
442      *
443      * @param path See delegate.
444      * @param cs See delegate.
445      * @param options See delegate.
446      * @return See delegate.
447      * @throws UncheckedIOException Wraps an {@link IOException}.
448      */
449     public static BufferedWriter newBufferedWriter(final Path path, final Charset cs, final OpenOption... options) {
450         return Uncheck.apply(Files::newBufferedWriter, path, cs, options);
451     }
452 
453     /**
454      * Delegates to {@link Files#newBufferedWriter(Path, OpenOption...)} throwing {@link UncheckedIOException} instead of
455      * {@link IOException}.
456      *
457      * @param path See delegate.
458      * @param options See delegate.
459      * @return See delegate.
460      * @throws UncheckedIOException Wraps an {@link IOException}.
461      */
462     public static BufferedWriter newBufferedWriter(final Path path, final OpenOption... options) {
463         return Uncheck.apply(Files::newBufferedWriter, path, options);
464     }
465 
466     /**
467      * Delegates to {@link Files#newByteChannel(Path, OpenOption...)} throwing {@link UncheckedIOException} instead of
468      * {@link IOException}.
469      *
470      * @param path See delegate.
471      * @param options See delegate.
472      * @return See delegate.
473      * @throws UncheckedIOException Wraps an {@link IOException}.
474      */
475     public static SeekableByteChannel newByteChannel(final Path path, final OpenOption... options) {
476         return Uncheck.apply(Files::newByteChannel, path, options);
477     }
478 
479     /**
480      * Delegates to {@link Files#newByteChannel(Path, Set, FileAttribute...)} throwing {@link UncheckedIOException} instead
481      * of {@link IOException}.
482      *
483      * @param path See delegate.
484      * @param options See delegate.
485      * @param attrs See delegate.
486      * @return See delegate.
487      * @throws UncheckedIOException Wraps an {@link IOException}.
488      */
489     public static SeekableByteChannel newByteChannel(final Path path, final Set<? extends OpenOption> options, final FileAttribute<?>... attrs) {
490         return Uncheck.apply(Files::newByteChannel, path, options, attrs);
491     }
492 
493     /**
494      * Delegates to {@link Files#newDirectoryStream(Path)} throwing {@link UncheckedIOException} instead of {@link IOException}.
495      * <p>
496      * If you don't use the try-with-resources construct, then you must call the stream's {@link Stream#close()} method after iteration is complete to free any
497      * resources held for the open directory.
498      * </p>
499      *
500      * @param dir See delegate.
501      * @return See delegate.
502      */
503     public static DirectoryStream<Path> newDirectoryStream(final Path dir) {
504         return Uncheck.apply(Files::newDirectoryStream, dir);
505     }
506 
507     /**
508      * Delegates to {@link Files#newDirectoryStream(Path, java.nio.file.DirectoryStream.Filter)} throwing {@link UncheckedIOException} instead of
509      * {@link IOException}.
510      * <p>
511      * If you don't use the try-with-resources construct, then you must call the stream's {@link Stream#close()} method after iteration is complete to free any
512      * resources held for the open directory.
513      * </p>
514      *
515      * @param dir    See delegate.
516      * @param filter See delegate.
517      * @return See delegate.
518      */
519     public static DirectoryStream<Path> newDirectoryStream(final Path dir, final DirectoryStream.Filter<? super Path> filter) {
520         return Uncheck.apply(Files::newDirectoryStream, dir, filter);
521     }
522 
523     /**
524      * Delegates to {@link Files#newDirectoryStream(Path, String)} throwing {@link UncheckedIOException} instead of
525      * {@link IOException}.
526      * <p>
527      * The returned {@link Stream} wraps a {@link DirectoryStream}. When you require timely disposal of file system resources, use a {@code try}-with-resources
528      * block to ensure invocation of the stream's {@link Stream#close()} method after the stream operations are completed.
529      * </p>
530      *
531      * @param dir See delegate.
532      * @param glob See delegate.
533      * @return See delegate.
534      */
535     public static DirectoryStream<Path> newDirectoryStream(final Path dir, final String glob) {
536         return Uncheck.apply(Files::newDirectoryStream, dir, glob);
537     }
538 
539     /**
540      * Delegates to {@link Files#newInputStream(Path, OpenOption...)} throwing {@link UncheckedIOException} instead of
541      * {@link IOException}.
542      *
543      * @param path See delegate.
544      * @param options See delegate.
545      * @return See delegate.
546      */
547     public static InputStream newInputStream(final Path path, final OpenOption... options) {
548         return Uncheck.apply(Files::newInputStream, path, options);
549     }
550 
551     /**
552      * Delegates to {@link Files#newOutputStream(Path, OpenOption...)} throwing {@link UncheckedIOException} instead of
553      * {@link IOException}.
554      *
555      * @param path See delegate.
556      * @param options See delegate.
557      * @return See delegate.
558      */
559     public static OutputStream newOutputStream(final Path path, final OpenOption... options) {
560         return Uncheck.apply(Files::newOutputStream, path, options);
561     }
562 
563     /**
564      * Delegates to {@link Files#probeContentType(Path)} throwing {@link UncheckedIOException} instead of
565      * {@link IOException}.
566      *
567      * @param path See delegate.
568      * @return See delegate.
569      */
570     public static String probeContentType(final Path path) {
571         return Uncheck.apply(Files::probeContentType, path);
572     }
573 
574     /**
575      * Delegates to {@link Files#readAllBytes(Path)} throwing {@link UncheckedIOException} instead of {@link IOException}.
576      *
577      * @param path See delegate.
578      * @return See delegate.
579      */
580     public static byte[] readAllBytes(final Path path) {
581         return Uncheck.apply(Files::readAllBytes, path);
582     }
583 
584     /**
585      * Delegates to {@link Files#readAllLines(Path)} throwing {@link UncheckedIOException} instead of {@link IOException}.
586      *
587      * @param path See delegate.
588      * @return See delegate.
589      */
590     public static List<String> readAllLines(final Path path) {
591         return Uncheck.apply(Files::readAllLines, path);
592     }
593 
594     /**
595      * Delegates to {@link Files#readAllLines(Path, Charset)} throwing {@link UncheckedIOException} instead of
596      * {@link IOException}.
597      *
598      * @param path See delegate.
599      * @param cs See delegate.
600      * @return See delegate.
601      */
602     public static List<String> readAllLines(final Path path, final Charset cs) {
603         return Uncheck.apply(Files::readAllLines, path, cs);
604     }
605 
606     /**
607      * Delegates to {@link Files#readAttributes(Path, Class, LinkOption...)} throwing {@link UncheckedIOException} instead
608      * of {@link IOException}.
609      *
610      * @param <A> See delegate.
611      * @param path See delegate.
612      * @param type See delegate.
613      * @param options See delegate.
614      * @return See delegate.
615      */
616     public static <A extends BasicFileAttributes> A readAttributes(final Path path, final Class<A> type, final LinkOption... options) {
617         return Uncheck.apply(Files::readAttributes, path, type, options);
618     }
619 
620     /**
621      * Delegates to {@link Files#readAttributes(Path, String, LinkOption...)} throwing {@link UncheckedIOException} instead
622      * of {@link IOException}.
623      *
624      * @param path See delegate.
625      * @param attributes See delegate.
626      * @param options See delegate.
627      * @return See delegate.
628      */
629     public static Map<String, Object> readAttributes(final Path path, final String attributes, final LinkOption... options) {
630         return Uncheck.apply(Files::readAttributes, path, attributes, options);
631     }
632 
633     /**
634      * Delegates to {@link Files#readSymbolicLink(Path)} throwing {@link UncheckedIOException} instead of
635      * {@link IOException}.
636      *
637      * @param link See delegate.
638      * @return See delegate.
639      */
640     public static Path readSymbolicLink(final Path link) {
641         return Uncheck.apply(Files::readSymbolicLink, link);
642     }
643 
644     /**
645      * Delegates to {@link Files#setAttribute(Path, String, Object, LinkOption...)} throwing {@link UncheckedIOException}
646      * instead of {@link IOException}.
647      *
648      * @param path See delegate.
649      * @param attribute See delegate.
650      * @param value See delegate.
651      * @param options See delegate.
652      * @return See delegate.
653      */
654     public static Path setAttribute(final Path path, final String attribute, final Object value, final LinkOption... options) {
655         return Uncheck.apply(Files::setAttribute, path, attribute, value, options);
656     }
657 
658     /**
659      * Delegates to {@link Files#setLastModifiedTime(Path, FileTime)} throwing {@link UncheckedIOException} instead of
660      * {@link IOException}.
661      *
662      * @param path See delegate.
663      * @param time See delegate.
664      * @return See delegate.
665      */
666     public static Path setLastModifiedTime(final Path path, final FileTime time) {
667         return Uncheck.apply(Files::setLastModifiedTime, path, time);
668     }
669 
670     /**
671      * Delegates to {@link Files#setOwner(Path, UserPrincipal)} throwing {@link UncheckedIOException} instead of
672      * {@link IOException}.
673      *
674      * @param path See delegate.
675      * @param owner See delegate.
676      * @return See delegate.
677      */
678     public static Path setOwner(final Path path, final UserPrincipal owner) {
679         return Uncheck.apply(Files::setOwner, path, owner);
680     }
681 
682     /**
683      * Delegates to {@link Files#setPosixFilePermissions(Path, Set)} throwing {@link UncheckedIOException} instead of
684      * {@link IOException}.
685      *
686      * @param path See delegate.
687      * @param perms See delegate.
688      * @return See delegate.
689      */
690     public static Path setPosixFilePermissions(final Path path, final Set<PosixFilePermission> perms) {
691         return Uncheck.apply(Files::setPosixFilePermissions, path, perms);
692     }
693 
694     /**
695      * Delegates to {@link Files#size(Path)} throwing {@link UncheckedIOException} instead of {@link IOException}.
696      *
697      * @param path See delegate.
698      * @return See delegate.
699      */
700     public static long size(final Path path) {
701         return Uncheck.apply(Files::size, path);
702     }
703 
704     /**
705      * Delegates to {@link Files#walk(Path, FileVisitOption...)} throwing {@link UncheckedIOException} instead of {@link IOException}.
706      * <p>
707      * The returned {@link Stream} may wrap one or more {@link DirectoryStream}s. When you require timely disposal of file system resources, use a
708      * {@code try}-with-resources block to ensure invocation of the stream's {@link Stream#close()} method after the stream operations are completed. Calling a
709      * closed stream causes a {@link IllegalStateException}.
710      * </p>
711      *
712      * @param start   See delegate.
713      * @param options See delegate.
714      * @return See delegate.
715      */
716     public static Stream<Path> walk(final Path start, final FileVisitOption... options) {
717         return Uncheck.apply(Files::walk, start, options);
718     }
719 
720     /**
721      * Delegates to {@link Files#walk(Path, int, FileVisitOption...)} throwing {@link UncheckedIOException} instead of {@link IOException}.
722      * <p>
723      * The returned {@link Stream} may wrap one or more {@link DirectoryStream}s. When you require timely disposal of file system resources, use a
724      * {@code try}-with-resources block to ensure invocation of the stream's {@link Stream#close()} method after the stream operations are completed. Calling a
725      * closed stream causes a {@link IllegalStateException}.
726      * </p>
727      *
728      * @param start    See delegate.
729      * @param maxDepth See delegate.
730      * @param options  See delegate.
731      * @return See delegate.
732      */
733     public static Stream<Path> walk(final Path start, final int maxDepth, final FileVisitOption... options) {
734         return Uncheck.apply(Files::walk, start, maxDepth, options);
735     }
736 
737     /**
738      * Delegates to {@link Files#walkFileTree(Path, FileVisitor)} throwing {@link UncheckedIOException} instead of
739      * {@link IOException}.
740      *
741      * @param start See delegate.
742      * @param visitor See delegate.
743      * @return See delegate.
744      */
745     public static Path walkFileTree(final Path start, final FileVisitor<? super Path> visitor) {
746         return Uncheck.apply(Files::walkFileTree, start, visitor);
747     }
748 
749     /**
750      * Delegates to {@link Files#walkFileTree(Path, Set, int, FileVisitor)} throwing {@link UncheckedIOException} instead of
751      * {@link IOException}.
752      *
753      * @param start See delegate.
754      * @param options See delegate.
755      * @param maxDepth See delegate.
756      * @param visitor See delegate.
757      * @return See delegate.
758      */
759     public static Path walkFileTree(final Path start, final Set<FileVisitOption> options, final int maxDepth, final FileVisitor<? super Path> visitor) {
760         return Uncheck.apply(Files::walkFileTree, start, options, maxDepth, visitor);
761     }
762 
763     /**
764      * Delegates to {@link Files#write(Path, byte[], OpenOption...)} throwing {@link UncheckedIOException} instead of
765      * {@link IOException}.
766      *
767      * @param path See delegate.
768      * @param bytes See delegate.
769      * @param options See delegate.
770      * @return See delegate.
771      */
772     public static Path write(final Path path, final byte[] bytes, final OpenOption... options) {
773         return Uncheck.apply(Files::write, path, bytes, options);
774     }
775 
776     /**
777      * Delegates to {@link Files#write(Path, Iterable, Charset, OpenOption...)} throwing {@link UncheckedIOException}
778      * instead of {@link IOException}.
779      *
780      * @param path See delegate.
781      * @param lines See delegate.
782      * @param cs See delegate.
783      * @param options See delegate.
784      * @return See delegate.
785      */
786     public static Path write(final Path path, final Iterable<? extends CharSequence> lines, final Charset cs, final OpenOption... options) {
787         return Uncheck.apply(Files::write, path, lines, cs, options);
788     }
789 
790     /**
791      * Delegates to {@link Files#write(Path, Iterable, OpenOption...)} throwing {@link UncheckedIOException} instead of
792      * {@link IOException}.
793      *
794      * @param path See delegate.
795      * @param lines See delegate.
796      * @param options See delegate.
797      * @return See delegate.
798      */
799     public static Path write(final Path path, final Iterable<? extends CharSequence> lines, final OpenOption... options) {
800         return Uncheck.apply(Files::write, path, lines, options);
801     }
802 
803     /**
804      * No instances.
805      */
806     private FilesUncheck() {
807         // No instances
808     }
809 }