【问题标题】:Writing array to txt Java将数组写入 txt Java
【发布时间】:2015-08-26 20:14:18
【问题描述】:

我是学生,只是遇到了一些问题。我想将二维数字数组写入 .txt 文件。你能检查一下问题出在哪里吗?

public void TextFileWritingExample1() {

    try {
        FileWriter writer = new FileWriter("MyFile.txt", true);
        for (int i = 0; i < prvky.length; i++) {
            for (int j = 0; j < prvky[0].length; j++) {
                writer.write(prvky[i][j]);
            }
        }
        writer.write("\r\n");   // write new line
        writer.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

【问题讨论】:

  • 我猜“问题”是某种错误,所以堆栈跟踪会有所帮助
  • 您最好告诉我们您有什么困扰:是否有错误的输出?输入是什么,您期望的输出与您获得的输出是什么?如果有错误,那么当然是堆栈跟踪。
  • 嗯,输入是随机数 1-20 但输出是错误的,它给出了一些非 ascii 字符。
  • 这段代码可以编译吗?

标签: java arrays file writing


【解决方案1】:

我认为你想要的是将数字显示在 txt 文件的二维网格中,所以如果这就是你想要的,这里是代码

public void TextFileWritingExample1() {

    try {
        FileWriter writer = new FileWriter("MyFile.txt", true);
        for (int i = 0; i < prvky.length; i++) {
            for (int j = 0; j < prvky[i].length; j++) {
                  writer.write(prvky[i][j]+" ";
            }
            //this is the code that you change, this will make a new line between each y value in the array
            writer.write("\n");   // write new line
        }
        writer.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

【讨论】:

  • 您肯定想使用prvky[i][j],因为j 将保存从零到prvky[i] 长度的值。 prvky 中可能没有 j 元素。
  • 哦,糟糕,打算改一下,现在修好了
【解决方案2】:

如果我不得不猜测我会说该文件不存在。但这段代码还有其他几个问题:
正如文档所述:

FileWriter 用于写入字符流。要写入原始字节流,请考虑使用 FileOutputStream。

因此,如果您想编写原始整数或其他任何类型的矩阵,FileWriter 不是首选。

write 继承自OutputStreamWriter,正如doc 所述,

公共无效写入(int c) 抛出 IOException
写入单个字符。

这意味着write 只会写入int 的最低有效位。因此,只要矩阵中的任何元素超过char(即 16 位)的范围限制,您就会丢失该值的所有较高位。并且输出不会是明文,而是int 的值所代表的字符。因此,例如filewriter.write(23) 不会导致将 23 作为文本写入文件,而是将 23 表示的字符,即“#”。

您可以将int 以二进制或明文形式保存到文件中。选择取决于您。如果要将其写为明文,则必须先将数字转换为明文并引入一个字符来分隔单个整数。或者,如果您想将数据以二进制形式写入文件,则必须先将数据转换为 byte[]

下一个问题:除非您的矩阵具有固定大小,否则您还必须保存矩阵的大小,以便从文件中加载它。

【讨论】:

    【解决方案3】:

    你说你有数字并且你得到了一些非 ASCII 字符。我认为这可能会发生,因为 Filewriter 写入字符串,所以我认为首先你应该将数据转换为字符串。所以如果你使用整数是这样的:

     writer.write(Integer.toString(prvky[i][j]));
    

    现在可以用了吗?

    其实是因为:

    public void write(int c)
        Writes a single character.
    

    但你需要这个:

    public void write(String str)
        Writes a string.
    

    【讨论】:

      【解决方案4】:

      你可以试试

       PrintWriter writer = new PrintWriter("MyFile.txt", "UTF-8");
          for (int i = 0; i < prvky.length; i++) {
              for (int j = 0; j < prvky[i].length; j++) {
                  writer.println(prvky[i][j]);
              }
      

      【讨论】:

      • 它使用 writer.println() 而不是 writer.write()
      • 仍然无法正常工作。这甚至不会编译,因为 println 没有在 FileWriter 或其任何超类中实现。
      • 哎呀我打算使用 PrintWriter
      • 这行得通,除了构造函数PrintWriter(string, boolean) 不存在
      【解决方案5】:

      您的代码运行良好。但是,考虑到它是 0-20 之间的随机数,您已经成功编写了非人类可读字符的 ascii。如果您有一个工具可以为您转储文件的二进制文件,例如用于 linux 平台的 hexdump,那么您可以看到它是成功的。如果你想写一些数字组合的 ascii 表示,那么数字 0-9 是 ascii 48-57。您可以编辑代码以生成该范围内的随机整数,您会看到随机数字显示为文本。

      【讨论】:

      • 代码有错误。内部 for 循环总是读取第一个数组元素的长度,然后引用该数组中可能具有不同长度的其他成员。这很可能导致ArrayIndexOutOfBoundsException
      猜你喜欢
      • 2014-09-02
      • 2014-06-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 2016-09-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-17
      相关资源
      最近更新 更多