2014-02-18 6 views
-1

나는 작업중인 프로그램을 가지고 있는데, 내 파일에 문자열을 쓰는 데 문제가있다. 파일이 생성되지만 궁극적으로 쓰여지는 문자열 값은 쓰여지지 않습니다. Eclipse에 따른 구문 오류가 없으므로 의미 상 오류가 있다고 가정합니다.내 파일에 아무 것도 쓰지 않는 이유는 무엇입니까?

public boolean createFile() 
{ 
    try 
    { 
     f = new File("house.txt"); 
     if(!f.exists()) 
     { 
      f.createNewFile(); 
      exists = true; 
     } 
     else 
      exists = false; 
    } 
    catch(IOException e) 
    { 
     e.printStackTrace(); 
    } 
    return exists; 
} 

파일을 만드는 방법입니다. 다음은 파일에 실제로 쓴 메서드이며 성공적으로 만들어집니다. 액션은, 누르면,이 수행해야하는 JButton에서 파생 : attribute = txt.getText();가 비어

if(evt.getActionCommand().equals("CONFIRM")) 
    { 
     attribute = txt.getText(); 
     try 
     { 
      createFile(); 
      fWriter = new FileWriter(f); 
      String content = attribute;   
      BufferedWriter output = new BufferedWriter(new FileWriter(f)); 
      output.write(content); 
      output.close(); 

     } catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
+0

이 항목은 비 었습니까? : attribute = txt.getText(); – Sembrano

+1

예외가 발생하는 것 같아요. 콘솔에 출력해야합니다. (이것은 * 좋은 예외 처리, btw가 아닙니다.) 거기를보십시오. 현재 같은 파일에 대해 두 개의'FileWriter' 객체를 만들려고하는데, 그럴 가능성은 없습니다. –

+0

쓰기 후에 플러시 메서드를 호출하십시오. –

답변

1

경우 실 거예요 파일에 아무것도 쓰지.

그렇지 않으면.

if(evt.getActionCommand().equals("CONFIRM")) 
    { 
     attribute = txt.getText(); 
     try 
     { 
      createFile(); 
      fWriter = new FileWriter(f); 
      String content = attribute;   
      BufferedWriter output = new BufferedWriter(new FileWriter(f)); 
      output.write(content); 
      output.flush(); 
      output.close(); 


     } catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

또는 그 밖에 StringReader를 추가 BufferedReader reader = new BufferedReader(new StringReader(content));

+0

여기에'StringReader'를 사용하기 시작할 필요가 절대적으로 없습니다 * 당신이 생각하는 이점은 무엇입니까? 그리고 두 개의'FileWriter'를 생성하는 원래의 문제를 전파했습니다. OP는'txt.getText()'가 "abc"로 변경 되더라도 문제가 지속된다고 말 했으므로 이것은 분명히 문제가되지 않습니다. –

+0

예,하지만 그 전에 답을 썼습니다. 그래서 당신은 진짜 문제를 발견했습니다. – Sembrano

+0

또는 내가 답글을보기 전에 :-) – Sembrano

1

txt.getText(); 아마 비어 있습니다.

Javadoc가도 때 createNewFile에 대해,하지만,이 경고 :

원자 적으로 만이 이름의 파일이 아직 존재하지 않는 경우 경우이 추상 패스 명이 나타내는 하늘의 새로운 파일을 생성합니다.

+0

그는 수작업으로 만든 문자열을 시도했지만 아직 작성하지 않았다는 의견을 밝혔습니다. – ryvantage

+0

나는 또한 FileWriter가 본질적으로 파일을 만들 것이라고 제안한 사람의 조언을 고려하여 createFile()에 대한 메소드 호출을 주석 처리했다. 아직 아무것도. – Code4Fun

3

나는 강력하게 예외가 기록 얻고있는 생각 - 어쨌든 처리하여 예외를 개선해야하지만, 당신이 예외를 기록을려고하는 경우에, 당신은 정말 사물이 작동하지 않는 경우 로그에 볼 필요가 ! 당신은 같은 파일이 FileWriter의를 만드는

fWriter = new FileWriter(f); 
String content = attribute;   
BufferedWriter output = new BufferedWriter(new FileWriter(f)); 

:

이 거의 확실히 문제입니다. 첫번째 것의 존재는 두번째 것을 제대로 만들지 못하게 할 것입니다.

그러나, 다른 점을 충분히 당신이주의해야 있습니다 :

  • FileWriter 항상 플랫폼의 디폴트 인코딩을 사용합니다. 나는 인코딩을 명시 적으로 선호하는데, 일반적으로 UTF-8이다. 만들기
  • 새로운 (당신이 정말로 파일이 이전에 존재하는지 여부를 확인해야하지 않는 한) 항상 닫기해야하므로 createFile 방법은 무의미,
  • 존재하지 않는 경우 이미 파일을 생성 FileWriter (또는 FileOutputStream) 스트림에있는 자원 finally 블록 또는 Java 7에

라이브러리를 시도 -과 - 자원 문을 사용하여 훨씬 간단하지만 것은 이런 종류의를 만들 수 있습니다. 당신의 방법은 IOException를 던져, 또는 정말이 방법을 처리하는 경우를 잡을 수

if (evt.getActionCommand().equals("CONFIRM")) { 
    Files.write(txt.getText(), new File("house.txt"), StandardCharsets.UTF_8); 
} 

선언 : 나는대로 전체 코드를 다시 작성 Guava 사용할 수 있습니다.

당신이 정말로 수동으로 수행 할 경우

:

if (evt.getActionCommand().equals("CONFIRM")) { 
    try (Writer writer = new OutputStreamWriter(
     new FileOutputStream("house.txt"), StandardCharsets.UTF_8)) { 
    writer.write(txt.getText()); 
    } 
} 
0

당신이 정말로 필요로하는 것은 이것이다 : 다음 존재하지 않는

try {  
     BufferedWriter output = new BufferedWriter(new FileWriter(new File("house.txt"))); 
     output.write(txt.getText()); 
     output.close(); 

    } catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 

house.txt 경우가 생성됩니다. txt.getText()이 문자열을 반환하면 house.txt에 기록됩니다.

가능한 경우 try-with-resources 문을 사용하여 try 블록을 종료 한 후에 스트림을 닫을 것을 제안합니다.

try (BufferedWriter output = new BufferedWriter(new FileWriter(new File("house.txt")))){ 
     output.write(txt.getText()); 
    } 
    catch (IOException e) { 
     e.printStackTrace(); 
    } 
+0

흠, 게시 된 몇 가지 다른 솔루션과 함께 이것이 제대로 작동 할 것이라 확신합니다. 내 ActionListener에 문제가 있다고 생각하기 시작했습니다. 본질적으로 Jbutton 추가는 클릭하면 JComboBox가있는 창을 열어 JcomboBox가 새로운 프레임이 텍스트 필드와 "확인"버튼으로 열리는 옵션 양식을 선택합니다. 이 두 버튼의 ActionListener는 동일한 메소드에 있습니다. 그게 그 문제와 관련이 있을까요? – Code4Fun

+0

죄송합니다. 나는 스윙을 사용 해 본 적이 없으므로 그다지 도움이되지 않습니다.이 코드가 실행되고 있는지, txt.getText()가 비어 있지 않은 문자열을 반환하는지 확인합니다. – Alex

+0

코드가 제대로 실행되고 어떤 인스턴스에서든 충돌하지 않으므로 문제는 구문 적으로 발생하지 않습니다. 하지만 고마워. – Code4Fun

0

이 코드를 입력하십시오. 하나의 파일을 다른 파일로 복사하는 데 도움이되며 파일에있는 문장 만 복사합니다.

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileReader; 
import java.io.FileWriter; 

public class Reader { 
    public static String reverse(String s) 
    { 
     String str= new String(""); 
     for(int i=s.length()-1;i>=0;i--) 
     { 
      str+=s.charAt(i); 
     } 
     return str; 
    } 

    public static void main(String[] args) throws Exception { 
     //File m=new File("C:\\bg/newfile.txt"); 
     int count=0; 
     FileReader f=new FileReader("C:\\bg/newfile.txt"); 
     FileWriter fa=new FileWriter("C:\\bg/newfile1.txt"); 
     BufferedReader bf=new BufferedReader(f); 
     BufferedWriter br=new BufferedWriter(fa); 
     String line=bf.readLine(); 
     //String li=br.newLine(); 
     while(line!=null) 
     { 
      String[] sa=line.split(" "); 
      for(String a:sa) 
      { 
       if(a.equals(reverse(a))) 
       { 
        System.out.println(a); 
        br.write(a); 
        br.newLine(); 
        count++; 
       } 
       //System.out.println(count+""+a); 
      } 
      //br.newLine(); 
      line=bf.readLine(); 
     } 
     bf.close(); 
     br.close(); 
    } 
}