【问题标题】:Writing an array to a file in Java在Java中将数组写入文件
【发布时间】:2011-04-28 14:49:02
【问题描述】:

您好,我已经查看了所有其他与此类似的问题,但我无法解决我的最后一个问题,尽管其他问题的答案让我走到了这一步。

我正在尝试将数组写入文件,到目前为止我可以做到,但作者只是将所有内容都写在同一行。由于某种原因,在记事本中查看时它不会接受我的换行命令 (\n)。

一个尝试解释的例子:

数组内容:test、test2、test3、test4

写入文件

文件内容:test test2 test3 test4

而我希望文件是: 测试 测试2 测试3 测试4

下面是我要写入文件的代码段。

    public void save(String fileName) throws FileNotFoundException {

    try {

        BufferedWriter writer = new BufferedWriter(new FileWriter(fileName));
        for ( int i = 0; i < nbrMovies; i++)
        {      
        writer.write(movies[i].getName() + " \n");
        }
        writer.close();
    } catch(IOException ex) {
        ex.printStackTrace();
    }
}

该文件不接受“\n”命令,而是在最后添加的电影旁边放了一个小框。

我们将不胜感激。

【问题讨论】:

  • 所有文本文件都应该能够接受“\n”字符。你用什么文本编辑器打开你刚刚写的文本文件?文本编辑器可能不支持读取 unix 样式的文本文件并将 \n 显示为一个小框。如果您想拥有 Windows 样式的文本文件,请尝试使用“\r\n”。这两个操作系统的行尾不同。
  • 更好的是,使用 writer.newLine() 它将为平台插入适当的行尾。

标签: java arrays file line


【解决方案1】:

首先,您不应该在每次写入后close() 流;将close() 移到循环之外,最好移到finally 块中以确保调用它。其次,与其写“\n”,更好的做法是

writer.write(movies[i].getName());
writer.newLine();
writer.flush(); //optional

【讨论】:

    【解决方案2】:

    writer.close(); 从 for 循环中取出。你的代码应该是这样的:-

     public void save(String fileName) throws FileNotFoundException {
        BufferedWriter writer = null;
        try {
    
            writer = new BufferedWriter(new FileWriter(fileName));
            for ( int i = 0; i < nbrMovies; i++)
            {      
              writer.write(movies[i].getName());
              writer.newLine();
          writer.flush();
            }
    
        } catch(IOException ex) {
            ex.printStackTrace();
        } finally{
            if(writer!=null){
                writer.close();
            }  
        }
    }
    

    【讨论】:

    • 这个 sn-p 不会编译,因为 writerfinally 块中不可见。
    • @Binil Thomas - 当然 - 目的不是让生产准备好编译,而是展示问题出在哪里以及如何做得更好。将writer 移到try catch 之外是一项非常简单的任务。
    • @CoolBeans - 如果它微不足道,你为什么不这样做?我认为目的是给出正确的答案。
    【解决方案3】:

    有这个writer.newLine(); 并将调用移出循环。

    【讨论】:

      【解决方案4】:
      import java.io.*;
      
      public class WriteChar 
      {
      
          public static void main(String[] args) 
          {
      
              try
          {
             File f=new File("WriteChar.txt");
            char c[]={'a','b','c','d','e','f','g'};
      
      
             FileWriter out=new FileWriter(f);
             out.write(c);
             System.out.println("Done ..........");
             out.close();
          }
      
              catch(IOException ioe)
              {
                  ioe.printStackTrace();
              }
          }
      
      }
      

      【讨论】:

        【解决方案5】:

        用 PrintWriter 包装 FileWriter 或 BufferedWriter,您将可以访问 println(...) 方法。

        【讨论】:

          【解决方案6】:

          writer.close() 移到循环之外。另外,请确保在关闭之前刷新 writer。

          【讨论】:

          • close() 有一个隐式的 flush()
          【解决方案7】:

          为什么不在循环外调用close

          Writer writer = null;
          try {
              writer = new BufferedWriter(new FileWriter(fileName));
              for (Movie movie : movies) {      
                  writer.write(movie.getName() + " \n");
              }
          } catch(IOException ex) {
              ex.printStackTrace();
          } finally {
              if (writer != null) {
                  try {
                      writer.close();
                  } catch (IOException ignored) {
                  }
              }
          }
          

          【讨论】:

            【解决方案8】:

            我同意将 writer.close() 移出循环。但是有一种更简单的方法来做你想做的事 - 而不是调用换行函数,只需在语句末尾附加回车而不是 return 即

            更改声明:writer.write(movies[i].getName() + " \n"); 至:writer.write(movies[i].getName() + " \r\n");

            【讨论】:

            • 这会起作用,因为记事本需要\r\n 来识别换行符。所以这不是写入文件的问题 - 而是在记事本中打开 linux 样式文件的问题。
            猜你喜欢
            • 2012-09-11
            • 2015-09-04
            • 1970-01-01
            • 1970-01-01
            • 2019-03-01
            • 2012-11-22
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多