标签: nio2

为什么不是java 7中的Files.readAllLines(String path)?

我正在尝试学习nio 2Java 7中的包,我偶然发现了这个Files.readAllLines(Path p, Charset cs)方法.我发现它非常有用,但我认为应该有一个没有cs参数的版本,就像:

 public static List<String> readAllLines(String path)
    throws IOException
{ return readAllLines(Paths.get(path), Charset.defaultCharset());}
Run Code Online (Sandbox Code Playgroud)

我确信无论如何大多数时候都会使用默认的Charset调用该方法,所以为什么没有shorcut.是否有任何关于charsets的遗漏可以证明没有这种方法?我很惊讶,因为Scala有这个选项:

Source.fromFile("fileName").getLines
Run Code Online (Sandbox Code Playgroud)

所以我不明白为什么Java不应该.任何意见?

java java-7 nio2

6
推荐指数
1
解决办法
1万
查看次数

Java 7的nio.file包在创建新文件时非常慢

我正在尝试从java程序创建300M文件,我从旧的文件API切换到新的java 7 nio包,但是新的包比旧的更慢.

我看到的CPU利用率低于使用旧文件API时的CPU利用率,但我正在运行这个简单的代码,我得到0.5Mbytes/sec的文件传输速率,而java的写入正在读取一个磁盘并写入另一个(写入是访问磁盘的唯一进程).

Files.write(FileSystems.getDefault().getPath(filePath), fiveToTenKBytes, StandardOpenOption.CREATE);
Run Code Online (Sandbox Code Playgroud)

有没有希望在这里获得合理的吞吐量?


更新:

我正在从大文件中解包3亿个5-10k字节的图像文件.我有3个磁盘,1个本地磁盘和2个SAN连接(大型文件的典型吞吐率约为20MB /秒).

我也尝试过这段代码,它将速度提高到不到2MB /秒的吞吐量(解压缩这些文件需要9天).

ByteBuffer byteBuffer = ByteBuffer.wrap(imageBinary, 0, (BytesWritable)value).getLength());
FileOutputStream fos = new FileOutputStream( imageFile );
fos.getChannel().write(byteBuffer);
fos.close();
Run Code Online (Sandbox Code Playgroud)

我从本地磁盘读取并写入SAN连接磁盘.我正在阅读Hadoop SequenceFile格式,hadoop通常能够使用基本相同的代码以20MB /秒的速度读取这些文件.

除了超级缓慢之外,唯一看起来不合适的是,我看到更多的读取IO比写入IO大约2:1,尽管序列文件是gziped(图像实际上比例为1:1),所以压缩文件应该是约.输出1:1.


第二次更新

看着iostat我看到一些奇怪的数字,我们在这里看xvdf,我有一个java进程读取xvdb和写入xvdf并且没有活动的ohter进程xvdf

iostat -d 30
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
xvdap1            1.37         5.60         4.13        168        124
xvdb             14.80       620.00         0.00      18600          0
xvdap3            0.00         0.00         0.00          0          0
xvdf            668.50      2638.40       282.27      79152       8468
xvdg           1052.70      3751.87      2315.47     112556      69464 …
Run Code Online (Sandbox Code Playgroud)

java file-io java-7 nio2

6
推荐指数
1
解决办法
1290
查看次数

按最大行分割非常大的文本文件

我想将包含字符串的大文件拆分成一组新的(较小的)文件并尝试使用nio2.

我不想将整个文件加载到内存中,所以我尝试使用BufferedReader.

较小的文本文件应受文本行数的限制.

该解决方案有效,但我想询问是否有人通过使用java 8(也许lamdas with stream() - api?)和nio2知道一个具有更好性能的解决方案:

public void splitTextFiles(Path bigFile, int maxRows) throws IOException{

        int i = 1;
        try(BufferedReader reader = Files.newBufferedReader(bigFile)){
            String line = null;
            int lineNum = 1;

            Path splitFile = Paths.get(i + "split.txt");
            BufferedWriter writer = Files.newBufferedWriter(splitFile, StandardOpenOption.CREATE);

            while ((line = reader.readLine()) != null) {

                if(lineNum > maxRows){
                    writer.close();
                    lineNum = 1;
                    i++;
                    splitFile = Paths.get(i + "split.txt");
                    writer = Files.newBufferedWriter(splitFile, StandardOpenOption.CREATE);
                }

                writer.append(line);
                writer.newLine();
                lineNum++;
            }

            writer.close();
        }
}
Run Code Online (Sandbox Code Playgroud)

java java-8 nio2

6
推荐指数
1
解决办法
4759
查看次数

如何检查该文件是否存在于 zip 存档中?

如何检查该文件是否存在于 zip 存档中?
例如,检查是否app.apk包含classes.dex.
我想找到一个使用 Java NIO.2Path并且尽可能不提取整个存档的解决方案。

我试过了,没有用:

Path classesFile = Paths.get("app.apk", "classes.dex");  // apk file with classes.dex
if (Files.exists(apkFile))  // false!
    ...
Run Code Online (Sandbox Code Playgroud)

java zip file-exists nio2

6
推荐指数
1
解决办法
5298
查看次数

WatchService有时会触发ENTRY_MODIFY两次,有时一次

我在WatchServiceOracle中使用这个例子:

import java.nio.file.*;
import static java.nio.file.StandardWatchEventKinds.*;
import static java.nio.file.LinkOption.*;
import java.nio.file.attribute.*;
import java.io.*;
import java.util.*;

public class WatchDir {

private final WatchService watcher;
private final Map<WatchKey,Path> keys;
private final boolean recursive;
private boolean trace = false;

@SuppressWarnings("unchecked")
static <T> WatchEvent<T> cast(WatchEvent<?> event) {
    return (WatchEvent<T>)event;
}

/**
 * Register the given directory with the WatchService
 */
private void register(Path dir) throws IOException {
    WatchKey key = dir.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
    if (trace) {
        Path prev = keys.get(key);
        if …
Run Code Online (Sandbox Code Playgroud)

java rhel watchservice nio2

6
推荐指数
1
解决办法
2502
查看次数

Files.walk.filter和Files.find有什么区别?

此代码搜索特定文件:

Stream<Path> findMyFile = Files.find(Paths.get("c:\\temp\\pathtest"), Integer.MAX_VALUE,(p, a) -> p.endsWith("test.txt") && a.isRegularFile());

Stream<Path> findMyFileSecond = Files.walk(Paths.get("c:\\temp\\pathtest"),Integer.MAX_VALUE).filter(p -> p.endsWith("test.txt"));

findMyFile.forEach(System.out::println);
findMyFileSecond.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

两个结果都包含相同的文件,两种方法几乎同时完成.JavaDoc说如下:

此方法以完全按*walkwalk方法指定的方式遍历文件树.比较调用*java.util.stream.Stream #filter过滤器对@ {walk walk}方法返回的Stream*,此方法可能是通过*避免重复检索BasicFileAttributes来提高效率

什么时候应该和什么时候walk结合使用?什么是最佳做法?filterfind

java file path nio2

6
推荐指数
1
解决办法
1712
查看次数

Java AsyncHttpClient: broken file while writing from LazyResponseBodyPart to AsynchronousFileChannel

I use AsyncHttpClient library for async non blocking requests. My case: write data to a file as it is received over the network.

For download file from remote host and save to file I used default ResponseBodyPartFactory.EAGER and AsynchronousFileChannel so as not to block the netty thread as data arrives. But as my measurements showed, in comparison with LAZY the memory consumption in the Java heap increases many times over.

So I decided to go straight to LAZY, but …

java asynchronous nio nio2 asynchttpclient

6
推荐指数
1
解决办法
187
查看次数

NIO2 CompletionHandler 的线程安全

以下代码是线程安全的吗?如果是这样,什么保证将ByteBuffer实例安全发布到执行 的线程CompletionHandler

AsynchronousSocketChannel channel = ...
ByteBuffer buf = ByteBuffer.allocate(1024);
channel.read(buf, null, new CompletionHandler<Integer, Void>() {

    //"completed" can be executed by a different thread than channel.read()
    public void completed(Integer result, Void attachment) {                
        buf.flip(); //Can buf be safely accessed here? If so, why?   
        //...          
    }

    public void failed(Throwable exc, Void attachment) {
       //...
    }
});
Run Code Online (Sandbox Code Playgroud)

java java-memory-model nio2

6
推荐指数
1
解决办法
142
查看次数

如何在 Java 1.7 中将文件路径转换为有效的文件路径

使用 Java 1.6 文件路径可以由用户输入,然后我应用各种正则表达式来删除对平台无效的字符(例如 '?' 在 Windows 上无效),并检查路径长度以确保我们最终得到一个有效的文件路径在尝试创建文件路径之前为操作系统。

但是有两个问题:

  1. 确定每个平台有效或无效的方法很痛苦。
  2. 我根据平台的默认文件系统做出假设,但当然 OSX 系统可能正在写入非 Mac 文件系统,例如 FAT32,在这种情况下,这些检查将无效。

所以我希望在 Java 7 中使用 NIO2 会有更好的方法,但还没有找到解决方案,有吗?

java filesystems nio nio2

5
推荐指数
1
解决办法
4179
查看次数

undertow 网络服务器未绑定到远程地址

我正在测试 undertow 2.0.0.Alpha1 网络服务器。Hello World当我在本地运行它时,它可以工作并在我转到 时返回localhost:80。然后我将网络服务器部署在远程服务器上并访问,remote_ip:80但没有得到任何响应。如果我curl -i -X GET http://localhost:80在远程服务器上运行,那么我Hello World也会返回。所以服务器肯定正在运行,但由于某种原因无法通过远程 IP 地址访问。如果我尝试在代码中将主机名设置为远程 IP(即.addHttpListener(80, "remote.ip")),那么我会得到一个BindException.

import io.undertow.Undertow;
import io.undertow.server.HttpHandler;
import io.undertow.server.HttpServerExchange;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

public class HelloWorldServer {

    public static void main(final String[] args) {
        try {
            Runtime.getRuntime().exec("sudo fuser -k 80/tcp");
        } catch (IOException ex) {
            Logger.getLogger(HelloWorldServer.class.getName()).log(Level.SEVERE, null, ex);
        }
        Undertow server = Undertow.builder()
                .addHttpListener(80, null)
                .setHandler(new HttpHandler() {
                    @Override
                    public void handleRequest(final …
Run Code Online (Sandbox Code Playgroud)

java jboss nio2 wildfly undertow

5
推荐指数
1
解决办法
2889
查看次数