2016-02-10 7 views
0

У меня, похоже, проблема с 1.8 JDK, этот проект был построен с использованием 1,7 JDK, но у меня проблема, которую я не могу понять.Java 1.8 FileOutputStream Создание каталога

У меня есть класс ConfigReader.

public class ConfigReader { 
    private static ConfigReader _inst; 

    public static ConfigReader GetInstance(){ 
     if(_inst == null){ 
      _inst = new ConfigReader(); 
     } 
     return _inst; 
    } 

    private String basePath = "Config/"; 

    public <T extends Serializable> void Write(T in, String filename) 
    { 
     String path = basePath+filename+".bin"; 
     try 
     { 
      File f = new File(path); 
      f.mkdirs(); 
      FileOutputStream fileOut = 
      new FileOutputStream(path); 
      ObjectOutputStream out = new ObjectOutputStream(fileOut); 
      out.writeObject(in); 
      out.close(); 
      fileOut.close(); 
      System.out.println("Saved config file '"+path+"'"); 
     }catch(IOException i) 
     { 
      System.out.println("Failed to create config file '"+path+"'"); 
     } 
    } 

    public boolean ConfigExists(String filename) 
    { 
     String path = basePath+filename+".bin"; 
     File finfo = new File(path); 
     return finfo.exists(); 
    } 

    public <T extends Serializable> T Read(T readin, String filename) 
    { 
     String path = basePath+filename+".bin"; 
     try 
     { 
      FileInputStream fileIn = new FileInputStream(path); 
      ObjectInputStream in = new ObjectInputStream(fileIn); 
      readin = (T) in.readObject(); 
      in.close(); 
      fileIn.close(); 
      return readin; 
     }catch(IOException i) 
     { 
      System.out.println("Failed to read '"+path+"'"); 
      return null; 
     }catch(ClassNotFoundException c) 
     { 
      System.out.println("Failed to unserialize '"+path+"'"); 
      c.printStackTrace(); 
      return null; 
     } 
    } 
} 

Но по какой-то причине, когда метод записи называется это создание каталогов ЭГ

Чтение файла:

boolean cfgExists = ConfigReader.GetInstance().ConfigExists("Global.cfg"); 
if(_inst == null && !cfgExists){ 
    _inst = new Global(); 
}else if(cfgExists){ 
    _inst = ConfigReader.GetInstance().Read(_inst, "Global.cfg"); 
} 

Написание файла:

ConfigReader.GetInstance().Write(this, "Global.cfg"); 

Я в конечном итоге с пустым каталогом «Global.cfg.bin», а не с файлом. я немного смущен, почему это происходит сейчас ...

+0

'ObjectOutputStream' не имеет к этому никакого отношения или сериализации. – EJP

+0

@ EJP хорошо, это как-то связано с записью содержимого файла, и вы не можете записывать содержимое файла в папку, которая должна быть файлом. так что это должно быть ошибка ... но это не так. –

+0

№ Файл создан, или нет, с помощью 'FileOutputStream', и написан, или нет, так же. «ObjectOutputStream» построен впоследствии и не делает никаких операций ввода-вывода, уничтожая все это до «FileOutputStream». Ergo ничего не делает с ним – EJP

ответ

2

Ваш вызов f.mkdirs() создает каталог с пути, который идентичен указанному пути к файлу. Вместо этого вызовите f.getParentFile().mkdirs(), и это должно очистить его.

+0

Итак, JDK 1.8 изменил его так, что mkdirs теперь игнорирует расширения файлов ... –

+1

Я мог ошибаться, но я не думаю, что это когда-либо было. По крайней мере, ничто в javadoc, идущем вплоть до 1.5.0, не укажет, что оно будет обрабатывать имена с периодами в них как Файлы, а не dirs ... но кто действительно знает? :) – CodeBlind

+0

@MartinBarker Этого никогда не было. – EJP