Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么没有任何东西写入我的文件?_Java_File_Output_Filewriter_Bufferedwriter - Fatal编程技术网

Java 为什么没有任何东西写入我的文件?

Java 为什么没有任何东西写入我的文件?,java,file,output,filewriter,bufferedwriter,Java,File,Output,Filewriter,Bufferedwriter,我有一个程序,我正在工作,我有一个问题写入字符串到我的文件。文件已创建,但最终不会写入应写入其中的字符串值。根据Eclipse,没有语法错误,所以我认为这是一个语义错误 public boolean createFile() { try { f = new File("house.txt"); if(!f.exists()) { f.createNewFile(); exists =

我有一个程序,我正在工作,我有一个问题写入字符串到我的文件。文件已创建,但最终不会写入应写入其中的字符串值。根据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();
        } 
    }

如果
attribute=txt.getText()为空,它不会向文件写入任何内容

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();
    }
}
否则,我会这样做

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=new BufferedReader(new stringReader(content))

txt.getText()可能为空

不过,JavaDoc还警告createNewFile:

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


我强烈怀疑您正在记录异常-无论如何,您应该改进您的异常处理,但是如果您要记录异常,那么当事情不起作用时,您确实需要查看日志

这几乎肯定是问题所在:

fWriter = new FileWriter(f);
String content = attribute;         
BufferedWriter output = new BufferedWriter(new FileWriter(f));
您正在为同一个文件创建两个
FileWriter
s。第一个的存在将阻止第二个被正确创造

但是,您还需要注意以下几点:

  • FileWriter
    始终使用平台默认编码。我更喜欢显式地指定编码,通常是UTF-8
  • 如果文件不存在,则创建新的
    FileWriter
    (或
    FileOutputStream
    )已创建该文件,因此
    createFile
    方法毫无意义(除非您确实需要检查该文件以前是否存在)
  • 您应该始终在
    finally
    块中关闭流资源,或者在Java 7中使用try with resources语句
不过,库可以使这类事情简单得多。我会将您的整个代码重写为:

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

您真正需要的是:

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

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

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

我强烈怀疑您得到了一个异常,应该打印到控制台。(顺便说一句,这不是一个很好的异常处理)看看这里。请注意,您当前正在尝试为同一个文件创建两个
FileWriter
对象。。。这不太可能起作用。@user503413:不需要关闭调用-尽管这应该在finally块中,或者使用try-with-resources。还要注意,您根本不需要使用
File.createNewFile()
。创建
FileWriter
将在必要时创建该文件。@user3324895:我什么时候说过您不需要调用close?我说如果你调用close,你不需要调用flush。在@user2864740的辩护中:我想你也说过同样的话,JonSkeet。他在一篇评论中说,他尝试了一个手动创建的字符串,但仍然没有写入。我还刚刚注释掉了createFile()的方法调用,其中包含.createNewFile(),考虑到上面某个人的建议,他建议FileWriter无论如何都会创建文件。还是没什么。嗯,我很确定这应该会起作用,还有其他一些已经发布的解决方案。我开始认为这是我的ActionListener的问题。基本上,单击jbuttonadd将打开一个带有JComboBox的窗口,在选择一个选项表单时,JComboBox将打开一个带有文本字段和“确认”按钮的新框架。这两个按钮的ActionListener使用相同的方法。这可能与问题有关吗?很抱歉,我从未使用过Swing,因此我无法在这方面为您提供太多帮助,我将检查此代码是否正在执行,以及txt.getText()是否返回一个非空字符串。代码执行良好,并且在任何情况下都不会崩溃,因此问题不是语法性的。但是谢谢你。这里绝对没有必要开始使用
StringReader
——你认为这会有什么好处?您传播了最初的问题,即创建两个
FileWriter
s。OP声明即使将
txt.getText()
更改为“abc”,问题仍然存在,所以这肯定不是问题所在。是的,但我在那之前写过答案。所以你发现了真正的问题。或者在我看到回复之前:-)