1

我正在学习使用 Java 的文件 I/O。

以下是我来自两个不同 Java 文件的代码。一个是带有主类的“File”,另一个是“FileWrite”。

我能够实现字符串输入和输出。但是输出文本文件一开始就有乱码,我不知道为什么。

[文件.Java]

package file;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class File {
    public static void main(String[] args) {

    try (BufferedReader br = new BufferedReader(new FileReader("B:\\fileIn.txt")))
            {
              String stCurrent;

              while ((stCurrent = br.readLine()) != null) {
                    System.out.println(stCurrent);
            }

            } catch (IOException e) {
                e.printStackTrace();
            } 
                    FileWrite fW = new FileWrite();
                    fW.serializeAddress("Boston", "Canada");
        }
}

[文件写入.Java]

package file;

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class FileWrite {

   public void serializeAddress(String city, String country) {
       try {
        FileOutputStream fout = new FileOutputStream("B:\\address.txt");
        ObjectOutputStream obOut = new ObjectOutputStream(fout);   
                obOut.writeUTF(city);
                obOut.writeUTF(country);
        obOut.close();
        System.out.println("Output Done");
       } catch(Exception ex) {
           ex.printStackTrace();
       }
   }
}

现在,关于“obOut.writeUTF(city); obOut.writeUTF(country);” 我分离出两个字符串输入。有没有办法将它们组合成一个?如 obOut.writeUTF(city, counry) 而不是两个。或者这只能通过将它们变成一个对象来实现?

[更新] 又导入了几个,我试过了

PrintStream ps = new PrintStream(new FileWriter("B:\\addressPS.txt")); 
ps.println(city); 
ps.println(country); 
ps.close(); 
But with errors, any clue?
4

4 回答 4

1

你正在做正确的事情,让他们分开。城市和国家是不同的领域。

一个非常常见的错误是没有区分二进制文件和文本文件/套接字流。你是两者的混合体,这会导致混乱。我建议您只起诉文本 Writer/Reader 或二进制 Input/OutputStream,除非您非常清楚自己在做什么。

总之,如果你写什么文字使用

PrintStream ps = new PrintStream(new FileWriter(textFileName));
ps.println(city);
ps.println(country);
ps.close();
于 2013-01-13T14:37:59.650 回答
0

乱码是因为.writUTF()以 javadocs 中提到的修改后的 UTF 格式写入数据。

AnObjectOutputStream通常用于输出 OBJECTS 但我想您也可以将它用于字符串。您可以使用类中的相应.readUTF()方法ObjectInputStream来读取文件中的数据。


此外,您尝试使用 Java SE7 中新增的 try-with-resources 块。你不应该这样做。你应该这样做:

try (FileReader fr = new FileReader("B:\\fileIn.txt"); BufferedReader br = new BufferedReader(fr);) {

} catch (FileNotFoundException e1) {
  e1.printStackTrace();
} catch (IOException e1) {
  e1.printStackTrace();
}

拆分 FileReader 和 BufferedReader 将允许 Java SE7 轻松关闭这两个流。按照您的操作方式,只有 BufferedReader 流会在 try 块完成后关闭。

于 2013-01-13T14:57:43.907 回答
0

writeUTF 也接受字符串,您不必为城市和县创建新对象。

你不能obOut.writeUTF(city +" "+country);吗?

于 2013-01-13T14:36:18.997 回答
0

根据定义,ObjectOutputStream会产生“胡言乱语”。它不是供人类使用的,它是一种用于写出对象的格式,以便您可以读回它们。您不应该能够理解文本编辑器中的结果。要制作人类可读的内容,只需使用一个OutputStreamWriter甚至一个PrintWriter. 简而言之,您的最后一个示例是正确的,如果您遇到错误,请编辑您的问题以告诉我们错误是什么。

于 2013-01-13T15:43:14.230 回答