2016-08-22 2 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

ожидается выход:

QQQQQQQQQQQQQQQ zzzzzzzzzzzzzzz

+0

Предлагаю напечатать оригинальную строку ** перед ** ее модификацией. С точки зрения пользователя, это одно и то же. –

+0

Но разве я этого не делаю? – Minerbob

+0

Извините, я сейчас более внимательно смотрю на ваш код. Я не совсем понимаю, с чем вы столкнулись. Это поможет, если вы покажете пример запуска вашей программы и объясните, как фактический вывод отличается от того, что вы хотите. –

ответ

1

Параметр fileName в modifyFile не является необходимым и вводит в заблуждение. Файл уже загружен, и содержимое хранится на объекте, поэтому метод просто нужно изменить его:

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

В вашей основной метод, просто вызовите

startupModified.modifyFile(); 
+0

исправлено - изначально я пытался взять исходный текст в качестве параметра, а затем изменить его. Спасибо – Minerbob

+0

Оригинальный текст Quilt Quilt Bob должен отображать Quilt Quilt Bob zuilt zuilt Bob – Minerbob

0

В вашем коде, вы пытаетесь создать объект Scanner из нового файла, а указанное вами имя файла является недопустимым именем файла.

Кроме того, вы попытались закодировать два класса в одном java-файле, не делая ModifyStartupFile внутренним классом. Вы можете создать внутренний класс, следуя моему примеру:

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. Этот класс не может быть создан внутри другого открытого класса с спецификатором доступа для общественности. В моем примере спецификатор доступа был закрытым. Код по-прежнему вызывает исключение 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

Я чувствую себя болваном. Файл, который я использовал для тестирования, был довольно большим. Мой терминал только дал мне результат для части последних модифицированных строковых значений. Поэтому я сделал предположение, что он печатал только модифицированные значения.

Я сменил терминал blue-jay на неограниченную буферизацию, и теперь он отображается полностью и правильно.

Благодарим вас за указатели в названии и за помощь в использовании кода. Я дольчик.