2016-08-03 12 views
0

イム:ファイルのこのコードでファイルが作成されないのはなぜですか?これらの方法でファイルを作成しようとしている

private boolean createFileMain(String path){ 
    File file = new File(path); 
    if(file.isDirectory()){ 
     return this.createDirectory(file); 
    } else if(file.isFile()) { 
     return this.createFile(file); 
    } else { 
     return false; 
    } 
} 

private boolean createFile(File file){ 
    if(!file.exists()){ 
     if(file.getParentFile().exists()){ 
      try{ 
       if(file.createNewFile()){ 
        return true; 
       } 
      }catch(IOException e){ 
       return false; 
      } 
     } else { 
      if(this.createDirectory(file)){ 
       this.createFile(file); 
      } else { 
       return false; 
      } 
     } 
    } 
    return true; 
} 

private boolean createDirectory(File file){ 
    if(!file.exists()){ 
     if(file.mkdirs()){ 
      return true; 
     } 
     return false; 
    } 
    return true; 
} 

パス:

/ユーザ/ユーザ名/ディレクトリ/アカウント/

/ユーザ/ユーザ名/ディレクトリ/ SRCS/FILE1.TXT

/Users/username/Directory/file2.txt

このメソッドを実行しようとすると、StackOverFlowErrorがスローされます。

public void writeInFile(String path, List<String> content) { 
    if ((new File(path)).exists()) { 
     try { 
      writer = new PrintWriter(path, "ASCII"); 
      for (String contentItem : content) { 
       writer.println(contentItem); 
      } 
      writer.close(); 
     } catch (FileNotFoundException e1) { 
      //DO STUFF 
     } catch (UnsupportedEncodingException e) { 
      //DO STUFF 
     } 
    } else { 
     this.createFileMain(path); 
     this.writeInFile(path, content); 
    } 

なぜファイルが作成されないのですか?

+2

デバッグしましたか?また、キャッチブロックにロギングを追加してください。何か問題が発生した場合は少なくとも通知を受けます – Stultuske

答えて

0

createFileMainは、すでに存在するファイルのみを作成します。

書き込みするファイルを作成する必要はありません。書き込みを行うディレクトリだけが必要です。

public void writeInFile(String path, List<String> content) { 
    File file = new File(path); 
    File parent = file.getParentFile(); 
    if (parent != null && !parent.exists()) 
     parent.mkdirs(); 

    try (PrintWriter writer = new PrintWriter(path, "ASCII")) { 
     for (String contentItem : content) { 
      writer.println(contentItem); 
     } 
     writer.close(); 
    } catch (IOException e1) { 
     //DO STUFF 
    } 
} 
2

isDirectory()などでJavaDocsを読んだことがありますか? isDirectory()の場合:

この抽象パス名で示されたファイルが存在し、ディレクトリである場合にのみtrueを返します。そうでない場合はfalse

ディレクトリが存在しない場合は、falseを返し、作成しません。その後、StackOverFlowErrorを取得するまで、書き込みや作成、書き込みなどを続けます。

スタックオーバーフローを修正するには、作成ファイルの戻り値を確認する必要があります。

boolean created = this.createFileMain(path); 
if(created) { 
    this.writeInFile(path, content); 
} 

があなたのファイル/ディレクトリの作成を修正するには、(必要に応じても file.getParentFile().mkdirs()を経由して親ディレクトリを作成する)ファイルがすでに存在するかどうかをチェックし、そうでない場合は、それを作成する必要があります。

問題は、ファイルまたはディレクトリを作成するかどうかを知る必要があるということです。ファイルまたはディレクトリを作成するかどうかを知る必要があります。パス名がディレクトリかファイル名かを区別することはできません常に区切り文字でディレクトリパスを終了するか、ファイルに常に拡張子を付けるようにするなど)。とにかくファイルを作成する必要があるコンテンツを書きたい場合は、ディレクトリがコードを再び破棄します。

0
private boolean createFile(File file) { 
    if(!file.exists()) { 
     if(file.getParentFile().exists()) { 
      // ... 
     } else { // In this case, neither file nor its parent exist 
      if(this.createDirectory(file)) { 
       this.createFile(file); // HERE, you're calling the same method again 
      } else { 
       // ...; 
      } 
     } 
    } 
    return true; 
} 

私はあなたがthis.createFile(file.getParentFile());HEREをマークされた行を交換したいと考えています。ここで何が起こるかは、あなたの関数が再帰的に同じ引数でそれ自身を呼び出すので、何も起こりません、そして、あなたのプログラムはスタックメモリを使い果たすまでループに詰まります。

関連する問題