是否有一个API来获取类路径资源(例如我得到的Class.getResource(String))作为一个java.nio.file.Path?理想情况下,我想使用奇特的新Path API和类路径资源.
我有一个文件,我通过以下方法读入List:
List<String> doc = java.nio.file.Files.readAllLines(new File("/path/to/src/resources/citylist.csv").toPath(), StandardCharsets.UTF_8);
是否有任何好的(单行)Java 7/8/nio2方法可以使用可执行Jar内的文件(并且可能必须使用InputStream读取)来实现相同的功能?也许是通过类加载器打开InputStream的方法,然后以某种方式强制/转换/将其包装到Path对象中?或者是一些包含与File.readAllLines(...)等效的InputStream或Reader的新子类?
我知道我可以用半页代码中的传统方式,或者通过一些外部库来实现......但在此之前,我想确保最近发布的Java不能"开箱即用" ".
我正在编写一个跨平台的应用程序,它创建临时文件并将这些文件复制到另一个位置,每个人都需要这些文件.(默认情况下,只有所有者对临时文件具有读访问权.)我尝试使用POSIX文件权限,如下所示:
FileAttribute<Set<PosixFilePermission>> attrs =
  PosixFilePermissions.asFileAttribute(PosixFilePermissions.fromString("rw-r--r--"));
Path temp = Files.createTempFile(null, ".tmp", attrs);
但这会导致非POSIX平台出现异常:
java.lang.UnsupportedOperationException: 'posix:permissions' not supported as initial attribute
我想添加一个简单的检查,以便我可以在必要时使用文件权限,而不会破坏与其他平台的兼容性.
我Files.WalkFileTree()用来导航文件夹和计算音频文件,但遇到tar文件时出现问题,它似乎将它视为一个实际的文件夹我期望它只是跳过它.
我看不到任何让我控制这种行为的选项
码:
package com.jthink.songkong.fileloader;
import com.jthink.songkong.cmdline.SongKong;
import com.jthink.songkong.ui.MainWindow;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.concurrent.Callable;
import java.util.logging.Level;
/**
 * Count the number of files that can be loaded, for information purposes only
 */
public class CountFilesinFolder implements Callable<Boolean> {
    public static class CountFiles
            extends SimpleFileVisitor<Path> {
        private int fileCount = 0;
        private final PathMatcher matcher;
        CountFiles(String pattern) {
            matcher =
                    FileSystems.getDefault()
                            .getPathMatcher("regex:" + pattern);
        }
        /**
         * Find Music file
         *
         * @param file
         * @param attr
         * …我有一些用Java 6编写的文件I/0遍历代码,试图将它移动到Java 7中的新I/O但我找不到任何替代这种东西.
File[] files = dir.listFiles(AudioFileFilter.getInstance());
即,没有办法只过滤路径文件,它返回文件列表,所以我必须将每个文件转换为路径(file.toPath),如果我想限制在它调用的方法中使用File,这似乎相当费力.
我确实看过FileVisitor,但这似乎不允许你控制树的遍历方式,所以我认为它不会对我有用.
那么Java 7中的Path for File有多少替代品呢?
是否有一种简洁,惯用的方式(可能使用Apache Commons)来指定OpenOption的常见组合 StandardOpenOption.WRITE, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING
我正在研究Java NIO.2及其文件操作,目前我正在使用filetree-walking函数和类.
NIO.2 FileVisitorAPI非常棒,很遗憾,最近才将这种东西添加到Java SE中,而不是十年前.然而,有些东西让我感到困扰:制作FileVisitor界面通用的重点是什么?
网上的每个例子都显示了如何使用它,Files.walkFileTree()这意味着我们正在使用FileVisitor<Path>类型.但我只是看不到任何用于此接口的用途Path.好吧,有可能用它FileVisitor来走其他类型的树(内存中的那些?),但这感觉不对:这个接口和相关的类在语义上与文件绑定了非常具体的名称,还有FileVisitor方法扔IOException秒.
那么,参数化FileVisitor类型有什么原因吗?
我正试图找到一种方法来检测闪存驱动器何时插入我的计算机.到目前为止,我发现的解决方案是轮询FileSystem#getFileStores更改.这确实告诉我什么时候插入了闪存驱动器,但据我所知,没有办法检索它的位置.FileStore#type并且FileStore#name它们看起来都非常不可靠,因为它们的返回值是特定于实现的,但它们似乎是唯一可能返回任何可能有助于查找目录的相关信息的方法FileStore.
考虑到这一点,以下代码:
public class Test {
    public static void main(String[] args) throws IOException {
        for (FileStore store : FileSystems.getDefault().getFileStores()) {
            System.out.println(store);
            System.out.println("\t" + store.name());
            System.out.println("\t" + store.type());
            System.out.println();
        }
    }
}
给我这个输出:
/ (/dev/sda5)
    /dev/sda5
    ext4
/* snip */
/media/TI103426W0D (/dev/sda2)
    /dev/sda2
    fuseblk
/media/flashdrive (/dev/sdb1)
    /dev/sdb1
    vfat
事实证明,FileStore#type返回驱动器的格式并FileStore#name返回驱动器的设备文件的位置.据我所知,唯一具有驱动器位置的toString方法是方法,但从中提取路径名称似乎很危险,因为我不确定该特定解决方案在其他操作系统上的表现如何Java的未来版本.
有没有我在这里缺少的东西,或者纯粹用Java是不可能的?
系统信息:
$ java -version
java version "1.7.0_03"
OpenJDK Runtime Environment (IcedTea7 2.1.1pre) (7~u3-2.1.1~pre1-1ubuntu2)
OpenJDK Client VM (build …在NIO2上可用的INTERNET上的所有源/样本都没有TLS/SSL支持,
java.nio.channels.AsynchronousSocketChannel
java.nio.channels.AsynchronousServerSocketChannel
据我所知,连接的SSLEngine生命周期与AsynchronousSocketChannel.connect && AsynchronousServerSocketChanne.accept不同,TLS/SSL应该封装在AIO实现中,所以如何才能使用它们?注意:我在Grizzly项目中是一个视频,谈论他们已经实现了它,我查看了源代码,但是我看到了AIO而不是TLS/SSL集成......
提前致谢!
我不知道在哪里寻求有关Java API文档和Java代码的澄清和确认,所以我在这里做.
在API文档中FileChannel,我发现在一个以上的地方提交文件position和文件的一个一个错误size.
这只是一个例子.transferFrom(...)州的API文件:
"如果给定位置大于文件的当前大小,则不传输任何字节."
我确认OpenJDK代码也包含此代码...
public long transferFrom(ReadableByteChannel src, long position, long count)
    throws IOException
{
    // ...
    if (position > size())
        return 0;
    // ...
}
...在FileChannelImpl.java与文档一致的文件中.
现在,虽然上面的代码片段和API文档看起来相互一致,但我觉得"上面应该'大于或等于'而不仅仅是'大于',因为position它是一个基于0的文件数据索引,阅读时position == size()将没有数据返回给来电者!(position == size() - 1至少1个字节 - 文件的最后一个字节 - 可以返回给调用者.)
以下是同一API文档页面中的其他类似实例:
position(...):"将位置设置为大于文件当前大小的值是合法的,但不会更改文件的大小." (应该是'大于或等于'.)
transferTo(...):"如果给定位置大于文件的当前大小,则不传输任何字节."   (应该是'大于或等于'.)
read(...):"如果给定位置 …