为什么没有写入我的文件?

时间:2014-02-18 19:06:47

标签: java file output filewriter bufferedwriter

我有一个我正在处理的程序,我在将一个字符串写入我的文件时遇到了问题。该文件已创建,但应写入其中的字符串值最终不会被写入。根据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,当按下它时,应执行以下操作:

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();
        } 
    }

5 个答案:

答案 0 :(得分:3)

我强烈怀疑你是否记录了异常 - 你应该改进你的异常处理,但是如果你 要记录异常,你真的需要在事情发生时查看日志工作!

这几乎肯定是问题所在:

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

您正在为同一个文件创建两个FileWriter。第一个存在将阻止第二个被正确创建。

但是,还有很多其他要点需要注意:

  • FileWriter始终使用平台默认编码。我更喜欢明确指定编码,通常是UTF-8。
  • 创建新的FileWriter(或FileOutputStream)已经创建了该文件(如果该文件不存在),因此您的createFile方法毫无意义(除非您确实需要检查该文件以前存在)
  • 您应始终在finally块中关闭流资源,或在Java 7中使用try-with-resources语句。

尽管如此,库可以使更多这类事情变得更简单。我会使用Guava将您的整个代码重写为:

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

声明您的方法可以抛出IOException,或者如果您 想要在方法中处理它,请抓住它。

如果您真的想手动执行此操作:

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

答案 1 :(得分:1)

如果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.flush();
            output.close();


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

或者添加一个stringReader:BufferedReader reader = new BufferedReader(new StringReader(content));

答案 2 :(得分:1)

txt.getText();可能是空的。

然而,JavaDoc也警告过这一点,关于createNewFile:

  

当且仅当具有此名称的文件尚不存在时,以原子方式创建一个由此抽象路径名命名的新空文件。

答案 3 :(得分:1)

输入此代码。它可以帮助您将一个文件复制到另一个文件,并只复制文件中的文件。

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();
    }
}

答案 4 :(得分: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();
    }