A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 龚首道 于 2013-7-12 12:58 编辑

我本来是想写一个程序:在c盘下创建一个以“a”为前缀,“b”为后缀的临时文件。编译通过,运行起来的时候,电脑就处于“死尸”状态,只可以移动窗体,不能做其他任何操作。
无奈只能强制关机,结果·····
就再也没有启动起来,后来拿PE一看,好家伙,主分区都被格式化了!

为什么会删除那个目录下的全部文件?我明明只是想创建一个叫"a.b"的 临时文件啊。
代码如下:
  1. import java.io.*;
  2. class  FileDemo
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 consMethod();
  7.         }
  8.         public static void consMethod()
  9.         {

  10.                 File f = new File(“c:\\”);
  11.                 f.createTempFile("a","b",f);

  12.         }
  13. }
复制代码
可不可以再给磁盘分个区出来,存些文件进去,然后将上面代码的路径改为新创建的这个分区的路径,然后做个验证?
真怕再把电脑给搞挂了```

点评

说错了 U盘启动 PE下 用DISKGENIUS 做格式化恢复  发表于 2013-7-12 22:44
我拿别人电脑试试。。。我很难相信操作系统底层就这么脆弱,而且根据我的常识 在操作系统运行时完成对它的根式化,PE状态下用Diskgenius做格式化....  发表于 2013-7-12 22:43

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 楼主是勇士

查看全部评分

9 个回复

倒序浏览

回帖奖励 +1

我觉得应该是上面那句 File f = new File(“c:\\”);出错了,因为你下面的前缀名是a,小于三个字符,会抛异常
下面是我查的jdk里面的内容
createTempFile
public static File createTempFile(String prefix,
                                  String suffix,
                                  File directory)
                           throws IOException在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。如果此方法成功返回,则可以保证:

由返回的抽象路径名表示的文件在此方法被调用之前不存在。
此方法及其所有变体都不会在虚拟机的当前调用中再次返回相同的抽象路径名。
此方法只提供了临时文件的部分功能。要安排自动删除此方法创建的文件,可使用 deleteOnExit() 方法。
prefix 参数至少必须是三个字节长。建议前缀使用一个短的、有意义的字符串,比如 "hjb" 或 "mail"。suffix 参数可以为 null,在这种情况下,将使用后缀 ".tmp"。

要创建新文件,可能首先要调整前缀和后缀,使其满足底层平台的限制。如果前缀太长,则将它截断,但前三个字符将始终保留。如果后缀太长,则将它截断,但如果它以句点字符 ('.') 开始,则该句点以及后跟的前三个字符将始终保留。进行了这些调整后,通过连接前缀、五个或更多个内部生成的字符以及后缀,便生成了新文件的名称。

如果 directory 参数为 null,则使用与系统有关的默认临时文件目录。默认临时文件目录由系统属性 java.io.tmpdir 指定。在 UNIX 系统上,此属性的默认值通常是 "/tmp" 或 "/var/tmp";在 Microsoft Windows 系统上,该值通常是 "C:\\WINNT\\TEMP"。在调用 Java 虚拟机时,可为此系统属性提供不同的值,但不保证使用程序更改此属性会对此方法使用的临时目录产生影响。


参数:
prefix - 用于生成文件名的前缀字符串;必须至少是三字符长
suffix - 用于生成文件名的后缀字符串;可以为 null,在这种情况下,将使用后缀 ".tmp"
directory - 将创建的文件所在的目录;如果使用默认临时文件目录,则该参数为 null
返回:
表示新建空文件的抽象路径名
抛出:
IllegalArgumentException - 如果 prefix 参数包含的字符少于三个
IOException - 如果无法创建文件
SecurityException - 如果存在安全管理器,且其 SecurityManager.checkWrite(java.lang.String) 方法不允许创建文件
从以下版本开始:
1.2

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 赞一个!

查看全部评分

回复 使用道具 举报
chslzj 发表于 2013-7-12 13:16
我觉得应该是上面那句 File f = new File(“c:\\”);出错了,因为你下面的前缀名是a,小于三个字符,会抛 ...

是的,原来的前后缀分别是dao,abc,为了方便我改成a和b了,这样的话,编译就不能成功,防止大家一冲动就给用了…文档里是这样写的,但是我好不清楚c盘被格的原因
回复 使用道具 举报
本帖最后由 Jiewin 于 2013-7-12 21:26 编辑

膜拜大神ing...


大神,你是直接把C:\\这个目录当做临时文件目录了,按我的理解来看,那不叫格式化,而是替换,
你的代码是产生一个新的C:\\,不修饰的说是新建一个C盘,你牛,java默认的是如果这个目录存在,就会被覆盖。你是云5的大神了!膜拜中....

你应该在C盘下新建一个文件夹,把目录指向该文件夹,你的C盘就不会被格式化了,格式化的是刚创建的哪个文件夹

点评

我觉得你被我误导了、、、我的第一反应跟你一样,是覆盖了,可是这个方法确实没有覆盖的说明  发表于 2013-7-12 22:18
回复 使用道具 举报

new File()方法不会覆盖文件的:L,如果覆盖了,我们怎读取一个文件呢? File 类还有一个exists方法,判断是否存在文件的,所以,没有写方法的调用,是不会覆盖的。对于这个问题,手头没有U盘,,不能实验,哎
回复 使用道具 举报
chslzj 发表于 2013-7-12 22:16
new File()方法不会覆盖文件的,如果覆盖了,我们怎读取一个文件呢? File 类还有一个exists方法,判 ...

:handshake学习了,刚才试了下,楼主应该在插入代码前把代码改了,
我改回来后
f.createTempFile("dao","abc",f);这样执行,结果没问题的,能在G盘下产生一个以dao开头接着一串随机数字并abc结尾的无扩展名的空文件,
但f.createTempFile("a","b",f);报IllegalArgumentException异常,但不会格式化我的u盘,
被格式化和java无关吧,可能是楼主系统的的问题
回复 使用道具 举报
Jiewin 发表于 2013-7-12 23:29
学习了,刚才试了下,楼主应该在插入代码前把代码改了,
我改回来后
f.createTempFile("dao"," ...

可能是因为我的命令行使用的管理员账户,权限比较高。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马