Tag: 缓冲区

Java中的缓冲和无缓冲流

我正在阅读有关Java IO的一些文档,只是想确定我是否做到了这一点: 无缓冲输入流 :FileInputStream,InputStreamReader,FileReader 无缓冲输出流 :FileOutputStream,OutputStreamWriter,FileWriter 缓冲输出流 :PrintStream,PrintWriter 此外,我们还有BufferedInputStream,BufferedOutputStream,BufferedReader和BufferedWriter流,可将无缓冲的流转换为缓冲版本。 最后,我观察到了Character Streams,即。 InputStreamReader,FileReader,OutputStreamWriter,FileWriter,在将字节发送到流之前为字节维护内部字节缓冲区。 这个字节缓冲区不在我们的控制之下。 因此,对于Character Streams,缓冲是指用于存储进出程序的字符的高级字符缓冲区。 我说的一切都是正确的吗? PS – 我知道这个缓冲问题在某种程度上依赖于实现,但我只是想确认一下javadocs在说什么

Java – 从缓冲读取器(从套接字)读取正在暂停线程

我有一个线程从缓冲读取器读取字符(从套接字创建如下): inputStream = new BufferedReader(new InputStreamReader(clientSock.getInputStream())); 此代码只能运行一次。 例如,如果客户端连接并发送:“这是一个测试”和“这是另一个测试”,则主机输出为: Reading from stream: Chars read from stream: 16 This is a test Reading from stream: 请注意,程序不会收到“这是另一个测试”,因为它在读取流时仍然停留。 有没有办法处理这个而不减少缓冲区大小? 这是线程的代码: public void run() { boolean dataRecieved = false; char[] inputChars = new char[1024]; int charsRead = 0; while (!stopNow) { try { Thread.sleep(getDataDelay); //Read 1024 characters. Note: This will […]

确定适当的缓冲区大小

我正在使用ByteBuffer.allocateDirect()来分配一些缓冲区内存,用于将文件读入内存,然后最终散列文件字节并从中获取文件散列(SHA)。 输入文件的大小范围很广,从几KB到几GB不等。 关于选择缓冲区大小,我已经阅读了几个线程和页面(甚至一些关于SO)。 有人建议尝试选择本机FileSystem使用的一个,以尽量减少部分块的读操作机会等。 例如4100字节的缓冲区和NTFS默认为4096,因此额外的4位需要单独的读操作,非常浪费。 因此坚持使用2,1024,2048,4096,8192等的function。我看到一些推荐的缓冲区大小为32KB,其他建议使缓冲区大小为输入文件(对于小文件可能很好,但是关于大文件?)。 坚持使用原生块大小的缓冲区有多重要? 从现代的角度来看(假设现代SATA驱动器或更好的驱动器缓存至少8Mb,以及其他现代操作系统“神奇”来优化I / O)缓冲区大小有多重要,我应该如何最好地确定我要设置的大小? 我可以静态设置它,还是动态确定它? 感谢您的任何见解。

何时使用Array,Buffer或direct Buffer

题 在编写用于OpenGL库的Matrix类时,我遇到了是否使用Java数组或缓冲区策略来存储数据的问题(JOGL为Matrix操作提供了直接缓冲区复制)。 为了分析这个,我写了一个小的性能测试程序,它比较了Arrays与Buffers vs direct Buffers的循环和批量操作的相对速度。 我想在这里与你分享我的成果(因为我觉得它们很有趣)。 请随时评论和/或指出任何错误。 可以在pastebin.com/is7UaiMV上查看代码。 笔记 循环读取数组实现为A [i] = B [i] ,否则JIT优化器将完全删除该代码。 实际var = A [i]似乎几乎相同。 在数组大小为10,000的示例结果中,JIT优化器很可能已使用类似System.arraycopy的实现替换了循环数组访问。 没有批量获取缓冲区 – >缓冲区,因为Java将A.get(B)实现为B.put(A) ,因此结果与批量放置结果相同。 结论 在几乎所有情况下,强烈建议使用Java内部数组。 不仅输出/获取速度大大加快,JIT还能够对最终代码执行更好的优化。 只有在以下两种情况适用时才应使用缓冲区: 您需要处理大量数据。 该数据大部分或总是经过批量处理 。 请注意,后备缓冲区具有Java数组,用于补偿缓冲区的内容。 建议在此缓冲区上执行操作,而不是循环put / get。 只有在担心内存使用情况且永远不会访问基础数据时, 才应使用直接缓冲区。 它们比非直接缓冲区稍慢,如果访问基础数据则要慢得多,但使用的内存较少。 此外,在使用直接缓冲区时,将非字节数据(如float-arrays)转换为字节时会产生额外的开销。 有关详细信息,请参阅此处 为什么只有ByteBuffers在使用直接缓冲区时才有用 NIO的内部开销以及减缓缓冲区的速度 样本结果 注意:百分比仅为便于阅读而没有实际意义。 使用大小为16的数组和10,000,000次迭代…… — Array tests: —————————————– Loop-write array: 87.29 ms 11,52% […]

Java:除非手动刷新,否则无法从Process获取stdout数据

我正在用Java编写命令行程序的终端包装器,并使用ProcessBuilder生成子进程。 要将键e.getKeyChar()子e.getKeyChar() ,我只需将GUI中的e.getKeyChar()直接写入e.getKeyChar()给出的OutputStream 。 为了从子进程接收输出,我基本上有一个从子进程的stdout读取的while循环: while ((b = br.read()) != -1) { System.out.println(“Read “+b); bb[0] = (byte) b; // call an event listener with the read byte listener.dataReceived(bb); } 只有当我立即冲洗两端的输出时,这才有效。 也就是说,我必须刷新每个用户输入,并且子进程必须刷新自己的stdout才能发生这些事情。 否则, read()阻塞,等待数据,这些数据从未实际发送过(子进程’stdout只是保持缓冲)。 我怎样才能进行I / O操作? 示例终端子进程: #include int main() { char c; while((c = getchar()) != -1) { printf(“Got: %d\n”, c); // doesn’t work […]

如何垃圾收集直接缓冲java

我有一个内存泄漏,我已经隔离到不正确的直接字节缓冲区。 ByteBuffer buff = ByteBuffer.allocateDirect(7777777) GC收集包含这些缓冲区的对象,但不会丢弃缓冲区本身。 如果我实例化足够的包含缓冲区的瞬态对象,我会得到这个令人鼓舞的消息。 java.lang.OutOfMemoryError:直接缓冲内存 我一直在寻找这个问题,显然 buff.clear 和 System.gc()的 不起作用

如何刷新缓冲的log4j FileAppender?

在log4j中,当使用具有BufferedIO = true和BufferSize = xxx属性的FileAppender(即启用了缓冲)时,我希望能够在正常关闭过程中刷新日志。 关于如何做到这一点的任何想法?

在Java中为JOGL释放直接缓冲区本机内存

我使用直接缓冲区(java.nio)来存储JOGL的顶点信息。 这些缓冲区很大,在应用程序生命周期内会被多次更换。 内存没有及时解除分配,几次更换后我的内存不足。 似乎没有好的方法来使用java.nio的缓冲类来解除分配。 我的问题是: JOGL中有一些删除Direct Buffers的方法吗? 我正在研究glDeleteBuffer(),但看起来这只是从显卡内存中删除缓冲区。 谢谢