Path file = Paths.get("c:/large.log");
AsynchronousFileChannel channel = AsynchronousFileChannel.open(file);
final ByteBuffer buffer = ByteBuffer.allocate(1000);
channel.read(buffer, 0, buffer,
new CompletionHandler<Integer, ByteBuffer>() {
public void completed(Integer result, ByteBuffer attachment) {
System.out.println(new String(buffer.array()));
}
});
Run Code Online (Sandbox Code Playgroud)
这样,我就可以从large.log中读取前1000字节。如果我不想分配更大的字节数组,如 ByteBuffer.allocate(1000*1000),我如何读取以下日志。因为我认为这会导致OutOfMemory。
有人可以给我示例代码吗? 谢谢。
ps:我可以用JIO循环读取大文件,因为我可以检查java.io.BufferedReader.read()的返回值。但我不知道NIO2怎么办。
我正在习惯 Java 7 和新Files类。
我正在编写一个小型应用程序,它在某些时候必须替换文件的内容。我使用临时文件来避免在出现问题时删除目标文件。AccessDeniedException但是,在执行实际副本时我总是收到。
这是我的代码:
// Temporary file generation.
Path target = getCurrentConfigFile(); // Returns a path, works ok.
Path tempFile = Files.createTempFile("tempfile", null);
Files.write(tempFile, conf.getBytes(Charset.defaultCharset()), StandardOpenOption.WRITE);
// Actual copy.
Files.copy(tempFile, target, StandardCopyOption.REPLACE_EXISTING);
// Cleanup.
Files.delete(tempFile);
Run Code Online (Sandbox Code Playgroud)
getCurrentConfigFile()处理目标文件路径创建:
(... generates various strings from configuration parameters)
return FileSystems.getDefault().getPath(all, these, various, strings);
Run Code Online (Sandbox Code Playgroud)
当我执行代码时,它是通过.bat脚本执行的,并且我在标准命令提示符或提升中都会收到错误。目标文件位于C:\temp\tests我使用同一 Windows 用户创建的目录中。
问题似乎在于从临时文件中读取,因为直接写入目标是有效的。接下来我该看哪里?
我想将包含字符串的大文件合并到一个文件中,并尝试使用nio2.我不想将整个文件加载到内存中,所以我尝试使用BufferedReader:
public void mergeFiles(filesToBeMerged) throws IOException{
Path mergedFile = Paths.get("mergedFile");
Files.createFile(mergedFile);
List<Path> _filesToBeMerged = filesToBeMerged;
try (BufferedWriter writer = Files.newBufferedWriter(mergedFile,StandardOpenOption.APPEND)) {
for (Path file : _filesToBeMerged) {
// this does not work as write()-method does not accept a BufferedReader
writer.append(Files.newBufferedReader(file));
}
} catch (IOException e) {
System.err.println(e);
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试了这个,这个工作,hower,字符串的格式(例如新行等不会被复制到合并文件):
...
try (BufferedWriter writer = Files.newBufferedWriter(mergedFile,StandardOpenOption.APPEND)) {
for (Path file : _filesToBeMerged) {
// writer.write(Files.newBufferedReader(file));
String line = null;
BufferedReader reader = Files.newBufferedReader(file);
while ((line = reader.readLine()) != null) { …Run Code Online (Sandbox Code Playgroud) 在流教程中,关于从中获取的关闭流没有任何说法Files.newInputStream( path ).只有一些模糊不清:
返回的流是否可异步关闭和/或可中断是高度特定于文件系统提供程序的,因此未指定.
什么是"异步"在这种情况下?如果我显式关闭流或另一个线程异步关闭流?
我正在尝试创建一个具有异步通信模型的服务器,并希望绑定多个端口,但是当我多次调用bind方法时,它将引发错误“ AlreadyBoundException”。有什么可行的方法吗?这是我的代码
try(AsynchronousServerSocketChannel listener = AsynchronousServerSocketChannel.open()){
if(listener.isOpen()){
listener.setOption(StandardSocketOptions.SO_RCVBUF, 4*1024);
listener.setOption(StandardSocketOptions.SO_REUSEADDR, true);
listener.bind(new InetSocketAddress(9001));
listener.bind(new InetSocketAddress(9002));
Run Code Online (Sandbox Code Playgroud) 在AsynchronousFileChannelJava中NIO.2 API包含的void force(boolean)方法.
显然这种方法是阻塞的,因为只有在将更改成功写入设备后才能返回.
我正在寻找一种方法来实现相同的目标,而不会阻塞线程.
正如评论中所提到的,这将等同于标准C库函数aio_fsync:http://pubs.opengroup.org/onlinepubs/009695399/functions/aio_fsync.html
我很困惑......根据这个Java页面,该File.setReadOnly()函数现在是一个"遗留"函数,应该被替换为Files.setAttribute()......但这需要您知道您是使用DOS还是POSIX文件系统.我只是想以独立于平台的方式使文件成为只读文件.我该怎么办?
如果我想要做一些文件只对目录的第一级,是有使用之间的差异Files.list(...)或Files.walkFileTree(...)或Files.walk(...)?
Files.walkFileTree(directory, Collections.emptySet(), 1, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
doSomething(file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) {
// log exc
return FileVisitResult.CONTINUE;
}
});
Run Code Online (Sandbox Code Playgroud)
与
Files.list(directory)
.forEach(path -> {
try {
doSomething(path);
} catch (IOException exc) {
// log exc
}
});
Run Code Online (Sandbox Code Playgroud)
与
Files.walk(directory, 1)
.forEach(path -> {
try {
doSomething(path);
} catch (IOException exc) {
// log exc
}
});
Run Code Online (Sandbox Code Playgroud) 最近的 Windows 10 版本能够通过以下方式将单个 NTFS 目录(而不是整个文件系统)标记为区分大小写fsutil.exe:
如果我想从 Java 应用程序中查询给定目录的区分大小写的标志,我目前唯一的选择是调用
fsutil.exe file queryCaseSensitiveInfo ...
Run Code Online (Sandbox Code Playgroud)
在每个目录的基础上,这意味着可能会产生多个进程,这很昂贵。
在较新的 Java 版本 (11+) 中是否有针对区分大小写的 NTFS 和/或 WSL 文件系统的计划中的 NIO.2 API 扩展?
我需要连接到 4 台机器并从套接字读取数据。我选择使用 nio2 的异步模型。
这是一个伪代码:
class Connector {
private final AsynchronousChannelGroup group;
private final String host;
private final int port
//...
public void connect() {
try (AsynchronousSocketChannel client = AsynchronousSocketChannel.open(group)) {
client.connect(new InetSocketAddress(host(), port())).get(5, TimeUnit.SECONDS);
if (!group.isShutdown()) {
ByteBuffer buffer = ByteBuffer.allocate(1024);
client.read(buffer, 5, TimeUnit.SECONDS, new Attachement(buffer), new ReadHandler(client)); //#1
}
} catch (Exception e) {
//
}
}
private class ReadHandler implements CompletionHandler<Integer, Attachement> {
final AsynchronousSocketChannel channel;
@Override
public void completed(Integer result, Attachement attachment) {
attachment.buffer.clear();
channel.read(attachment.buffer, …Run Code Online (Sandbox Code Playgroud) nio2 ×10
java ×9
asynchronous ×1
channel ×1
file ×1
fsutil ×1
io ×1
java-7 ×1
java-8 ×1
java-nio ×1
nio ×1
ntfs ×1
permissions ×1
serversocket ×1
stream ×1