Java 文件写入遇到问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 文件写入遇到问题相关的知识,希望对你有一定的参考价值。

File TempFile = new File("");
String Path = TempFile.getAbsolutePath();
File LoadFile = new File (Path, "\\Temp\\NewDatas.txt");

PrintWriter WriteFile = new PrintWriter(new BufferedWriter (new FileWriter(LoadFile)));
WriteFile.write("SomeThing!!!");

谁能帮我看一下这个么?这个是我的程序代码关于写文件的部分
程序运行时"\Temp\NewDatas.txt"已经存在,程序运行后NewDatas.txt得到更新,但是什么数据都没有,变成 0 K了
PS: WriteFile.println("SomeThing!!!");也用过,没用
PS2:别抄JAVA API给我,我就是照着它写的!

PrintWriter WriteFile 这个类不对吧
public class PrintWriter extends Writer向文本输出流打印对象的格式化表示形式。此类实现在 PrintStream 中的所有 print 方法。它不包含用于写入原始字节的方法,对于这些字节,程序应该使用未编码的字节流进行写入。

与 PrintStream 类不同,如果启用了自动刷新,则只有在调用 println、printf 或 format 的其中一个方法时才可能完成此操作,而不是每当正好输出新行字符时才完成。这些方法使用平台自有的行分隔符概念,而不是新行字符。

public class BufferedWriterextends Writer将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。

该类提供了 newLine() 方法,它使用平台自己的行分隔符概念,此概念由系统属性 line.separator 定义。并非所有平台都使用新行符 ('\n') 来终止各行。因此调用此方法来终止每个输出行要优于直接写入新行符。

通常 Writer 将其输出立即发送到基础字符或字节流。除非要求提示输出,否则建议用 BufferedWriter 包装所有其 write() 操作可能开销很高的 Writer(如 FileWriters 和 OutputStreamWriters)。例如,

PrintWriter out
= new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));
将缓冲 PrintWriter 对文件的输出。如果没有缓冲,则每次调用 print() 方法会导致将字符转换为字节,然后立即写入到文件,而这是极其低效的。
参考技术A File TempFile = new File("");
String Path = TempFile.getAbsolutePath();
File LoadFile = new File(Path, "\\Temp\\NewDatas.txt");
try
PrintWriter WriteFile = new PrintWriter(new BufferedWriter(
new FileWriter(LoadFile)));
WriteFile.write("SomeThing!!!");
WriteFile.flush();
catch (IOException e)
e.printStackTrace();

1,有异常要,捕捉或招聘异常
2,文件路径可能不存在,(可以用mkdirs();建立路径)
3,为什么你的文件为OKB,那是因为你少了一句WriteFile.flush();
没有把缓存中的数据写入文件(因为数据太少了没有达到缓存上限,所以要手动地把缓存中的数据写入文件).
4,打出GG.本回答被提问者采纳

将输出写入java类中的文本文件? [复制]

【中文标题】将输出写入java类中的文本文件? [复制]【英文标题】:Writing output to text file in a class in java? [duplicate] 【发布时间】:2015-04-22 19:15:06 【问题描述】:

我遇到了将输出写入文本文件的问题。我不太确定该怎么做。我试图通过写一些类似的东西来写输出- Writer 是 printWriter 类的一个对象:

这被大幅削减,但归结为。

Writer.println(sortRI());

我不能将该语句写为方法本身,并且我尝试写入输出文件的此类中的所有方法都是无效的。

所以我的问题是如何从我的无效方法中将输出写入文本文件 - 它们通过一些打印语句打印出结果。有没有办法可以实例化编写器并使用编写器打印方法。其中一种方法的示例如下所示:

ZipCodeLocation[] data2 = new ZipCodeLocation[];

public class Processor

  ...

  public void readData()

  ...

  

public void findSpringfield()

    System.out.println("------------------------------------------------------------------------");
    System.out.println("SPRINGFIELD ZIP CODES");

    for(int i=0; i < data2.length ; i++)
    
        if(data2[i].getpostalCity().replaceAll("\"","").contains("SPRINGFIELD"))
        
          System.out.println(data2[i].getzipCode().replaceAll("\"",""));  //Prints out zipCodes that have Springfield in them
        
    

我不是在控制台中将消息打印到 System.out,而是如何让它将方法的输出写入文本文件?

【问题讨论】:

有人有想法吗?真的可以使用一些输入。 【参考方案1】:

您提出了一个非常好的问题,因为它描述了所有软件共有的设计考虑的一个实例。

这里的主题是业务逻辑与接口的分离。更一般地说,它是对面向对象程序中明确定义的职责的讨论。

理想情况下,您的业务逻辑将返回一个数据结构,这将允许调用者对结果执行任何所需的操作,例如将其写入文件或将其显示在网页中。

public List<String> findSpringfield()

    List<String> results = new ArrayList<String>();
    for(int i=0; i < data2.length ; i++) 
        if(data2[i].getpostalCity().contains("SPRINGFIELD")) 
            results.add(data2[i].getzipCode().replaceAll("\"",""));  //Collects zipCodes that have Springfield in them
        
    
    return results;

如果这不是一个选项,那么您至少需要修改您的方法以接受 PrintStream 参数。

public void findSpringfield(PrintStream out)

    out.println("------------------------------------------------------------------------");
    out.println("SPRINGFIELD ZIP CODES");

    for(int i=0; i < data2.length ; i++) 
        if(data2[i].getpostalCity().contains("SPRINGFIELD")) 
            out.println(data2[i].getzipCode().replaceAll("\"",""));  //Prints out zipCodes that have Springfield in them
        
    

这样你就可以这样称呼它

findSpringfield(System.out);

或者您可以向它传递一个不同于 System.out 的 PrintStream 实例,它指向您自己的文件。

最后,如果以上选项都不适合您,我将告诉您如何做一些非常糟糕的做法。您可以将 System.out 重定向到您选择的文件。正如我所说,这是一个糟糕的主意。仅在非常有限的范围内将其用作最后的手段。

System.out = new PrintStream("somePath/someFile.txt");

此外,作为一项设计改进,请考虑将您的 findSpringfield 方法泛化为接受 String postalCity 参数,以便您可以重复使用它来查找其他城市的邮政编码。 p>

public List<String> zipsByCity(String postalCity)

    // use postalCity to filter results, rather than hardcoded "SPRINGFIELD" string

【讨论】:

对不起,我才注意到这一点,给了你应得的认可!【参考方案2】:

尝试将 Writer 作为方法的参数发送,而不是打印到方法内部的标准输出,而是打印到 writer:

public void findSpringfield(FileWriter writer)

     writer.println("---------------------------------------------------                                               ---------------------");
          writer.println("SPRINGFIELD ZIP CODES");

 for(int i=0; i < data2.length ; i++)
 
    if(data2[i].getpostalCity().replaceAll("\"","").contains("SPRINGFIELD"))
    
         writer.println(data2[i].getzipCode().replaceAll("\"",""));               //Prints out zipCodes that have Springfield in them

   

  

【讨论】:

【参考方案3】:
 File file = new File("out.txt");
      BufferedWriter output = new BufferedWriter(new FileWriter(file));
       for(int i=0; i < data2.length ; i++)
          if(data2[i].getpostalCity().replaceAll("\"","").contains("SPRINGFIELD"))
                output.write(data2[i].getzipCode().replaceAll("\"",""));
                   
         
      output.close();

这应该可以,但它需要一个 try-catch 块或 throws 声明

【讨论】:

【参考方案4】:

现在看起来你的每一个方法都必须实现写入文件或获取文件写入器作为参数。这两种方法都可以,但效率很低。

根据我从您的问题中了解到的情况,您将拥有更多名为 findXYZ 的 void 方法。

为什么不写方法 void findTown(String townName)? 我可能错了,或者对你想要达到的目标有错误的印象,但如果我是对的,那么你就走错了方向。

【讨论】:

以上是关于Java 文件写入遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

使用java如何直接往word文件中写入内容最好有详细的介绍和源代码

如何在java中的文件中循环写入或附加字符串?

使用 SnakeYaml 将 java 对象写入文件 - 使用 Yaml.dump() 时不会写出内部对象列表

使用opencv将视频写入文件时遇到问题

关于Java中向文件写入数据的问题

将hdf5文件中的uint32数据写入java中的数组的最简单方法是啥?