2016-08-22 13 views
0

私はJavaを学び始めています。私は単純なプログラムがうまく動作するようになっています。 目的は、テキストファイルを文字列値に追加することです。その後、文字列を変更します。 元のテキストを表示 変更されたテキストを表示します。Java共有オブジェクト

問題は両方のオブジェクトが変更された文字列を表示することです。 私はobject = object2と言っていて、object2オブジェクトを変更した場合、オブジェクトへの参照をコピーしてから影響が出るという概念を理解しています。

この場合、オブジェクトと見なされるテキストファイルですか?私はそれをどうやって得るのですか?

import java.util.Scanner; 
import java.io.File; 

public class StartUpFile 
{ 
    private String fileText; 
    /** 
    * Constructor for objects of class StartUpFile 
    */ 
    public StartUpFile(String fileName) 
    { 
     readFile(fileName); 
    } 
    /** 
    * Loads the text file into the class\object 
    */ 
    public void readFile(String fileName) 
    { 
     fileText = ""; 
     try 
     { 
      Scanner file = new Scanner(new File(fileName)); 
      while (file.hasNextLine()) 
      { 
       String line = file.nextLine(); 
       fileText += line + "\n"; 
      } 
      file.close(); 
     } 
     catch (Exception e) 
     { 
      System.out.println(e); 
     } 
    } 

    public String showFileText() 
    { 
     return fileText; 
    } 

    public void modifyFileText() 
    {  
     fileText = fileName.replaceAll("Q", "z"); 
    } 
} 

public class ModifyStartupFile 
{ 
    public static void main(String[] args) 
    { 
     StartUpFile startup = new StartUpFile("1.startup"); 
     StartUpFile startupModified = new StartUpFile("1.startup"); 

     System.out.println(startup.showText()); 

     startupModified.modifyFileText(); 
     System.out.println(startupModified.showText()); 
    } 
} 

ファイルの内容: QQQQQQQQQQQQQQQ

予想される出力:modifyFile

QQQQQQQQQQQQQQQ zzzzzzzzzzzzzzz

+0

元の文字列**を**変更する前に印刷することをおすすめします。ユーザーの視点から見ると、これは同じことです。 –

+0

しかし、私はこれをしないのですか? – Minerbob

+0

申し訳ありません、あなたのコードをちょうど詳しく見ています。私はあなたが何を問題にしているのか本当に理解していない。プログラムの実行例を表示し、実際の出力がどのように異なるかを説明すると役に立ちます。 –

答えて

1

fileNameパラメータが不要と誤解を招く恐れがあります。ファイルがすでにロードされている、およびコンテンツは、オブジェクトに格納されているので、この方法はそれを修正する必要がある:あなたの主な方法で

public void modifyFile() { 
    fileText = fileText.replaceAll("Q", "z"); 
} 

、単にあなたのコードでは

startupModified.modifyFile(); 
+0

固定 - もともとは元のテキスト出力をパラメータとして取り込み、それを修正しようとしていました。ありがとうございます – Minerbob

+0

元のテキストキルトのキルトのボブは、キルトのキルトのボブを表示する必要があります zuilt zuiltボブ – Minerbob

0

を呼び出し、新しいファイルからScannerオブジェクトを作成しようとしていますが、指定したファイル名が無効なファイル名です。

また、ModifyStartupFileを内部クラスにせずに、1つのJavaファイルに2つのクラスをコーディングしようとしました。あなたは私の例を以下により内部クラスを作成することができます。

package test; 

public class Tester { 

public test.Tester.Hello getHelloObject() { 
    return new Hello(); 
} 

private class Hello { 

    void sayHello() { 
     System.out.println("hello"); 
    } 
} 

public static void main(String[] args) { 
    Tester dude = new Tester(); 
    Hello man = dude.getHelloObject(); 
    man.sayHello(); 
} 

}

出力:

hello 

私はクラスModifyStartupFileを除去することにより、コンパイルに作るためにあなたのコードを修正しました。このクラスは、アクセス指定子がpublicの別のパブリッククラス内では作成できません。私の例では、アクセス指定子はプライベートでした。ファイル名が無効なので、コードはFileNotFoundExceptionをスローします。ここに私の変更の最終結果である:

import java.util.Scanner; 
import java.io.File; 

public class StartUpFile { 

private String fileText; 

/** 
* Constructor for objects of class StartUpFile 
*/ 
public StartUpFile(String fileName) { 
    readFile(fileName); 
} 

/** 
* Loads the text file into the class\object 
*/ 
public void readFile(String fileName) { 
    fileText = ""; 
    try { 
     Scanner file = new Scanner(new File(fileName)); 
     while (file.hasNextLine()) { 
      String line = file.nextLine(); 
      fileText += line + "\n"; 
     } 
     file.close(); 
    } catch (Exception e) { 
     System.out.println(e); 
    } 
} 

public String showFile() { 
    return fileText; 
} 

public void modifyFile(String fileName) { 
    fileText = fileName.replaceAll("Q", "z"); 
} 

public static void main(String[] args) { 
     StartUpFile startup = new StartUpFile("1.startup"); 
     StartUpFile startupModified = new StartUpFile("1.startup"); 

     System.out.println(startup.showFile()); 

     startupModified.modifyFile(startupModified.showFile()); 
     System.out.println(startupModified.showFile()); 
    } 

}

出力:

java.io.FileNotFoundException: 1.startup (The system cannot find the file specified) 
java.io.FileNotFoundException: 1.startup (The system cannot find the file specified) 
0

私はまぬけのように感じます。私がテストに使ったファイルはかなり大きかった。私の端末は、最後に変更された文字列値の一部の出力しか与えませんでした。だから私は変更された値だけを印刷しているという前提を立てました。

ブルージェイ端末を無制限のバッファリングに変更したところ、完全に正しく表示されました。

名前付けの指針を教えていただきありがとうございます。 私はダルテです。

関連する問題