【Java之IO】1.字节流和字符流

  • 输入流和输出流是相对于内存而言
    • 将外设中的数据读取到内存中——输入
    • 将内存中的数据写入到外设中——输出

【Java之IO】1.字节流和字符流_第1张图片

一、字符流(字节流+编码表)

  • 只能处理字符数据(2个字节,文字)
  • 字节流读取文字字节数据后,不直接操作,而是先查指定的编码表Unicode,获取对应的文字。
  • Reader/Write(顶层基类)
  • Reader基本方法

    【Java之IO】1.字节流和字符流_第2张图片

  • Write基本方法

【Java之IO】1.字节流和字符流_第3张图片

//将文字存入硬盘中(输出流)
//如果要操作文字数据,优先考虑字符流Writer
//硬盘基本数据的体现是文件FileWriter
public class Demo {
    public static void main(String[] args) throws IOException {

        //创建一个可以往文件中写入字符数据的字符流输出对象
        //往一个文件中写入数据,就必须明确该文件(用于存储数据的目的地)
        //如果文件不存在,自动创建;如果文件存在,则会被覆盖。
        FileWriter fw = new FileWriter("demo.txt");

        //调用对象中的writer方法,写入数据
        //writer方法,其实是将数据写入到临时存储缓冲区中
        fw.write("abcde");

        //进行刷新,将数据直接写到目的地,刷新一次后还可以继续写数据,可以用多次
        //fw.flush();    

        //关闭流(关闭资源)前,会调用flush()刷新,关闭后不可以再写入数据,
        fw.close();
    }
}
  • 数据换行和续写
public class Demo {
    private static final String LINE_SEPARATOR = System.getProperty("line.separator");
    public static void main(String[] args) throws IOException {

        //构造方法中添加true,可以对文件续写
        FileWriter fw = new FileWriter("demo.txt",true);

        //fw.write("abcde\r\nhahahahh");//windows系统换行是\r\n
        fw.write("abcde" + LINE_SEPARATOR + "hahahahh");//使用系统的换行
        //fw.flush();    

        fw.close();
    }
}
  • IO异常处理
public class Demo {
    private static final String LINE_SEPARATOR = System.getProperty("line.separator");
    public static void main(String[] args) {        
        FileWriter fw = null;
        try {
            fw = new FileWriter("e:\\demo.txt");//抛异常是因为可能文件不存在,路径错误
            fw.write("abcde" + LINE_SEPARATOR + "hahahahh");//抛异常是因为写入失败
        } catch (IOException io) {
            sopl(fw.toString());
        } finally {
            if (fw != null) {
                try {
                    fw.close();//抛异常是因为windows底层反映的
                } catch (IOException io) {
                    throw new RuntimeException("关闭失败");
                }
            }
        }
    }
}
  • 文本文件读取,并将读取到的字符打印到控制台
//读取方式1:一次读一个字符read(),依次读
public class Demo {
    public static void main(String[] args) throws IOException {
        //创建一个读取字符流数据的对象
        FileReader fw = new FileReader("demo.txt");
        int ch = 0;
        while ((ch = fw.read()) != -1) {
            sopl(ch);//返回读取字符的二进制,读到结尾返回-1
        }       
    }
}

//读取方式2:使用read(char[])
public class Demo {
    public static void main(String[] args) throws IOException {
        FileReader fw = new FileReader("demo.txt");
        //先创建字符数组
        char[] c = new char[1024];//长度最好为1024的整数倍
        int num = 0;//将读到的字符存到数组中
        while ((num = fw.read(c)) != -1) {
            sopl(num);//返回读到的字符个数
            sopl(new String(c,0,num)); 
        }
    }
}
  • 复制文本文件
//复制文本文件:边读边写
public class Demo {
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("Demo.txt");
        FileWriter fw = new FileWriter("Demo(1).txt");
        int ch = 0;
        while ((ch = fr.read()) != -1) {
            fw.write(ch);
        }
        //也可以使用read(char[]),最好带着异常处理写
        fr.close();
        fw.close();
    }
}
  • 复制文本文件图解
    【Java之IO】1.字节流和字符流_第4张图片

二、 字节流

  • 处理字节数据(以字节为单位的二进制010101)
  • 不仅可以操作字符,还可以操作其他媒体文件。
  • InputStream/ OutputStream(顶层基类)
  • InputStream基本方法

    【Java之IO】1.字节流和字符流_第5张图片

  • OutputStream基本方法

【Java之IO】1.字节流和字符流_第6张图片

public class Demo {
    public static void main(String[] args) throws IOException {
        FileInputStream fip = new FileInputStream("Demo(byte).txt");
        //建议使用这种方法读数据
        byte[] b = new byte[1024];
        int len = 0;
        while((len = fip.read(b)) != -1) {
            sopl(new String(b, 0, len));
        }
        /*
        sopl(fip.available());//文件大小,对于大文件可以用来分段对文件进行读取
        byte[] b = new byte[fip.available()];
        fip.read(b);
        sopl(new String(b));
         */
    }
}
  • 操作媒体文件(复制)
public class Demo {
    public static void main(String[] args) throws IOException {
        FileInputStream fip = new FileInputStream("E:\\BaiduYunDownload\\JAVA\\IO\\08_PrintIO.avi");
        FileOutputStream fop = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\08_PrintIO(1).avi");
        byte[] b = new byte[1024];
        int len = 0;
        while((len = fip.read(b)) != -1) {
            fop.write(b, 0, len);
        }
        fip.close();
        fop.close();
    }
}
  • 处理异常
public class Demo {
    public static void main(String[] args) {
        byte[] b = new byte[1024];
        int len = 0;
        FileInputStream fip = null;

        try {
            fip = new FileInputStream("e:\\java.txt");
        } catch(FileNotFoundException e) {
            sopl("文件不存在");
        }

        try {
            while((len = fip.read(b)) != -1) {
                sopl(new String(b, 0, len));
            }

            fip.close();
        } catch(IOException e) {
            sopl("文件关闭错误");
        }
    }
}
  • 注:字符流和字节流这四个类派生的子类名称都是以父类名作为名称后缀,而子类的前缀就是该对象的功能。

你可能感兴趣的:(【Java之IO】1.字节流和字符流)