两个流和一个文件
Two streams and one file
如果我使用默认构造函数创建 class 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 或文件系统如何处理这种情况?
这取决于您的操作系统。在 Windows 上 new FileOutputStream(...)
可能会失败。在 Unix-line 系统上,您将获得一个新文件,而旧文件仍然可读。
但是你的复制循环是无效的。 available()
不是对流结束的测试,也不是用于其他目的。你应该使用这样的东西:
byte[] buffer = new byte[8192];
int count;
while ((count = in.read(buffer)) > 0)
{
out.write(buffer, 0, count);
}
如果我使用默认构造函数创建 class 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 或文件系统如何处理这种情况?
这取决于您的操作系统。在 Windows 上 new FileOutputStream(...)
可能会失败。在 Unix-line 系统上,您将获得一个新文件,而旧文件仍然可读。
但是你的复制循环是无效的。 available()
不是对流结束的测试,也不是用于其他目的。你应该使用这样的东西:
byte[] buffer = new byte[8192];
int count;
while ((count = in.read(buffer)) > 0)
{
out.write(buffer, 0, count);
}