2021-08-04

OutputStream:
表示字节输出流的*父类
close();关闭流
flush();刷新流
write(byte[] bye):输出字节数组
write(byte[] bye,int off,int len):输出数组,从off位置开始输出len个长度的数据
FileOutputStream(字节输出流):
将内存上的数据输出到硬盘
构造方法(当这个文件不存在的时候会创建一个新的文件,如果存在会清空文件中的数据):

	//会有一个找不到文件的异常要处理
     //FileOutputStream构造方法
        File file=new File("d:/io/a.txt");
        FileOutputStream fos=new FileOutputStream(file);
        方式二:
        FileOutputStream fos=new FileOutputStream("d:/io/a.txt");

write方法:

  //write()方法 向文件存入abc
        fos.write(97);
        fos.write(98);
        fos.write(99);
        //write(byte[]byte) 向文件写入数组数据
        fos.write("我爱你胡".getBytes());
        //把abc写入数组中
        byte [] byt={97,98,99,100,101};
        fos.write(byt,0,3);
        fos.close();//操作完以后一定要关闭流释放资源

像刚才所说的,每次会清空文件里的数据,那么我不想让他清空文件的数据,继续接着写入应该怎么办

//追加续写,构造方法的时候在file对象或者字符串后面加一个true的参数就可以完成追加续写了
FileOutputStream fos=new FileOutputStream("d:/io/a.txt",true);

换行

 fos.write("\r\n".getBytes());//回车换行
        fos.write("\n".getBytes());//换行

InputStream:
字节输入流的超类
将硬盘的数据读取到内存
FileInputStream(字节输入流):
构造方法:

//方式一:
 File file=new File("d:/io/a.txt");
 FileInputStream fis=new FileInputStream(file);
 方式二:
 FileInputStream fis=new FileInputStream("d:/io/a.txt");//abcdefghi

read:

//read():读取一个字节,如果读取到文件末尾返回-1
        int read = fis.read();
        System.out.println(read);//97
//循环改进
        int read;
        while ((read=fis.read())!=-1){
            System.out.println((char)read);// abcdefghi
        }
 //read(byte[] byt) 读取数组长度的数据到字节数组
        byte[] byt=new byte[5];
        fis.read(byt);
        System.out.println(Arrays.toString(byt));//97 98 99 100 101
        for (byte b : byt) {
            System.out.println((char)b); // abcde
        }
//read(byte[] byt)返回值是读取的有效个数
        byte[] byt=new byte[5];
        int read = fis.read(byt);
        System.out.println(read); //5

//复制图片案列

            //1.创建输入流读取图片
            FileInputStream fis=new FileInputStream("d:/io/girl.jpg");
            //5.创建输出流实现复制功能
            FileOutputStream fos=new FileOutputStream("d:/庞传玉/a.jpg");
            //2.创建数组接受数据
            byte []byt=new byte[1024];
            //3.创建变量读取有效数字
            int len;
            //4.创建循环读取
            while ((len=fis.read(byt))!=-1){
                //6.读取数据写出去
                fos.write(byt,0,len);
                }
            fos.flush();
            fis.close();
            fos.close();

使用字节流读取中文的时候可能不会显示完整的字符,因为中文字符占用的字节多,所以java出现了字符流,专门处理文本.
Reader抽象类是表示用于读取字符流的所有类的超类
字符输入流:
FileReader:

//构造方法
        File file=new File("d:/io/portry.txt");
        FileReader fr=new FileReader(file);
        方式二:
        FileReader fr=new FileReader("d:/io/poetry.txt");

read()

//单个读取文本文件 每次读取一个字符,提升为int类型,读到文件末尾返回-1,
        int len;
        while ((len= fr.read())!=-1){
            System.out.print((char)len);
        }
//读取到数组 每次读取数组长度的字符,读取到数组,返回值是读取的有效个数,读取到文件末尾返回-1;
 char[]chs=new char[1024];
       int len;
       while ((len=fr.read(chs))!=-1){
           System.out.println(new String(chs,0,len));
       }

java.io.Writer抽象类是表示用于写出字符流的所有类的超类
FileWriter(字符输出流):
构造方法

		File file=new File("d:/io/poetry.txt");
        FileWriter fw=new FileWriter(file);
        方式二:
        FileWriter fw=new FileWriter("d:/io/poetry.txt");

writer():

       //写出一个字符
//        write(int i)
        fw.write(97);//a
        //写出字符数组
        //write(char [] chs)
        fw.write("我爱你".toCharArray());
        //写出字符串
        fw.write("哈哈哈");
        //输出指定字符串
        fw.write("666嘻嘻嘻",0,3);

!!!因为内置缓冲区的原因,FileWriter输出数据必须刷新或者关闭流,把缓冲区的数据强制刷出去,不然文件是接受不到数据的.
flush :// 刷新缓冲区,流对象可以继续使用。
close :// 关闭流,释放系统资源。关闭前会刷新缓冲区。
ResourceBundle:
使用ResourceBundle类读取properties配置文件:

 //构造方法
        ResourceBundle bundle=ResourceBundle.getBundle("a");
        //getString(String key) 获取properties文件里面key的value
        String tid = bundle.getString("tid");
        String name = bundle.getString("name");
        System.out.println(tid+","+name);

InputStreamReader:
将字节流转成字符流的桥梁
InputStreamReader isr=new InputStreamReader(new FileInputStream(“d:/io/a.txt”),“utf-8”);
OutputStreamWriter:
将字符流转成字节流的桥梁
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream(“d:/io/a.txt”),“utf-8”);
序列化与反序列化

public class Student implements Serializable {
    private static final long serialVersionUID = -2177940198820916898L;
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    }
public static void main(String[] args) throws IOException, ClassNotFoundException {
        Student student=new Student("庞传钰",21);
        //创建序列化流对象必须实现Serializable接口
        ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("d:/io/Student.txt"));
        oos.writeObject(student);
        oos.flush();
        //创建反序列化流
        //在反序列化过程中不能操作字节码文件
        ObjectInputStream ois=new ObjectInputStream(new FileInputStream("d:/io/Student.txt"));
        Student s = (Student) ois.readObject();
        System.out.println(s.getName());
        System.out.println(s.getAge());
        oos.close();
    }

晚安各位

上一篇:javaSE 笔记 IO流


下一篇:Android 动态修改 html 文件的字符串