java字节流之FileInputStream和FileOutputStream一些问题的探讨

来源:互联网 发布:大数据时代的小数据 编辑:程序博客网 时间:2024/05/01 08:03

在写下面代码时,文件、代码都用的是UTF-8码(汉字占三个字节,英文占一个字节)

1、FileInputStream

<pre name="code" class="java">import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;public class FileInputStreamDemo {public static void main(String[] args) throws FileNotFoundException,IOException {fileInputSteam1();System.out.println();fileInputSteam2();}//字节输入流的读取方式一,每次读取一个字节public static void fileInputSteam1() throws FileNotFoundException,IOException {InputStream is = new FileInputStream("d:/1.txt");int b = -1;while((b = is.read()) != -1) {System.out.print((char) b);}is.close();}//字节输入流的读取方式二,一次性读取多个字节public static void fileInputSteam2() throws FileNotFoundException,IOException {File f = new File("d:/1.txt");InputStream is = new FileInputStream(f);byte[] bytes = new byte[(int) f.length()];is.read(bytes);is.close();System.out.println(new String(bytes));}}


结果第一种方式和第二种方式(文件里面有汉字)得出的结果不一样,我想是因汉字占三个字节,所以第一种方法会乱码(当然这很好理解,重点也不在这儿,扫过即可)

2、FileOutputStream

<pre name="code" class="java">import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;public class FileOutputStreamDemo {public static void main(String[] args) throws FileNotFoundException,IOException {fileOutputStream1();fileOutputStream2();}//字节输出流第一种方式:一个一个字节输出private static void fileOutputStream1() throws FileNotFoundException,IOException {FileOutputStream out = new FileOutputStream(new File("d:/1.txt"));byte[] s = "中国人".getBytes("UTF-8");for (int i = 0; i < s.length; i++) {out.write(s[i]);//一个一个字节写}out.close();}//字节输出流第二种方式:每次输出指定大小的字节private static void fileOutputStream2() throws FileNotFoundException,IOException {FileOutputStream out = new FileOutputStream("d:/1.txt",true);//true表示追加,默认false//out.write("  fd啊发放!".getBytes());//一次性输出全部out.write("  fd啊发放!".getBytes("utf-8"),0,7);//byte[],offset,length    out.close();}}


这里的第二种方法只要偏移量和长度没问题,汉字也是没有问题的。第一种方法(我的想法)其实只是模拟一个一个字节输出,因为只要 i < x(上面是s.length)对的话,汉字也是不会乱码的,而且jdk上也没有方法说一次一字节的输出(但FileInputStream.read()就明确说明了)。

这些是我能解释的乱码的表面现象,但到底一次一字节还有模拟一次一字节从原理上为什么不一样,原理是什么,这些我不甚清楚,还望看到的,懂的大虾们评论一下,感激不尽。


0 0
原创粉丝点击