Tag: 通道

FileChannel#强制和缓冲

我想说清楚,并立即在FileOutputStream和FileChannel之间绘制一些相似之处。 首先, 使用标准Java io编写文件的最有效方法似乎是使用包含BufferedOutputStream的FileOutputStream 。 因为它会自动刷新,当内部缓冲区溢出时。 能够进行单次写入(单字节,浮点数等)以及数组写入并且不担心速度是很方便的。 你唯一不应该忘记的是关闭它(进行最后的冲洗)。 使用BufferedOutputStream包装器的好处很明显,每个人都必须拥有 (我希望)。 现在关于FileChannel。 FileChannel有force方法,它相当于FileOutputStream中的flush,不是吗? javadocs清楚地说,您应该使用它来确保您对目标文件进行了更改。 但是,如果没有“BufferedFileChannel”包装器,我不明白何时以及为什么要使用它。 换句话说,FileChannel的缓冲在哪里? 它是自动的并且隐藏在FileChannel本身,就像在BufferedOutputStream中一样吗? 如果没有,那么为什么我需要强制方法,因为没有什么可以强迫的(所有更改都已经在使用write方法后应用于文件)并且我必须自己实现缓冲吗?

线程中断没有结束阻塞调用输入流读取

我正在使用RXTX从串口读取数据。 读取是在以下列方式生成的线程内完成的: CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(port); CommPort comm = portIdentifier.open(“Whatever”, 2000); SerialPort serial = (SerialPort)comm; …settings Thread t = new Thread(new SerialReader(serial.getInputStream())); t.start(); SerialReader类实现Runnable并且无限循环,从端口读取并将数据构建到有用的包中,然后再将其发送到其他应用程序。 但是,我把它简化为以下简单: public void run() { ReadableByteChannel byteChan = Channels.newChannel(in); //in = InputStream passed to SerialReader ByteBuffer buffer = ByteBuffer.allocate(100); while (true) { try { byteChan.read(buffer); } catch (Exception e) { System.out.println(e); […]

在读取xml文件后阻止文件通道关闭

有关此目标背后的动机(以及我解决此问题的努力)的更多详细信息,请查看我之前的问题 。 我决定将这个问题完全视为一个新问题,因为我认为它已经发展到足够值得这样做。 总而言之,我打算将JDOM与NIO结合使用,以便: 在xml文件上获得独占文件锁。 将文件读入Document对象。 进行任意更改(锁定仍然有效!)。 将更改写回xml文件。 释放文件锁。 但是我得到的问题是,将xml文件读入文档对象的内置代码会关闭通道(因此会释放锁定),如下所示: import java.io.*; import java.nio.channels.Channels; import java.nio.channels.FileChannel; import javax.xml.parsers.*; import org.w3c.dom.Document; import org.xml.sax.SAXException; public class Test4{ String path = “Test 2.xml”; private DocumentBuilderFactory dbFactory; private DocumentBuilder dBuilder; private Document doc; public Test4(){ try (final FileChannel channel = new RandomAccessFile(new File(path), “rw”).getChannel()) { dbFactory = DocumentBuilderFactory.newInstance(); dBuilder […]