第三十四天

今天了解到了不同的流,学到了字节流、字符流、过滤流和内存操作流的一些方法明天学习缓冲流和Scanner类

流在Java中是比较重要的概念,

1、流分为两种:

①输入流:从流当中不停的吧字节去除

②输出流:把准备好的字节串传给它

2、java.io包中的stream类根据其操作对象分为两大类  字符流和字节流

①字节流:InputStream是所有字节输入的父类,而OutputStream是所有字节输出流的父类。所有字符流都以Stream结尾。

②字符流:Reader是所有读取字符串输入流的父类,Write是所有输出字符串的父类。所有字符流都以Reader/Write结尾。

3、

(1)字节流

①输出字节流OutputStream

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class FileoutStreamDemo {
    public static void main(String[] args)throws IOException{
        out();
    }
    public static void out()throws IOException{
        //第一步获得对象
        OutputStream out =new FileOutputStream("D:/Hello.txt");
        //输出的内容
        String info="Hello Java!!";
        //将内容转换成字节数组
        byte[] buf =info.getBytes();
        //写到文件里
        out.write(buf);
        //关闭
        out.close();
    }
}
使用FileOutputStream的另一个构造方法。如果这时再将程序运行一遍,文件里的内容会被覆盖。
追加内容:true
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class FileoutStreamDemo {
    public static void main(String[] args)throws IOException{
        out();
    }
    public static void out()throws IOException{
        //第一步获得对象
        OutputStream out =new FileOutputStream("D:/Hello.txt",true);
        //输出的内容
        String info="Hello PHP!!";
        //将内容转换成字节数组
        byte[] buf =info.getBytes();
        //写到文件里
        out.write(buf);
        //关闭
        out.close();
    }
}

 

现在还是存在一个问题,如果在关闭程序以前出现异常,文件就不能关闭,所以应该将关闭放在finally里,不管程序有无异常,都应该关闭流。

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class FileoutStreamDemo {
    public static void main(String[] args) throws IOException{
        out();
    }
    public static void out() {
        //第一步获得对象
        OutputStream out=null;
        try {
            out=new FileOutputStream("D:/Hello.txt",true);
            //输出内容
            String info="Hello AD";
            //将内容转换成字节数组
            byte[] buf=info.getBytes();
            //写到文件里
            out.write(buf);
        }catch(IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if(out!=null)
                    out.close();
            }catch(IOException e) {
                e.printStackTrace();
            }
        }
        
    }
}

 

②输入字节流InputStream

ByteArrayInputStream、StringBufferInputStream、FilelnputStream是三种基本的介质

从Byte数组                           StringBuffer                           本地文件          中读取数据

 

import java.io.FileInputStream;
import java.io.IOException;

public class FileInputStreamDemo {
    public static void main(String[] args) throws IOException{
        in();
    }
    public static void in() {
        //新建一个对象
        FileInputStream in=null;
        try {
            in=new FileInputStream("D:/Hello.txt");
            //开辟一个空间
            byte[] buf=new byte[1024];
            int len=-1;
            while((len=in.read(buf))!=-1) {
                String s=new String(buf,0,len);
                System.out.println(s);
            }
        }catch(IOException e){
            e.printStackTrace();
        }finally {
            try {
                if(in!=null)
                    in.close();
            }catch(IOException e) {
                e.printStackTrace();
            }
        }
    }
}

(2)字符流

Reader与Writer和其子类都是处理字符流的相关类。字符流可以对数据以一个字符的长度为单位来处理,并进行适当的字符编码转换处理,一般字符流都用来操作纯文本文件。

①字符输出流

Writer是字符输出流,该类是一个抽象类,所以需要使用子类FileWrite类来操作文件。

import java.io.FileWriter;
import java.io.IOException;
public class WriterDemo {
    public static void main(String[] args) throws IOException{
        write();
    }
    public static void write() throws IOException{
        //获取对象
        FileWriter fw=new FileWriter("D:/Hello.txt");
        //直接输出
        fw.write("Hello c+");
        //关闭
        fw.close();
        
    }
}

每次追加内容,上文不被覆盖需要FileWrite新的构造函数

加:true

import java.io.FileWriter;
import java.io.IOException;
public class WriterDemo {
    public static void main(String[] args) throws IOException{
        write();
    }
    public static void write() throws IOException{
        //获取对象
        FileWriter fw=new FileWriter("D:/Hello.txt",true);
        //直接输出
        fw.write("Hello c+");
        //关闭
        fw.close();
        
    }
}

②字符输入流

Reader是一个字符输入流,但他是一个抽象类,所以要用FileReader来实例化

import java.io.Reader;
import java.io.IOException;
import java.io.FileReader;

public class ReaderDemo {
    public static void main(String[] args)throws IOException{
        reader();
    }
    public static void reader() throws IOException{
        Reader r=new FileReader("D:/Hello.txt");
        char[] buf=new char[1024];
        int len=0;
        while((len=r.read(buf))!=-1) {
            String s=new String();
            System.out.println(s);
        }
        r.close();
    }
}

 

4、字节流与字符流的区别

字节流与字符流的区别主要体现在以下两点。

①读写单位不同:字节流以字节( 8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。

②处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。

结论:只要是处理纯文本数据,就优先考虑使用字符流,此外,都使用字节流。

 

posted @ 2020-08-08 19:14  yasai  阅读(74)  评论(0编辑  收藏  举报