文件通道读取/添加错误数据
我正在使用带有字节缓冲区的Filechannel通过网络发送数据包.我的问题是,当FileChannel读取最后几个字节时,即使我在编写后我要清除字节缓冲区,也会添加上一个字节的最后一个数据. . 例如, 字节缓冲区大小= 512 对于上次迭代,剩余的字节发送为372. 它读取了最后372个,但也将另外140个字节(512-372)附加到其末尾,并且似乎最后140个字节来自以前的512个字节. . 我的代码: ByteBuffer bBuffer = ByteBuffer.allocate(512); while (fChannel.read(bBuffer) > 0) { bBuffer.flip(); datagramChannel.write(bBuffer); bBuffer.clear(); //omitted code } 解决方案 使用DatagramChannel这种方式实际上永远无法正常工作.您只是
4 2023-11-02
编程技术问答社区
Java NIO: transferFrom直到流的结束
我正在与Nio库一起玩.我试图在端口8888上收听连接,一旦接受连接,将所有内容从该通道到somefile. 转换. 我知道如何使用ByteBuffers>,但是我想与所谓的超级高效 FileChannel.transferFrom FileChannel.transferFrom . 这就是我得到的: ServerSocketChannel ssChannel = ServerSocketChannel.open(); ssChannel.socket().bind(new InetSocketAddress(8888)); SocketChannel sChannel = ssChannel.accept(); FileChannel out = new FileOutputStream("somefile").getChannel(); while (... sChannel has not reached the end of the stream ...)
6 2023-06-06
编程技术问答社区
Java中RandomAccessFile的并发性
我正在创建一个RandomAccessFile对象,以通过多个线程写入文件(在SSD上).每个线程都试图在文件中的特定位置编写直接字节缓冲区,我确保线程写入的位置不会与另一线程重叠: file_.getChannel().write(buffer, position); 其中file_是RandomAccessFile和buffer的实例. 对于RandomAccessFile对象,由于我没有使用Fallocation分配文件,并且文件的长度正在更改,这是否会利用基础媒体的并发? 如果不是,在创建文件时使用上述函数没有任何调用fallocation? 是否有任何意义? 解决方案 我对以下代码进行了一些测试: public class App { public static CountDownLatch latch; public static void main(String[] args) throws Interrupte
26 2023-06-06
编程技术问答社区
使用java时防止OutOfMemory。nio。文件映射
考虑创建5-6个线程的应用 MappedByteBuffer b = ch.map(FileChannel.MapMode.READ_ONLY, r, 1024*1024*5); 迟早,当应用程序与大文件一起使用时,OOM被扔了 java.io.IOException: Map failed at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:758) Caused by: java.lang.OutOfMemoryError: Map failed at sun.nio.ch.FileChannelImpl.map0(Native Method) at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:755) 根据规范,映射挡板应在GC本身后立即处置直接内存.看来问题是,映射的buffer-s是GC-ed为时已晚,然后直接内
8 2023-05-15
编程技术问答社区
如何使用NIO选择器来跟踪一个文件,换句话说,当有行被添加到文件中时,就会选择一个通道,这样你就可以读取这些行?
因为您不能重定向GC日志我可以选择将其重定向到使用-XlogGC的文件,然后通过某种文件频道将此文件的内容在我的选择器中获取.基本上,随着线路被添加到我的文件中,选择器被触发以读取它们.这样,我可以通过编程方式获取GC日志.是否可以使用nio? 做到这一点 解决方案 否. FileChannel不会扩展SelectAbleChannel,因此您无法选择它,即使在C中,Select()也无法在延长文件时提供可读的事件(每次选择时,它将提供它们,因为文件始终是可读). 其他解决方案 给定GC日志被缓冲,我不必担心一些延迟.您可以定期对文件长度进行轮询,并每次读取添加的数据.您可以在IO,Nio或Nio2中执行此操作.
16 2023-04-23
编程技术问答社区
在AsynchronousFileChannel中,CompletionHandler用于读取数据有什么用途?
我正在使用异步方面的芬兰渠道来阅读数据. 为了读取数据,我找到了两种读取方法,如下所示: //1. Future java.nio.channels.AsynchronousFileChannel.read(ByteBuffer dst, long position); //2. void java.nio.channels.AsynchronousFileChannel.read(ByteBuffer dst, long position, A attachment, CompletionHandler handler) 作为Java文档指定为下文,没有关于将完成用作该函数的第三个参数的信息: 从给定的文件位置开始,从此通道读取一个字节序列. . 此方法从以给定的文件位置开始启动从该通道的字节序列读取到给定的缓冲区.读取的结果是读取或-1的字节数,如果给定位置大于或等于尝试读取时文件的大小. 此方
20 2023-04-23
编程技术问答社区
试图同时读取时,Java滚动文件创建失败
我正在使用java.util记录类来创建滚动文件appender.我想创建一个日志读取器,该日志读取器从这些日志中读取,因为数据写给了它们. 滚动日志appender代码单独工作正常.但是,一旦我启动读取器线程新文件,新文件就不会创建新文件.创建log.0没有创建其他文件.我在Java Logging和Log4J中都注意到了这一点. 我正在使用Nio在日志阅读器中阅读.因此,我的疑问是,在同一文件上创建另一个Filechannel会产生一些问题吗?还是我错过了一些基本的NIO东西,这引起了问题. 这是代码.. public class Test { private static final long initialTime = System.currentTimeMillis(); private static Logger logger = Logger.getLogger(Test.class.getName()); publi
20 2023-04-23
编程技术问答社区
文件通道transferFrom'的评论解释
我已经阅读了FileChannel's transferFrom 的评论 * This method is potentially much more efficient than a simple loop * that reads from the source channel and writes to this channel. Many * operating systems can transfer bytes directly from the source channel * into the filesystem cache without actually copying them. 这是什么意思 Many operating systems can transfer bytes directly from the source channel into the filesystem cache without actual
16 2023-04-23
编程技术问答社区
Java NIO通过ByteBuffer扫描某些字节和带段的字
好吧,所以我试图做一些看起来应该很简单的事情,但是有了这些新的Nio界面,事情使我感到困惑!这是我要做的事情,我需要通过文件作为字节扫描,直到遇到某些字节为止!当我遇到某些某些字节时,需要抓住数据的那部分并对其进行操作,然后继续前进并再次执行此操作.我本来想,在ByteBuffer中所有这些标记,位置和限制的情况下,我可以做到这一点,但我似乎无法使它起作用!这是我到目前为止所拥有的. test.text: this is a line of text a this is line 2b line 3 line 4 line etc.etc.etc. test.java: import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.nio.charset.Charset; import java.nio.file.Pa
14 2023-04-23
编程技术问答社区
FileChannel#force是否等同于OutputStream#flush?我总是要调用它吗?
我有一个类,例如FilterOutputStream. public class WritableFilterChannel implements WritableChannel { public WritableFilterChannel(final WritableByteChannel channel) { super(); this.channel = channel; } // isOpen(), close() delegates to the channel // write(ByteBuffer) overridden to work differently protected WritableByteChannel channel; } 当我通过FileChannel的实例时,除了close()之外,没有办法. FileChannel#force等于OutputStream#f
14 2023-04-23
编程技术问答社区
从FileChannel(Java NIO)读取GZIP文件
我需要读取/解开给定filechannel的.gz文件. 我已经使用GZIPINPUTSTREAM来提取GZIP档案,但这不会使用Filechannel.我无法访问FileChannel的原始FileInputStream. 如果有人可以告诉我一种很好的方法(或至少任何)阅读filechannel的Gzip,我将非常感谢. 改编自 解决方案 您可以在Filechannel周围获得包装输入流: FileChannel fc = ... GZIPInputStream gis = new GZIPInputStream(Channels.newInputStream(fc)); 其他解决方案 是的,有一个解决方案.实施GZIP非常简单.您需要Alfter和CRC32,再加上读取标题/拖车.不幸的是,java.util.zip.Inflater仅服用byte[] byte[]是次优的(直接缓冲液本来会更有效).但是,使用非直接缓冲区和bytebuffer.arr
78 2023-04-23
编程技术问答社区
Java NIO MappedByteBuffer OutOfMemoryException
我真的很麻烦:我想使用FileChannel s和MappedByteBuffer s-我发现的所有文档在几个GB上读取巨大的文件,这意味着使用FileChannel.map()方法映射文件非常简单. 当然,在2GB处有一个极限 实际上,关于OutOfMemoryException s,我遇到了很多问题!而且根本没有任何真正定义限制的文档! 因此 - 如何将拟合到INT限制的文件安全地映射到一个或几个MappedByteBuffer s中,而不仅仅是例外? 我可以在尝试FileChannel.map()之前询问系统可以安全地映射的系统吗?如何? 为什么关于此功能的文档很少? 解决方案 文件越大,您一次在存储器中的所有内容就越少.设计一种方法,一次处理文件缓冲区,一次线等等. 映射的bbytebuffers尤其有问题,因为没有映射的内存的定义发布,因此一次使用多个以上的内存是必不可少的. 其他解决方案 我可以提供一些工作代码.是否难以解决您的问题.这可以通过文
22 2023-04-23
编程技术问答社区
在Java中,多个线程可以看到一个直接映射的ByteBuffer上的写操作吗?
我正在研究使用 bytebuffers 是由内存mapped文件构建的(通过 filechannel.map())以及内存内直接bytebuffers.我正在尝试了解并发和内存模型约束. 我已经阅读了诸如Filechannel,Bytebuffer,MappedByteBuffer等内容的所有相关Javadoc(和来源).似乎很明显,特定的字节布夫(和相关子类)具有一堆字段,并且国家没有受到保护.内存模型的观点.因此,如果修改特定字节的状态,则必须同步,如果该缓冲区在跨线程中使用,则必须同步.常见的技巧包括使用螺纹插座包装字节卷,重复(同步)以获取一个新实例,指向相同的映射字节等. 给定这种情况: 经理对整个文件有一个映射的字节缓冲区B_all(例如 管理器在b_all上调用重复(),位置(),limit()和slice()和slice(),以创建一个新的较小的字节buffer B_1,该B_1是文件的一部分,并将其提供给线程T1 管理器执行所有相同的事情来创建字
34 2023-03-27
编程技术问答社区
用FileChannel和ByteArrays读取ASCII文件
我有以下代码: String inputFile = "somefile.txt"; FileInputStream in = new FileInputStream(inputFile); FileChannel ch = in.getChannel(); ByteBuffer buf = ByteBuffer.allocateDirect(BUFSIZE); // BUFSIZE = 256 /* read the file into a buffer, 256 bytes at a time */ int rd; while ( (rd = ch.read( buf )) != -1 ) { buf.rewind(); for ( int i = 0; i
22 2023-02-02
编程技术问答社区
FileChannel -> BufferedReader -> Reader的劣势
FileChannel将比BufferedReader更快,BufferedReader更快比Reader更快,因为FileChannel和BufferedReader切断了一些itermediate步骤以接收数据. 我的问题是:优势是显而易见的,但我没有看到关于其缺点的网站上的任何来源. (FileChannel至BufferedReader,BufferedReader至Reader).当我们切断中间步骤之间时出现了什么问题. 所以,谁可以教我. @:而且,同样的输出问题也是如此.请告诉我那些人的缺点. 谢谢:) 使用BufferedWriter(或任何其他缓冲输出流)时的一个潜在缺点是您的程序在写入输出设备之前在缓冲器/内存中保存一些数据.如果您不能在程序崩溃的情况下丢失任何数据,那么您可能希望考虑不使用BufferedWriter/BufferedOutputStream. 其他解决方案 我想因为克服中间步骤时,数据流将更容易满足错误.当错误发生
18 2023-01-31
编程技术问答社区
MappedByteBuffer在初次运行时很慢
长时间读者,第一次海报. 我从一组二进制文件中快速阅读数据遇到了一些麻烦.字节扣和MappedBytbuffers提供了我所需的性能,但它们似乎需要初始运行才能进行热身.我不确定这是否有意义,所以这里有一些代码: int BUFFERSIZE = 864; int DATASIZE = 33663168; int pos = 0; // Open File channel to get data FileChannel channel = new RandomAccessFile(new File(myFile), "r").getChannel(); // Set MappedByteBuffer to read DATASIZE bytes from channel MappedByteBuffer mbb = channel.map(FileChannel.MapMode.READ_ONLY, pos, DATASIZE); // Set Endianness m
14 2023-01-27
编程技术问答社区
不完整的文件复制 Java NIO
我在阅读文件时遇到问题.我也是Nio的新手.我要发送到服务器的文件的实际大小几乎是 900MB ,仅收到 3MB . 服务器的侧面代码: private void read(SelectionKey key) throws IOException{ SocketChannel socket = (SocketChannel)key.channel(); RandomAccessFile aFile = null; ByteBuffer buffer = ByteBuffer.allocate(300000000); try{ aFile = new RandomAccessFile("D:/test2/test.rar","rw"); FileChannel inChannel = aFile.getChannel(); while(socket.read(buffer) > 0){
22 2023-01-18
编程技术问答社区
从划线文件中删除第一行
我有一个划界文件,该文件可能包含大约数百万个记录,现在我想从划界文件中删除第一行,然后再对其进行进一步处理. 第一行的长度是可变的,它根据文件类型而有所不同..现在我已经在Filechannel和RandomAccessFile上进行了读取,这被认为是删除第一行的最佳方法. 但我无法弄清楚,如何获取第一行的长度并删除它. 解决方案 不要删除它,只是读取and-ignore . 如果您必须准备文件,因为文件处理单元无法使用不正确的第一行处理文件,那么您必须读取并重写它.没有可用的i/o操作可以从文件系统. 中删除文件 其他解决方案 使用 readLine() 要按行读取行,只需遵守第一行,然后在处理方面考虑其他人 其他解决方案 感谢您的输入.根据相同的不同,我找出了一种解决方案,可以从划界管文件中删除第一行. 下面提到的是代码段 RandomAccessFile raf = new RandomAccessFile("path to ur
52 2023-01-01
编程技术问答社区
FileChannel#强制和缓冲
我想立即清除并在FileOutputStream和Filechannel之间绘制一些相似之处. 因此,首先,似乎是使用Standart Java IO编写文件的最有效方法是使用fileOutputStream,该fileOutputStream用BufferedOutputstream包装.因为当内部缓冲区溢出时,它会自动冲洗.能够进行单个写作(单个字节,浮点等)以及数组的文字,并且不必担心速度很方便.您永远不会忘记的唯一一件事就是关闭它(执行最终冲洗).使用BufferedOutputStream包装器的好处是显而易见的,必须为每个人带来(我希望). 现在关于Filechannel. FileChannel具有力法,这等同于FileOutputStream中的冲洗,不是吗?但是,如果没有" BufferedFilechannel"包装器,我不明白何时以及为什么要使用它. 换句话说,Filechannel的缓冲在哪里?它是否像BufferedOutputStream一样自动并
14 2022-12-27
编程技术问答社区
得到一个错误的FileChannel尺寸
我正在尝试获取assets中包含的文件的大小. 我使用FileChannel,因为稍后需要FileChannel. 文件myfile.txt包含7个字节. 这是我的代码: AssetManager amgr; AssetFileDescriptor afd; FileChannel fchIn; FileInputStream fis; amgr=context.getAssets(); afd=amgr.openFd("myfile.txt"); fis=afd.createInputStream(); fchIn=fis.getChannel(); Log.d("mytag", fchIn.size()); Log.d("mytag", fis.available()); ,输出为: 7237492 7 为什么FileChannel.size()方法返回大小? 感谢您的帮助 解决方案 FileInputStream.getChannel()
26 2022-12-24
编程技术问答社区