- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我和我的同事正在争论 File.delete()
方法在 Java 中的工作原理。
在我们的代码中:
File outFile = new File("/dir/name.ext");
if(outFile.exists())
outFile.delete();
FileInputStream inStream = new FileInputStream(outFile);
WriteFile.writeFile(inStream); // Writes the actual file
出于安全原因,我不能在此处包含 writeFile
的整个方法体,但在创建所需的数据库对象后,它会执行以下操作:
BufferedOutputStream out = null;
Object[] args = {"an_encrypted_data_clob_name_in_the_database"};
Class[] argTypes = {Class.forName("java.lang.String")};
Object result = WSCallHelper.jdbcCall(null, rs, "getCLOB", args, argTypes);
CLOB clob = (CLOB)result;
out = new BufferedOutputStream(clob.getAsciiOutputStream());
byte[] buffer = new byte[512];
int bytesRead = -1;
while((bytesRead = inStream.read(buffer)) > -1)
out.write(buffer, 0, bytesRead);
我知道这有点不清楚,但它的一般要点是它创建了 Clob
的 AsciiOutputStream
(是的,它应该是一个 Clob
) 并将其写入从先前方法传递的 inStream
对象。
由于 File.delete();
方法,他们确信这不会写入文件目录,但我确实知道昨天那个位置有一个文件,并且此代码今天运行并在该确切位置写入了一个文件。因为,虽然实际的 file 被删除了,但是那个文件所在位置的 pointer 仍然在 outFile
中,而 的创建inStream
和 outFile
使 inStream
指向该位置。
有什么理由相信在这种情况下不会写入此文件?理想情况下,我想要一些证据证明 delete()
方法删除了 File
对象指向 的文件,而不是指针本身。
最佳答案
java.io.File
不是文件指针,也不包含文件指针。它是一个不可变的路径名。
An abstract representation of file and directory pathnames.
Instances of this class may or may not denote an actual file-system object such as a file or a directory.
Instances of the
File
class are immutable; that is, once created, the abstract pathname represented by aFile
object will never change.
与 the source code for File
,我们可以看到它是 String
的包装器。
delete
无法删除文件指针,因为没有文件指针。
Deletes the file or directory denoted by this abstract pathname.
打开文件的连接由 java.io.FileDescriptor
表示:
Instances of the file descriptor class serve as an opaque handle to the underlying machine-specific structure representing an open file […].
这是输入/输出流与文件系统交互的方式,而不是通过 File
,例如 FileOutputStream(File)
解释如下:
Creates a file output stream to write to the file represented by the specified
File
object. A newFileDescriptor
object is created to represent this file connection.If the file […] does not exist but cannot be created, or cannot be opened for any other reason then a
FileNotFoundException
is thrown.
我们可以观察到,例如,the constructor for FileOutputStream
委托(delegate)给 File
的路径 String
,检查它是否有效,然后丢弃 File
:
public FileOutputStream(File file, boolean append)
throws FileNotFoundException
{
String name = (file != null ? file.getPath() : null);
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkWrite(name);
}
if (name == null) {
throw new NullPointerException();
}
if (file.isInvalid()) {
throw new FileNotFoundException("Invalid file path");
}
this.fd = new FileDescriptor();
fd.attach(this);
this.append = append;
open(name, append);
}
没有文档支持 java.io.File
表示文件指针的想法。 ; )
我们还知道,打开的文件句柄是一种必须在某个时候释放的资源,但是 File
没有提供这样做的方法;因此,File
不符合我们对文件指针应该是什么的概念。
关于java - File.delete() 是否删除 File 对象的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29437078/
我写了这个课: class StaticList { private: int headFree; int headList; int locNe
我目前正在使用 SQL Server Management Studio 2005,我遇到了一些问题,但首先是我的 DB 架构的摘录(重要的): imghack link to the image 我
范围:两个表。创建新顾客时,他们会将一些有关他们的信息存储到第二个表中(这也是使用触发器完成的,它按预期工作)。这是我的表结构和关系的示例。 表 1-> 赞助人 +-----+---------+--
我想知道,在整个程序中,我使用了很多指向 cstrings 的 char* 指针,以及其他指针。我想确保在程序完成后删除所有指针,即使 Visual Studio 和 Code Blocks 都为我做
考虑以下代码: class Foo { Monster* monsters[6]; Foo() { for (int i = 0; i < 6; i++)
关于 this page , 是这么写的 One reason is that the operand of delete need not be an lvalue. Consider: delet
我无法在 DELETE CASCADE ON UPDATE CASCADE 上添加外键约束。 我使用两个简单的表格。 TAB1 有 2 列:ID int(10) unsigned NOT NULL A
你好,有没有办法把它放在一个声明中? DELETE e_worklist where wbs_element = '00000000000000000054TTO'. DELETE e_workli
我有一个表,它是我系统的核心,向我的客户显示的所有结果都存储在那里。它增长得非常快,因此每 3 小时我应该删除早于 X 的记录以提高性能。 仅删除这些记录就足够了,还是应该在删除后运行优化表? 我正在
这个问题在这里已经有了答案: delete vs delete[] operators in C++ (7 个答案) 关闭 9 年前。 做和做有什么区别: int* I = new int[100]
为什么这段代码是错误的?我是否遗漏了有关 delete 和 delete[] 行为的内容? void remove_stopwords(char** strings, int* length) {
当我使用 new [] 申请内存时。最后,我使用 delete 来释放内存(不是 delete[])。会不会造成内存泄漏? 两种类型: 内置类型,如 int、char、double ... 我不确定。
所以在代码审查期间,我的一位同事使用了 double* d = new double[foo]; 然后调用了 delete d。我告诉他们应该将其更改为 delete [] d。他们说编译器不需要基本
范围:两个表。当一个新顾客被创建时,他们将一些关于他们的信息存储到第二个表中(这也是使用触发器完成的,它按预期工作)。这是我的表结构和关系的示例。 表 1-> 赞助人 +-----+---------
C++14 介绍 "sized" versions of operator delete ,即 void operator delete( void* ptr, std::size_t sz ); 和
我正在执行类似的语句 DELETE FROM USER WHERE USER_ID=1; 在 SQLDeveloper 中。 由于用户在许多表中被引用(例如用户有订单、设置等),我们激活了 ON DE
出于某种原因,我找不到我需要的确切答案。我在这里搜索了最后 20 分钟。 我知道这很简单。很简单。但由于某种原因我无法触发触发器.. 我有一个包含两列的表格 dbo.HashTags |__Id_|_
这是我的代码: #include #include #include int main() { setvbuf(stdout, NULL, _IONBF, 0); setvbuf
是否可以在 postgres 中使用单个命令删除所有表中的所有行(不破坏数据库),或者在 postgres 中级联删除? 如果没有,那么我该如何重置我的测试数据库? 最佳答案 is it possib
我想删除一些临时文件的内容,所以我正在开发一个小程序来帮我删除它们。我有这两个代码示例,但我对以下内容感到困惑: 哪个代码示例更好? 第一个示例 code1 删除文件 1 和 2,但第二个示例 cod
我是一名优秀的程序员,十分优秀!