草庐IT

FileChannel

全部标签

java - 什么是映射缓冲池/直接缓冲池以及如何增加它们的大小?

VisualVM的截图是我运行IO密集型JVM程序(用Scala编写)时截取的,堆大小为4GB,只有2GB正在使用。JVM程序使用内存映射文件。“映射缓冲池”和“直接缓冲池”是什么意思?那些水池似乎很满。由于JVM程序使用内存映射文件,如果池更大,我会看到性能提高吗?如果是这样,如何增加它们的大小?所有映射文件的大小约为1.1GB。 最佳答案 直接缓冲区一个directbuffer是一块内存,通常用于将Java连接到操作系统I/O子系统,例如作为操作系统在从套接字或磁盘接收数据时写入数据的地方,Java可以直接从中读取数据。与操作系

java - 多个线程可以看到 Java 中直接映射的 ByteBuffer 上的写入吗?

我正在研究使用ByteBuffers的东西从内存映射文件(通过FileChannel.map())以及内存中的直接ByteBuffers构建。我正在尝试了解并发和内存模型约束。我已经阅读了所有相关的Javadoc(和源代码),例如FileChannel、ByteBuffer、MappedByteBuffer等。很明显,特定的ByteBuffer(和相关子类)有一堆字段,并且状态不protected内存模型的观点。因此,如果跨线程使用该缓冲区,则在修改特定ByteBuffer的状态时必须进行同步。常见的技巧包括使用ThreadLocal来包装ByteBuffer、复制(同步时)以获取指向

java - 多个线程可以看到 Java 中直接映射的 ByteBuffer 上的写入吗?

我正在研究使用ByteBuffers的东西从内存映射文件(通过FileChannel.map())以及内存中的直接ByteBuffers构建。我正在尝试了解并发和内存模型约束。我已经阅读了所有相关的Javadoc(和源代码),例如FileChannel、ByteBuffer、MappedByteBuffer等。很明显,特定的ByteBuffer(和相关子类)有一堆字段,并且状态不protected内存模型的观点。因此,如果跨线程使用该缓冲区,则在修改特定ByteBuffer的状态时必须进行同步。常见的技巧包括使用ThreadLocal来包装ByteBuffer、复制(同步时)以获取指向

java - 有没有办法防止 ClosedByInterruptException?

在以下示例中,我有一个文件被两个线程使用(在实际示例中,我可以有任意数量的线程)importjava.io.File;importjava.io.IOException;importjava.io.RandomAccessFile;importjava.nio.ByteBuffer;importjava.nio.channels.FileChannel;publicclassA{staticvolatilebooleanrunning=true;publicstaticvoidmain(String[]args)throwsIOException,InterruptedExceptio

java - 有没有办法防止 ClosedByInterruptException?

在以下示例中,我有一个文件被两个线程使用(在实际示例中,我可以有任意数量的线程)importjava.io.File;importjava.io.IOException;importjava.io.RandomAccessFile;importjava.nio.ByteBuffer;importjava.nio.channels.FileChannel;publicclassA{staticvolatilebooleanrunning=true;publicstaticvoidmain(String[]args)throwsIOException,InterruptedExceptio

java - java - 如何从使用Java中的FileChannel映射的内存中取消映射文件?

我正在使用FileChannel.map()将文件(“sample.txt”)映射到内存,然后使用fc.close()关闭channel。之后,当我使用FileOutputStream写入文件时,出现以下错误:java.io.FileNotFoundException:sample.txt(Therequestedoperationcannotbeperformedonafilewithauser-mappedsectionopen)Filef=newFile("sample.txt");RandomAccessFileraf=newRandomAccessFile(f,"rw");F

java - java - 如何从使用Java中的FileChannel映射的内存中取消映射文件?

我正在使用FileChannel.map()将文件(“sample.txt”)映射到内存,然后使用fc.close()关闭channel。之后,当我使用FileOutputStream写入文件时,出现以下错误:java.io.FileNotFoundException:sample.txt(Therequestedoperationcannotbeperformedonafilewithauser-mappedsectionopen)Filef=newFile("sample.txt");RandomAccessFileraf=newRandomAccessFile(f,"rw");F

java - FileUtils.copyFile() VS FileChannel.transferTo()

我发现,copyToFile()的底层操作系统调用是Libcore.os.read(fd,bytes,byteOffset,byteCount),而transferTo()基于内存映射文件:MemoryBlock.mmap(fd,alignment,size+offset,mapMode);...buffer=map(MapMode.READ_ONLY,position,count);returntarget.write(buffer);Q1:我的发现是对还是错?Q2:是否有任何理由使用FileUtils.copyFile()因为FileChannel.transferTo()似乎应该

java - FileChannel 返回 Assets 文件夹中文件的错误文件大小

我正在尝试使用FileInputStream从我的Assets中的原始文件夹中读取一个File。这就是我创建FileInputStream的方式:AssetManagerassetManager=getAssets();AssetFileDescriptorfileDescriptor=assetManager.openFd(fileName);FileInputStreaminputStream=newFileInputStream(fileDescriptor.getFileDescriptor());之后,我尝试像这样从File中读取数据:FileChannelfileChann

c# - .NET 等同于 Java FileChannel?

我想将字节直接从TCP套接字流式传输到磁盘上的文件。在Java中,可以使用NIOchannel,特别是SocketChannel和FileChannel。引用FileChannel#transferFrom(...):Thismethodispotentiallymuchmoreefficientthanasimpleloopthatreadsfromthesourcechannelandwritestothischannel.Manyoperatingsystemscantransferbytesdirectlyfromthesourcechannelintothefilesyste