我正在使用Java学习文件I / O.
以下是来自两个不同Java文件的代码。一个是主类的“文件”,另一个是“FileWrite”。
我能够实现字符串输入和输出。但输出文本文件在开始时有胡言乱语,我不确定原因。
[File.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");
}
}
[FileWrite.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?
答案 0 :(得分:1)
你正在做正确的事情,将它们分开。城市和国家是不同的领域。
一个非常常见的错误是没有区分二进制和文本文件/套接字流。你是混合两者会导致混乱。我建议你只起诉文本Writer / Reader或二进制输入/ OuptutStream,除非你有非常明确你在做什么。
总之,如果你要写什么文字使用
PrintStream ps = new PrintStream(new FileWriter(textFileName));
ps.println(city);
ps.println(country);
ps.close();
答案 1 :(得分:0)
writeUTF也接受字符串,您不必为城市和县创建新对象。
你不能obOut.writeUTF(city +" "+country);
吗?
答案 2 :(得分:0)
乱码是因为.writUTF()
以javadocs中提到的修改后的UTF格式写入数据。
ObjectOutputStream
通常用于输出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块完成后关闭。
答案 3 :(得分:0)
根据定义,ObjectOutputStream
会产生'乱码'。它不是供人类使用的,它是一种用于写出对象的格式,以便您可以阅读它们。你不应该在文本编辑器中理解结果。要制作人类可读的内容,只需使用OutputStreamWriter
甚至PrintWriter
即可。简而言之,您的上一个示例是正确的,如果您收到错误,请编辑您的问题以告诉我们错误是什么。