【问题标题】:PrintWriter and FileOutputStream in JavaJava 中的 PrintWriter 和 FileOutputStream
【发布时间】:2015-12-24 04:52:55
【问题描述】:

PrintWriter 用于将数据以文本形式写入文件,而FileOutputStream 用于以二进制形式写入。

考虑

import java.io.*;

public class Main {
    public static void main(String[] args) throws Exception {
        PrintWriter pw = new PrintWriter(new File("data"));
        for(int i=1;i<=10;++i)
            pw.print(i);
        pw.close();
    }
}

输出:

12345678910

但是,如果我使用FileOutputStream,我得到的二进制数据在文本中是不可读的。

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        FileOutputStream fos = new FileOutputStream(new File("data")) ; 
        for(int i= 1; i<=10; ++i)
            fos.write(i);
        fos.close();
    }
}

给出输出:

现在,如果我将PrintWriterFileOutputStream 一起使用,那么我仍然会得到如下所示的文本数据。为什么?它是如何变成文本的,为什么?

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        PrintWriter pw = new PrintWriter( new FileOutputStream(new File("data")));
        for(int i=1 ;i<=10;++i)
            pw.print(i);

        pw.close();
    }
}

输出:

12345678910

******编辑:***

现在考虑,案例

import java.io.*;
import java.util.*;

public class Main
{

    public static void main(String[] args) throws Exception
    {
        PrintWriter pw = new PrintWriter( new DataOutputStream(new FileOutputStream(new File("data"))));
        for(int i=1 ;i<=10;++i)
            pw.print(i);

        pw.close();


    }


}

输出仍然是: 12345678910

根据JavaDocs:

数据输出流允许应用程序写入原始 Java 数据 以可移植的方式输入输出流。然后一个应用程序可以 使用数据输入流将数据读回。

那么,现在如果 PrintWriter 正在向 DataOutputStream 发送字节,那么整个事情是如何工作的?

【问题讨论】:

  • DataOutputStream 在您的示例中是多余的。它没有做任何有用的事情,这就是它起作用的原因,但它令人困惑,如果您正在编写文本,则不应使用它。
  • 是什么让 DataOutputStream 变得多余?我无法得到它。
  • 如果你取出 DataOutputStream ,它会做同样的事情(稍微快一点)。因此它是多余的。
  • 但是 DataOutputStream 采用原语,将它们转换为二进制,然后将其发送到 FileOutputStream。在这里,DataOutputStream 正在获取编码字节。那么,这如何解释呢?
  • PrintWriter 调用 dataOutputStream.write(),它只是将字节写入底层 FileOutputStream。查看javadoc和源代码。

标签: java file-io fileoutputstream printwriter


【解决方案1】:

文件包含字节。总是。

通过使用编码将字符转换为字节来将字符写入文件。存在许多这样的编码。例如,ASCII 允许将 128 个不同的字符转换为字节。 UTF-8 允许将任何 Unicode 字符编码为字节。例如,这两种编码将字符“1”转换为字节 49。“2”将转换为字节 50。

当使用带有文件名作为参数的 PrintWriter 时,PrintWriter 实际上会打开一个 FileOuptutStream 来将字节写入文件。当您将字符写入 PrintWriter 时,PrintWriter 使用编码将字符转换为字节,然后将这些字节写入 FileOutputStream,后者将字节写入文件。

因此,例如,如果您使用以下程序:

public class Main {
    public static void main(String[] args) throws Exception {
        FileOutputStream fos = new FileOutputStream(new File("data")) ; 
        for(int i = 49; i <= 58; ++i)
            fos.write(i);
        fos.close();
    }
}

然后使用文本编辑器打开文件,您应该会在文件中看到123456789,因为代码直接写入了这些字符的字节表示(ASCII 或 UTF8)。

【讨论】:

  • 请也考虑我更新的问题......我现在将它与 DataOutputstream 链接起来
  • 正如 Peter Lawrey 在他的评论中所说,DataOutputStream 是无用的。它接收字节并将它们按原样写入 FileOutputStream。
【解决方案2】:

查看文档。

来自FileOutputStream.html#write(int)

将指定字节写入此文件输出流。

来自PrintWriter.html#print(int)

打印一个整数。 String.valueOf(int)产生的字符串按照平台默认的字符编码转换成字节,这些字节完全按照write(int)方法的方式写入。

也就是说,这个方法会写出你看到的数字。 另一个写入字节。 字节值 9 不是数字 9,而是一个不可读的字符。

【讨论】:

    猜你喜欢
    • 2013-01-05
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    • 2012-10-23
    • 1970-01-01
    相关资源
    最近更新 更多