【问题标题】:Java : Problems accessing and writing to fileJava:访问和写入文件的问题
【发布时间】:2013-08-16 23:30:17
【问题描述】:

我正在测试使用此代码写入文件:

package files;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;

public class FileTest1 
{
public static void main(String[] args)
{
    try
    {
        try
        {
            File f = new File("filetest1.txt");
            FileWriter fWrite = new FileWriter(f);
            BufferedWriter fileWrite = new BufferedWriter(fWrite);
            fileWrite.write("This is a test!");
        }
        catch(FileNotFoundException e)
        {
            System.out.print("A FileNotFoundException occurred!");
            e.printStackTrace();
        }
    }
    catch(IOException e)
    {
        System.out.println("An IOException occurred!:");
        e.printStackTrace();
    }
}

}

执行时没有任何反应。 “这是一个测试!”没有写入,也没有 StackTrace 或“发生 A/An [异常]!”... 我不知道是什么导致了问题。我在文件下面的包中有fileTest1.txt...

【问题讨论】:

  • 你的代码是filetest1.txt,你的评论是fileTest1.txt?大多数文件系统都区分大小写。您可能还想刷新文件然后关闭它。
  • 你能显示你用来运行你的程序的命令吗?你在做它扔一些IDE吗?你在什么平台上运行?另外,你说“我在文件下面的包中有 fileTest1.txt”——你能澄清一下这是什么意思吗?
  • 另外,您确定您实际上正在运行您认为正在运行的程序吗?你真的在运行FileTest1 吗?添加 System.println("Hello"); 或其他内容作为 main 的第一行。它显示吗?工作目录是否与您预期的不同? filetest1.txt 是在其他地方创建的吗?

标签: java file exception filewriter bufferedwriter


【解决方案1】:

BufferedWriter 就是这样做的,它在将输出写入目标之前对其进行缓冲。这可以使BufferedWriter 更快地使用,因为它不必立即写入慢速目标,如磁盘或套接字。

当内部缓冲区满时,内容将被写入,你flushWriterclose作者

记住,如果你打开它,你应该关闭它......

例如...

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

public class TestFileWriter {

    public static void main(String[] args) {
        try {
            BufferedWriter fileWrite = null;
            try {
                File f = new File("filetest1.txt");
                System.out.println("Writing to " + f.getCanonicalPath());
                FileWriter fWrite = new FileWriter(f);
                fileWrite = new BufferedWriter(fWrite);
                fileWrite.write("This is a test!");
                fileWrite.flush();
            } catch (FileNotFoundException e) {
                System.out.print("A FileNotFoundException occurred!");
                e.printStackTrace();
            } finally {
                try {
                    // Note, BufferedWriter#close will also close
                    // the parent Writer...
                    fileWrite.close();
                } catch (Exception exp) {
                }
            }
        } catch (IOException e) {
            System.out.println("An IOException occurred!:");
            e.printStackTrace();
        }
        try {
            BufferedReader br = null;
            try {
                File f = new File("filetest1.txt");
                System.out.println("Reading from " + f.getCanonicalPath());
                FileReader fReader = new FileReader(f);
                br = new BufferedReader(fReader);
                String text = null;
                while ((text = br.readLine()) != null) {
                    System.out.println(text);
                }
            } catch (FileNotFoundException e) {
                System.out.print("A FileNotFoundException occurred!");
                e.printStackTrace();
            } finally {
                try {
                    // Note, BufferedWriter#close will also close
                    // the parent Writer...
                    br.close();
                } catch (Exception exp) {
                }
            }
        } catch (IOException e) {
            System.out.println("An IOException occurred!:");
            e.printStackTrace();
        }
    }
}

如果您使用的是 Java 7,不妨看看try-with-resources

【讨论】:

  • 好的...我修复了大写字母并添加了:fileWriter.flush() 和 fileWriter.close(),但仍然没有任何反应。
  • 我认为 OP 正在检查具有相同名称的不同文件,而不是正在写入的文件。
  • @user2604533 我已经更新了我的示例以打印正在写入的文件的绝对路径,因此您毫无疑问地知道文件开始写入的位置。我还添加了一个读取测试来读回文件
  • @JasonC 我们的应用程序试图以普通用户的身份将文件写入Program Files 目录,但文件不会写入,即使File#canWrite 返回true - 结果是使用 UAC 成为 Java 中的错误 - 我希望我生命中的那两周能回来:P
  • 奇怪。在eclipse的包资源管理器中删除了filetest1.txt文件,然后在搜索栏中查找它仍然存在,这是一个测试!写在里面,但我无法进一步编辑它......
【解决方案2】:

之后

fileWrite.write("This is a test!");

你必须flush()作者。为避免资源泄漏,您还应该close() writer(它会自动刷新它)。

所以你需要添加:

fileWrite.close();

【讨论】:

    【解决方案3】:

    使用BufferedWriter.flush()BufferedWriter.close()。更多信息在这里http://docs.oracle.com/javase/7/docs/api/java/io/BufferedWriter.html

    【讨论】:

      【解决方案4】:

      您必须在写入器上调用close() 或至少flush() 才能将缓冲区真正写入文件。

      【讨论】:

      • 您应该始终关闭您打开的任何资源,这可能会导致以后出现问题 - 恕我直言
      • 我同意,我什至会在finally 中这样做,以确保非常确定。但问题是为什么数据不可见,而这可以通过flush() 单独访问。
      • (nit pick) 整个问题实际上可以通过调用close 来解决,这不仅有助于解决 OP 的问题,而且展示了良好的实践。如果 OP 正在写信给 Socket,它将坚决同意添加 flush - 恕我直言
      猜你喜欢
      • 2016-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-04
      相关资源
      最近更新 更多