Java中的PrintWriter和FileOutputStream

时间:2015-09-26 13:28:14

标签: java file-io fileoutputstream printwriter

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();
    }
}

给出输出:

enter image description here

现在,如果我将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发送字节,整个过程是如何工作的?

2 个答案:

答案 0 :(得分:3)

文件包含字节。总是

通过使用编码将字符转换为字节,将字符写入文件。存在许多这样的编码。例如,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)。

答案 1 :(得分:2)

查看文档。

来自FileOutputStream.html#write(int)

  

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

来自PrintWriter.html#print(int)

  

打印整数。 String.valueOf(int)生成的字符串根据平台的默认字符编码转换为字节,这些字节的写入方式与write(int)方法完全相同。

也就是说,此方法会在您看到它们时写入数字。 另一个写字节。 字节值9不是数字9,而是不可读的字符。