【问题标题】:Two streams and one file两个流和一个文件
【发布时间】:2017-08-06 23:33:06
【问题描述】:

如果我使用默认构造函数创建类 FileInputStream 和 FileOutputStream 的两个实例,并作为参数指定相同的路径和文件名,会发生什么..

 FileInputStream is = new FileInputStream("SomePath/file.txt");  
 FileOutputStream os = new FileOutputStream("SamePath/file.txt");

假设我们在文件“file.txt”中有一些字符串。接下来,我尝试使用循环从 file.txt 读取字节并将它们写入同一个 file.txt 每次迭代,如下所示:

 while (is.available()>0){
      int data = is.read();
      os.write(data);
    }
    is.close();
    os.close();

问题是当我尝试运行我的代码时,file.txt 中的所有文本都被删除了。当两个或多个流尝试使用同一个文件时会发生什么? Java 或文件系统如何在这种情况下工作?

【问题讨论】:

标签: java inputstream java-io outputstream


【解决方案1】:

这取决于您的操作系统。在 Windows 上,new FileOutputStream(...) 可能会失败。在 Unix 行系统上,您将获得一个新文件,而旧文件仍可读取。

但是您的复制循环无效。 available() 不是流结束的测试,对于其他目的也没有多大用处。你应该使用这样的东西:

byte[] buffer = new byte[8192];
int count;
while ((count = in.read(buffer)) > 0)
{
    out.write(buffer, 0, count);
}

【讨论】:

  • 为什么 available() 不是流结束的测试? Available() 显示文件中还剩多少位,对吗? ..
  • 不,你错了。请参阅 Javadoc。它是一个估计有多少数据可以在没有阻塞的情况下读取。它可以在任何时候为零,或者在某些实现中一直为零:不仅仅是在结束时流。
猜你喜欢
  • 1970-01-01
  • 2020-03-27
  • 2018-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多