文件字节流、字符流、缓冲字节流、缓冲字符流、数据流

1、字节流(通常与缓冲字节流一起使用,提升效率。具体参考3)
FileOutputStream 输出流,写出内容到文件
FileInputStream 输入流,从文件读入内容到缓冲区
public class Demo {
    public static void main(String[] args) {
        File f = new File("D:/word.txt");//指定路径、文件(夹)名
        try {//异常处理
            FileOutputStream out = new FileOutputStream(f, true);//默认不追加,而是覆盖。
            String str = "与众不同";
            byte b[] = str.getBytes();//字符串转字节
            out.write(b);
        } catch (java.io.IOException e) {
            e.printStackTrace();
        }
        try {
            FileInputStream in = new FileInputStream(f);
            byte b2[] = new byte[200];//设定缓冲区大小,200字节
            int length = in.read(b2);//读入文本到缓冲区,返回文本字节数。
            System.out.println("文件内容是:" + new String(b2, 0, length));//0,length可以去除空格(未使用缓冲区)
        } catch (java.io.IOException e) {
            e.printStackTrace();
        }
    }
}

 2、字符流(通常与缓冲字符流一起使用,提升效率。具体参考4)。直接对字符进行处理,无需字符/字节转换。

FileWriter
FileReader
public class Demo {
    public static void main(String[] args) {
        File f = new File("D:/word.txt");
        FileWriter fw = null;
        try {
            fw = new FileWriter(f, true);//默认覆盖
            String str = "为所欲为";
            fw.write(str);//写入文本
        } catch (IOException e) {
            e.printStackTrace();
        } finally {//关闭流
            if (fw != null) {
                try {
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        FileReader fr = null;
        try {
            fr = new FileReader(f);
            char ch[] = new char[1024];//缓冲区。由于是字符输入输出流,所以返回字符型
            int length = fr.read(ch);//读取文本到缓冲区。返回文本长度
            System.out.println("文件内容是:" + new String(ch, 0, length));//消除空格(多余缓冲区)
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fr != null) {
                try {
                    fr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

 3、缓冲字节流

BufferedOutputStream

BufferedInputStream

缓冲字节流可以提高效率。字节流可以认为是一个货物一个货物地运输,而缓冲字节流可以把很多货物存放到货车上(缓存),一起运送。

使用缓冲字节输出流时,推荐多使用flush。刷新可以不必等货车装满就可以输送。

public class Demo {
    public static void main(String[] args) {
        File f = new File("D:/word.txt");
        FileOutputStream out = null;
        BufferedOutputStream bOut = null;
        try {
            out = new FileOutputStream(f, true);//默认覆盖
            bOut = new BufferedOutputStream(out);
            String str = "为所欲为";
            byte b[] = str.getBytes();//字符转字节
            bOut.write(b);//写入字节
            //使用缓冲字节输出流时,推荐多使用flush
            bOut.flush();//刷新
        } catch (IOException e) {
            e.printStackTrace();
        } finally {//关闭流
            if (bOut != null) {
                try {
                    bOut.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        FileInputStream in = null;
        BufferedInputStream bIn = null;
        try {
            in = new FileInputStream(f);
            bIn = new BufferedInputStream(in);
            byte b[] = new byte[1024];
            try {
                int length=bIn.read(b);
                System.out.println("文件内容是:"+new String(b,0,length));
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (bIn != null) {
                try {
                    bIn.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

 4、缓冲字符流(除了read/write功能,还有按行处理的功能。如newLine,readLine。按行处理,不需要指定缓冲区大小)

BufferedWriter

BufferedReader

public class Demo {
    public static void main(String[] args) {
        File f = new File("word.txt");
        FileWriter fw = null;
        BufferedWriter bw = null;
        try {
            fw = new FileWriter(f);//字符流
            bw = new BufferedWriter(fw);//缓冲字符流,提升效率
            String str1 = "这是第一行";
            String str2 = "这是第二行";
            bw.write(str1);
            bw.newLine();//创建新行
            bw.write(str2);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (bw != null) {
                try {
                    bw.close();//注意关闭顺序,先关闭后创建的
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fw != null) {
                try {
                    fw.close();//关闭最初创建的
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        FileReader fr = null;
        BufferedReader br = null;
        try {
            fr = new FileReader(f);//字符流
            br = new BufferedReader(fr);//缓冲字符流,可以按行读取
            String tmp = null;
            while ((tmp = br.readLine()) != null) {//br.readLine()只能读取第一行,while遍历读取所有行
                System.out.println(tmp);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fr != null) {
                try {
                    fr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

 5、数据流

DataOutputStream

DataInputStream

public class Demo {
    public static void main(String[] args) {
        File f = new File("word.txt");
        FileOutputStream out = null;
        DataOutputStream dos = null;
        try {
            out = new FileOutputStream(f);
            dos = new DataOutputStream(out);
            //word.txt中部分内容乱码
            dos.writeUTF("写入字符串数据");
            dos.writeInt(520);//整型
            dos.writeDouble(3.14f);
            dos.writeBoolean(true);//布尔型
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (dos != null) {
                try {
                    dos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        FileInputStream in = null;
        DataInputStream dis = null;
        try {
            in = new FileInputStream(f);
            dis = new DataInputStream(in);
            //注意读取顺序,与写入顺序一致,否则错误。
            System.out.println(dis.readUTF());
            System.out.println(dis.readInt());
            System.out.println(dis.readDouble());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (dis != null) {
                try {
                    dis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

 


posted @ 2018-08-22 14:17  夕西行  阅读(2173)  评论(0编辑  收藏  举报