Java 文件I/O在输出时产生乱码

Java 文件I/O在输出时产生乱码,java,io,Java,Io,我正在学习使用Java进行文件I/O 下面是我从两个不同的Java文件中得到的代码。一个是带有主类的“File”,另一个是“FileWrite” 我能够实现字符串输入和输出。但是输出的文本文件在开始时就乱七八糟,我不知道为什么 [File.Java] package file; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class File {

我正在学习使用Java进行文件I/O

下面是我从两个不同的Java文件中得到的代码。一个是带有主类的“File”,另一个是“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(城市);obOut.writeUTF(国家);”中,我分离出两个字符串输入。有没有办法把它们结合在一起?如在obOut中。写下(城市,郡)而不是两个。或者,这只能通过将其制成一个对象来实现吗

[更新]
我又引进了两个,我试了一下

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

writeUTF也接受字符串,您不必为city和county创建新对象


你能不能
obOut.writeUTF(城市+“”+国家)

writeUTF也接受字符串,您不必为city和county创建新对象


你能不能
obOut.writeUTF(城市+“”+国家)

您正在做正确的事情,将它们分开。城市和乡村是不同的领域

一个非常常见的错误是不区分二进制文件和文本文件/套接字流。你是一个混血儿,这会导致混乱。我建议你只起诉文本编写器/阅读器或二进制输入/输出流,除非你对自己正在做的事情有一个非常清楚的想法

简而言之,如果你要写什么文本使用

PrintStream ps = new PrintStream(new FileWriter(textFileName));
ps.println(city);
ps.println(country);
ps.close();

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

一个非常常见的错误是不区分二进制文件和文本文件/套接字流。你是一个混血儿,这会导致混乱。我建议你只起诉文本编写器/阅读器或二进制输入/输出流,除非你对自己正在做的事情有一个非常清楚的想法

简而言之,如果你要写什么文本使用

PrintStream ps = new PrintStream(new FileWriter(textFileName));
ps.println(city);
ps.println(country);
ps.close();

这是因为
.writeutf()
以javadocs中提到的修改过的UTF格式写入数据

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


此外,您还尝试使用JavaSE7中新增的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将允许JavaSE7轻松地关闭这两个流。按照您的操作方式,只有BufferedReader流在try块完成后才会关闭。

这是因为
.writeutf()
以javadocs中提到的修改后的UTF格式写入数据

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


此外,您还尝试使用JavaSE7中新增的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将允许JavaSE7轻松地关闭这两个流。按照您的方式,只有BufferedReader流在try块完成后才会关闭。

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

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

您能告诉我我使用的是哪一个吗?我在代码中的什么地方混合?另外,当你说混淆时,意味着它在文本文件中产生jibberish?另外,如果我有多达100000个条目的input.txt文件,我需要什么来确保程序处理这么多条目?(不知道为什么我的输入代码消失了)。导入了更多的代码,我尝试了PrintStream ps=new PrintStream(new FileWriter(“B:\\addressPS.txt”);ps.println(城市);ps.println(国家);ps.close();但是有错误,有什么线索吗?您正在将二进制文件写入一个扩展名为
.txt
的文件,这意味着它是一个文本文件,但事实并非如此,因此您无法将其作为文本文件读取。100000个条目通常相当小,除非您有移动设备或非常大的条目,例如每个100KB。你如何处理这些错误取决于它们是什么。你能告诉我我使用的是哪一个吗?我在代码中的什么地方混合?另外,当你说混淆时,意味着它在文本文件中产生jibberish?另外,如果我有多达100000个条目的input.txt文件,我需要什么来确保程序处理这么多条目?(不知道为什么我的输入代码消失了)。导入了更多的代码,我尝试了PrintStream ps=new PrintStream(new FileWriter(“B:\\addressPS.txt”);ps.println(城市);ps.println(国家);ps.close();但是如果有错误,有什么线索吗?您正在将二进制文件写入一个扩展名为
.txt
的文件,这意味着它是一个文本文件,但它