Tag: io

如何在Java中模拟文件IO?

我怎样才能创建一个模仿java.io.File文件读写的MockFile类? 我在任何地方使用我自己的方法而不是new FileInputStream(….)和new FileOutputStream(….) ,所以这部分没问题(我总是委托给相应的流)。 非trivila部分是在更复杂的情况下我的MockFileInputStream和MockFileOutputStream的实现。 没问题,当我第一次写入文件然后读取它时,我可以简单地使用ByteArrayOutputStream等等。 这很简单,但是通过交错读写,它无法正常工作。 比编写我自己的ByteArrayOutputStream版本更好的想法?

什么可能导致“IO错误java.net.SocketException:select failed”?

我的笔记本电脑上运行的服务器程序,相同的路由器和相同的代码。 它工作正常,客户可以连接。 然而,当我将工作区复制到我的PC并运行它时,我得到了这个废话: IO错误java.net.SocketException:选择失败 这是代码…… public static void main(String[] args) { System.out.println(“running server!”); int nreq = 1; try{ ServerSocket sock = new ServerSocket(7331); for(;;){ Socket newsock = sock.accept(); System.out.println(“Creating thread…”); //Thread t = new ThreadHandler(newsock, nreq); //t.start(); nreq++; } } catch(Exception e) { System.out.println(“IO error ” + e); } 基本上什么可能导致这个错误(我在网上找不到有用的信息)在一台PC而不是另一台PC上发生? 它必须与PC本身有关。 我最困惑。 基本上它无法打开套接字? 这是完整的堆栈跟踪: java.net.SocketException: […]

关闭I / O流

当我不关闭流时会发生什么坏事? 关闭操作是否自动冲洗? 程序退出后是否所有流都关闭了? 提前致谢。

validation失败后移动文件(Java)

我们正在validationXML文件,根据validation结果,我们必须将文件移动到不同的文件夹中。 当XML有效时,validation器返回一个值,我们可以毫无问题地移动文件。 当XML根据模式无效时,也会发生同样的事情。 但是,如果XML格式不正确,validation器会抛出exception,当我们尝试移动文件时,它会失败。 我们相信在某个地方仍然有一个句柄可以保存文件。 我们尝试在移动文件之前放置System.gc()并对问题进行排序,但我们不能将System.gc()作为解决方案。 代码看起来像这样。 我们有一个File对象,我们从中创建一个StreamSource。 然后将StreamSource传递给validation器。 当XML格式不正确时,它会抛出SAXException。 在exception处理中,我们使用.renameTo()方法来移动文件。 sc = new StreamSource(xmlFile); validator.validate(sc); 我们尝试过捕获 validator.reset(); validator=null; sc=null; 但仍然.renameTo()无法移动文件。 如果我们将System.gc()放入catch中,那么移动将成功。 有人可以告诉我如何在没有System.gc()?情况下对其进行排序System.gc()? 我们使用JAXP和saxon-9.1.0.8作为解析器。 非常感谢

如何在Java中处理多个流?

我正在尝试运行一个进程,并对其输入,输出和错误流进行处理。 显而易见的方法是使用类似select()东西,但我在Java中唯一可以找到的是Selector.select() ,它接收一个Channel 。 似乎不可能从InputStream或OutputStream获取Channel ( FileStream有一个getChannel()方法,但这在这里没有帮助) 所以,我写了一些代码来轮询所有的流: while( !out_eof || !err_eof ) { while( out_str.available() ) { if( (bytes = out_str.read(buf)) != -1 ) { // Do something with output stream } else out_eof = true; } while( err_str.available() ) { if( (bytes = err_str.read(buf)) != -1 ) { // Do something with error […]

在Java 7中调整默认文件系统的行为

Java 7为编写自定义文件系统引入了一个很棒的API。 考虑一个我不想实现新文件系统的用例,我只想调整现有文件系统的行为。 例如,翻转从其写入/读取的每个位。 在我看来,目前的jdk没有适当的设施。 AbstractFileSystemProvider,WindowsFileSystemProvider扩展的提供程序是包私有的,所以我不能重用它。 我甚至没有找到Linux的具体实现。 问题#1:当前文件系统没有用于扩展的有用抽象。 我们假设我只针对Windows扩展。 WindowsFileSystemProvider是公共的,所以我实际上可以轻松地覆盖newByteChannel并完成它。 可惜! 问题2:WindowsFileSystem 不公开,所以我实际上只需要编写一个全新的FileSystem来引入一个新的Provider。 我是否遗漏了某些内容,或者此function是否完全原始且未准备好供应用程序编写者使用?

如何通过网络将String从Java发送到JavaScript?

我有一个用Java生成的JSON字符串,我需要将这个字符串发送到另一台计算机,它将通过JavaScript(因为电子 )接收它。 JavaScript计算机可能很远,并将通过互联网与Java应用程序联系。 Java应用程序不是各种Web应用程序,它是一个简单的后端应用程序。 我该怎么办?

如何在Java中读取格式化输入?

假设我的输入文件包含: 3 4 5 6 7 8 9 10 我想运行一个while循环并读取整数,这样我将在循环的每次迭代后分别获得3,4,5,6,7,8和10。 这在C / C ++中很简单,但在Java中却不行…… 我试过这段代码: try { DataInputStream out2 = new DataInputStream(new BufferedInputStream(new FileInputStream(file))); int i=out2.read(); while(i!=-1){ System.out.println(i); i=out2.readInt(); } } catch (IOException ex) { } 而我得到的是: 51 540287029 540418080 538982176 151599117 171511050 218762506 825232650 如何在Java中读取此文件中的整数?

只有在完全写入和关闭后才能从HDFS读取文件

我有两个进程在运行。 一种是将文件写入HDFS,另一种是加载这些文件。 第一个进程(写入文件的进程)正在使用: private void writeFileToHdfs(byte[] sourceStream, Path outFilePath) { FSDataOutputStream out = null; try { // create the file out = getFileSystem().create(outFilePath); out.write(sourceStream); } catch (Exception e) { LOG.error(“Error while trying to write a file to hdfs”, e); } finally { try { if (null != out) out.close(); } catch (IOException e) { LOG.error(“Could […]

使用Java下载文件随机冻结

当我尝试下载文件时(在这种情况下它只是一个图像,但真正的应用程序是一种更新机制), InputStream似乎冻结了read 。 我很确定我的代码没问题,所以我想知道为什么会这样,如果它只是在我的电脑上。 有人可以运行这个吗? 请注意, Timer仅用于调试目的。 非常感谢你。 这是一个显示问题的video : video import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.*; import java.net.URL; import javax.swing.Timer; public class FileDownloader { public final static int BUFFER_LENGTH = 1 << 14; private static Timer timeoutTimer = new Timer(5000, new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { System.out.println("Timeout"); System.exit(0); } }); public static […]