2016-03-15 4 views
1

Я сталкиваюсь с странной проблемой в наших доменах dev. Таким образом, в настоящее время наше приложение java работает на jdk1.6, мы планируем обновить его до 1,8. Так в настоящее время следующий код отлично работает в версии 1.6, но возвращает исключениеСоздание временного каталога в jdk 6 vs jdk 8

java.io.IOException: Unable to create temporary file, C:\Users\xxxxx\xxxxx\Local\Temp\XYZDirectory at java.io.File$TempDirectory.generateFile(File.java:1921) at java.io.File.createTempFile(File.java:2010) at java.io.File.createTempFile(File.java:2070)

1.8. код выглядит следующим образом -

File file = null; 
    try { 
     file = 
      File.createTempFile("XYZ", "Directory" + System.getProperty("file.separator")); 
     file.delete(); 
     file.mkdirs(); 
    } catch (final IOException e) { 
     e.printStackTrace(); 
    } 
    return file; 

Мы хотим, чтобы наш продукт был совместим с 1.6 и 1.8.

После некоторых исследований я обнаружил, что я, возможно, придется использовать следующий метод Files класса

public static Path createTempDirectory(Path dir, 
        String prefix, 
        FileAttribute<?>... attrs) 
          throws IOException 

Так у меня есть следующие вопросы -

1) Почему File.createTempFile генерирует исключение в 1.8?

2) Какова концептуальная разница между этими двумя методами?

3) Более того, если File.createTempFile больше не поддерживается, почему он не устарел?

4) Каков подходящий способ решения этой проблемы? Другими словами, я могу сделать программную проверку, чтобы использовать соответствующий метод на основе версии jdk, установленной в виртуальной машине, а затем продолжить создание временного каталога, но это лучший способ решить эту проблему?

+0

Java 8 не нравится вы пытаетесь включить 'System.getProperty ("File.separator")', как часть строки суффикса. –

+2

* «Почему File.createTempFile выбрасывает исключение в 1.8?» * Похоже, он не позволяет этому хаккишу (и плохому) способу создать временную директорию. – Tom

+2

'Files.createTempDirectory' - это то, что вы должны использовать. Не взламывайте свой путь. Я даже сбив с толку, что это сработало на Java 6. – Tunaki

ответ

-3

Это работает на обоих:

 File file = null; 
    try { 
     file = File.createTempFile("XYZ", "Directory"); 
     file.delete(); 
     file.mkdirs(); 
     System.out.println(file); 
    } catch (final IOException e) { 
     e.printStackTrace(); 
    } 
    return file; 

Я не знаю, почему конкатенации файла разделитель не удается, но это причина исключения. Я предполагаю, что разделитель программно вставлен в класс File и что вы добавляете его вручную, приводит к сбою.

С учетом сказанного, вот версия NIO введена в Java 7, рекомендуется:

import java.io.IOException; 
import java.nio.file.Files; 
import java.nio.file.Path; 

public class TempStackTest { 
    public Path getTempFilePath() { 
     Path path = null; 
     try { 
      path = Files.createTempFile("XYZ", "Directory"); 
      path.toFile().delete(); 
     } catch (final IOException e) { 
      e.printStackTrace(); 
     } 
     return path; 
    } 
} 
+2

Поскольку OP переносится с помощью Java 8, лучше всего использовать текущий современный API, например NIO .2 (который фактически присутствует с Java 7 уже). – Tunaki

+5

При использовании NIO используйте ['Files.createTempDirectory (...)'] (https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#createTempDirectory-java.nio .file.Path-java.lang.String-java.nio.file.attribute.FileAttribute ...-) в первую очередь, чтобы избавиться от «создать файл, чтобы просто удалить его впоследствии». И когда вам нужно удалить файл в NIO, используйте ['Files.delete (...)'] (https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html # удалить-java.nio.file.Path -), чтобы извлечь выгоду из API NIO (например, узнать о том, почему * не удалось удалить) вместо того, чтобы возвращаться в crap-IO через '.toFile(). Delete()' – Holger

+0

благодарю вас всех вас – Learner

Смежные вопросы