IO流

概念:

i: input输入
o: out输出
流:数据(字符,字节)
在这里插入图片描述

字节输出流

outputStream字节输出流
fileoutputstream 文件字节输出流
Fileoutputstream(String name) //文件路径 指定文件写入输出文件流
Fileoutputstream(File file)//目的文件 创建一个指定file对象表示的文件中写入数据的文件输出

构造方法作用:

  1. 创建一个Fileoutputstream对象,
    2**.根据传递的文件路径 创建一个空的文件**
    3.把Fileoutputstream对象指向创建好的文件

写入数据的原理(内存–>硬盘)
java–> jvm -->os(操作系统)–>os调用写数据的方法–>把数据写入文件夹

字节输出流的使用步骤

1.创建一个Fileoutputstream对象,构造方法中传递写入数据目的地
2.调用Fileoutputstream对象中的writre,把数据写入文件夹
3.释放资源(清理内存)

基本原理

在这里插入图片描述

eg1(一个字节):
在这里插入图片描述
eg2(多个字节):
规则

实例
结果

eg3:字符串
1.转换为字符数组
2.写入字符数组
在这里插入图片描述
结果
eg:追加写/续写
append:追加写开关 true–不覆盖原文件;false–创建新文件覆盖原文件
在这里插入图片描述
在这里插入图片描述

字节输入流

子类方法:
int read()从输入中读取下一个字节
int read(byte[] b)读取字节数组
void close()关输入
作用:把硬盘数据读取到内存中

构造方法参数:
FileIntputstream(String name) //文件路径
FileIntputstream(File file)//目的文件

构造方法作用:

  1. 创建一个FileIntputstream对象,
    2.把FileIntputstream对象指向要读取的文件

使用步骤
1.创建FileIntputstream对象,读取数据源
2.使用FileIntputstream对象中的方法read,读取文件
3.释放资源
eg1:单个读取,
读取文件
重复的过程,使用循环优化,当读取到-1的时候结束循环
在这里插入图片描述
eg2:多个字节读取
在这里插入图片描述
demo文件复制:
1.创建字节输入流,
2.创建一个字节输出流
3.用字节输入流对象read读取文件
4.使用字节输出流的write,输出到文件夹
5.释放资源

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

public class demotext {
    public static void main(String[] args) throws IOException {
        FileInputStream fis=new FileInputStream(".//d.txt");
        FileOutputStream fos=new FileOutputStream(".//c.txt");
      /*单个字节
          int len=0;
      while ((len=fis.read())!=-1)
        {
            fos.write(len);
        }*/
       //多个字节
        byte[] bytes =new byte[1024];
        int len=0;
        while ((len=fis.read(bytes))!=-1)
        {
            fos.write(bytes,0,len);
        }
        //释放资源
     fis.close();
        fos.close();
    }
}

字符输入流

字节流:每次读取一个字节 ,gbk 2个字节,utf-8 3个字节,每次读中文 就会只读取1/3中文 就会报乱码
字符流:可以一次读取一个字符包括中文
子类方法:
int read()从输入中读取下一个字节
int read(char[] cbuf)读取字节数组
void close()关输入
作用:把硬盘数据读取到内存中

构造方法参数:
FileReader(String name) //文件路径
FileReader(File file)//目的文件

构造方法作用:

  1. 创建一个FileReader对象,
    2.把FileReader对象指向要读取的文件

使用步骤
1.创建FileReader对象,读取数据源
2.使用FileReader对象中的方法read,读取文件
3.释放资源

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;

public class demotext {
    public static void main(String[] args) throws IOException {
        FileReader fr=new FileReader(".//d.txt");

    /*
    单个字符
    int len=0;
      while ((len=fr.read())!=-1)
        {
            System.out.println((char)len);
        }
      */
    //多个字符
        char[] cs =new char[1024];
        int len=0;
        while ((len=fr.read(cs))!=-1)
        {
            System.out.println(new String(cs,0,len));
        }
        fr.close();
    }
}

字符输出流

使用步骤
1.创建FileWriter对象,读取数据源
2.writer方法,把数据写到内存中(字符转换为字节)
3.flush方法,把缓存区的数据刷新到文件夹中
4.释放资源。(也会刷新缓冲区,释放资源,但是流对象不能再使用)


/*
//文件的复制
1.创建字节输入流,
2.创建一个字节输出流
3.用字节输入流对象read读取文件
4.使用字节输出流的write,输出到文件夹
5.释放资源
*/
import java.io.*;

public class demotext {
    public static void main(String[] args) throws IOException {
        FileWriter fw = new FileWriter(".//k.txt",true); //1.创建对象,  //续写,不覆盖
   /*
    //单个个字符
       fw.write(97); //2.写资源
       fw.flush();//3.刷新缓冲区
        fw.close(); //4.关的时候也会刷新缓冲区
   */

   
    /*
    //多个字符
        char[] cs ={'松','哥','6','6'};
        fw.write(cs);
        // fw.write(cs,1,3); //写1-3位的字符
         fw.flush();
        fw.close();
        */

    
        //字符串
        fw.write("松哥666"+"\n");
        fw.flush();
        fw.close();
    }
}



Properties集

Properties类持久的属性集,可保存在流中或从流中加载
Properties唯一和IO流结合的集合
properties是双列集合,key和value都是String
store方法,集合数据存入硬盘
load方法,读取数据到集合

Property集合存储遍历

setProperty(String key,String value)调用hashtable的put方法
Setset=prop.stringPropertyNames(); 返回属性的健集,其中健值对应的是字符串
prop.getProperty(key);通过key找到value值

使用步骤
1.创建Properties对象
2.使用setProperty往集合添加数据
3.返回属性的健集,
4.获取健值

import java.util.Properties;
import java.util.Set;

public class demo6 {


    public static void main(String[] args) {
        //1.创建Properties对象
        Properties prop=new Properties();
        //2.使用setProperty往集合添加数据
        prop.setProperty("松哥","666");
        prop.setProperty("龙哥","777");
        prop.setProperty("谦哥","888");

        // Set<String> .stringPropertyNames() 3.返回属性的健集,
        Set<String>set=prop.stringPropertyNames();

        for (String key: set) {
            //4.获取健值
            String value=prop.getProperty(key);
            System.out.println(value);
        }
    }
}

store方法

void store(OutputStream out,String comments) 字节输出流
void store(Writer writer,String comments) 字符输出流
comments:注释,不能采用中文,默认unicode

使用步骤:
1.创建Properties对象
2.创建字节/字符输出流对象,绑定输出地
3.使用properties的strore方法,把数据写入硬盘

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Properties;
import java.util.Set;

public class demo6 {


    public static void main(String[] args) throws IOException {
        //1.创建Properties对象
        Properties prop=new Properties();

        //2.使用setProperty往集合添加数据
        prop.setProperty("松哥","666");
        prop.setProperty("龙哥","777");
        prop.setProperty("谦哥","888");

        //3.创建输出流
        FileWriter writer=new FileWriter(".//e.txt");

        //4.用Properties方法中的store方法写入硬盘
        prop.store(writer,"data");

        writer.close();
    }
}

load方法

void load(InputStream in) 字节输入流
void load(Reader reader) 字符输入流


1.健与值默认=,空格,
2.可以使用#注释
3.健值默认字符串,不需要加引号
使用步骤
1.创建Properties对象
2.创建输入流
3.用load方法保存健值对的文件
4.遍历集合
5.关流

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Properties;
import java.util.Set;

public class demo6 {

    public static void main(String[] args) throws IOException {
        //1.创建Properties对象
        Properties prop=new Properties();

        //2.创建输入流
        FileReader Reader=new  FileReader(".//e.txt");

        //3.读取输入流的健值对文件
          prop.load(Reader);

        //4.遍历
        Set<String> set =prop.stringPropertyNames();

        for (String key:set) {
            String value=prop.getProperty(key);
            System.out.println(value);
        }
      //5.关流
        Reader.close();
    }
}

缓冲流

不用缓存 一个一个a,传完了传b
用缓存 ,a,c,b,d放入缓存区,然后一下发给用户
在这里插入图片描述

字节输出缓冲流

构造方法:
BufferedOutputStream(Outputstream out)
BufferedOutputStream(Outputstream out,int size)
Outputstream:字节输出流
size缓存区大小
使用步骤
1.创建字节输出流
2.创建缓存流对象
3.调用write方法写数据
4.释放资源

import java.io.*;

public class demo7{


    public static void main(String[] args) throws IOException {
        //1.创建字节输出流
        FileOutputStream fs=new FileOutputStream(".//f.txt");
        //2.创建缓存流对象
       BufferedOutputStream bos=new BufferedOutputStream(fs);
       //3.调用write方法写数据
       bos.write("松哥666".getBytes());
        //4.释放资源
        bos.close();

}

}

字节输入缓存流

构造方法:
BufferedInputStream(Inputstream In)
BufferedInputStream(Inputstream In,int size)
Inputstream:字节输出流
size缓存区大小
1.创建字节输入流
2.创建缓存流对象
3.调用read方法读数据
4.释放资源

import java.io.*;

public class demo7{


    public static void main(String[] args) throws IOException {
        //1.创建字节输出流
        FileInputStream fis=new FileInputStream(".//f.txt");
        //2.创建缓存流对象
       BufferedInputStream bis=new BufferedInputStream(fis);
        //3.调用read方法读数据
        byte[] bytes=new byte[1024];
       int len=0;
       while((len= bis.read(bytes))!=-1)
       {
           System.out.println(new String(bytes,0,len));
       }
        //4.释放资源
        bis.close();

}
}

字符输出缓冲流

构造方法:
BufferedWriter(Writer out)
BufferedWriter(Writer out,int size)
Outputstream:字节输出流
size缓存区大小
void newline()行的分隔符
使用步骤
1.创建字符输出流,创建缓冲流对象
2.调用write方法写数据
3.刷新缓存区
4.释放资源

import java.io.*;

public class demo7{


    public static void main(String[] args) throws IOException {
        //1.创建字节输出流
        FileWriter fw=new FileWriter(".//f.txt");
        //2.创建缓存流对象
       BufferedWriter bw=new BufferedWriter(fw);
        //3.调用read方法读数据
        for (int i = 0; i < 10; i++) {
                bw.write("松哥666");
                bw.newLine();
        }
        //4.释放资源
        bw.flush();
        bw.close();

}

}

字符缓冲输入流

构造方法:
BufferedReader(Reader out)
BufferedReader(Reader out,int size)
Reader:字节输入流
size缓存区大小
void readLine()行的分隔符
使用步骤
1.创建字符输入流,创建缓冲流对象
2.调用read方法写数据
3.刷新缓存区
4.释放资源

import javax.annotation.processing.Filer;
import java.io.*;

public class demo7{


    public static void main(String[] args) throws IOException {
        //1.创建字节输出流
        FileReader fr=new FileReader(".//f.txt");
        //2.创建缓存流对象
       BufferedReader br=new BufferedReader(fr);
        //3.调用read方法读数据
        String line;
        while ((line=br.readLine())!=null)
        {
            System.out.println(line);
        }
        //4.释放资源
        br.close();
}

}

demo对文本排序

1.创建一个HashMap集合,存 序号-文本
2.创建字符缓冲输入流,字符缓冲输出流
3.字符缓冲输入流读取每行文本
4.把文本进行切割-properties集
5.切割好的排序
6.获得每个键值对遍历集合
7.把键值对拼接为文本
8.字符缓冲输出流输出到页面
9.释放资源

import javax.annotation.processing.Filer;
import java.io.*;
import java.util.HashMap;

public class demo7{


    public static void main(String[] args) throws IOException {

        //1.创建hashmap
        HashMap<String,String>map=new HashMap<>();

        //2.创建字节输出流
      FileReader fr=new FileReader(".//f.txt");
      BufferedReader br=new BufferedReader(fr);
      FileWriter fw=new FileWriter(".//f.txt");
      BufferedWriter bw=new BufferedWriter(fw);
        //3.字符缓冲输入流读取每行文本
        String line;
        while ((line=br.readLine())!=null)
        {
            //4.把文本进行切割-properties集
            String []arr=line.split("\\.");
            //5.切割好的排序
           map.put(arr[0],arr[1]);
        }

        //6.获得每个键值对遍历集合
        for (String key:map.keySet()
             ) {
            String value=map.get(key);
           // 7.把键值对拼接为文本
            line=key+"."+value;
            //8.字符缓冲输出流输出到页面
            bw.write(line);
            bw.newLine();
        }

        //4.释放资源
        br.close();
        bw.close();
}

}

转换流

可以查询指定码表
原因:FileReader只能读取utf-8不能读取gbk码表

在这里插入图片描述

OutputStreamWriter
OutputStreamWriter(OutputStream out) //默认编码
OutputStreamWriter(OutputStream out,String charsetname) //指定编码

InputStreamReader
InputStreamReader(InputStream In) //默认编码
InputStreamReader(InputStream In,String charsetname) //指定编码

转码demo
1.创建InputStreamReader对象传入GBK
2.创建OutputStreamWriter对象UTF-8
3.InputStreamReader对象读取文件
4.OutputStreamWriter对象写入文件
5.释放资源

import java.io.*;

public class demo8 {

    public static void main(String[] args) throws IOException {

        InputStreamReader isr=new InputStreamReader(new FileInputStream(".//g.txt"),"GBK");
        OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream(".//h.txt"),"Utf-8");
   int len=0;
   while ((len=isr.read())!=-1)
   {
       osw.write(len);
   }
   osw.close();
   isr.close();

    }
}

序列化流

把对象以流的方式写入硬盘
类object要实现标记行接口 Serializable
在这里插入图片描述
ObjectOutputStream流
步骤:
//1.创建序列流
//2.用writeobject方法
//3.释放资源


public class person  implements Serializable {
    private String name;
    private int age;

    public person() {
    }

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}


import java.io.*;

public class demo8 {

    public static void main(String[] args) throws IOException {
       //1.创建序列流
        ObjectOutputStream  oos =new ObjectOutputStream(new FileOutputStream(".//k.txt"));
       //2.用writeobject方法
        oos.writeObject(new person("松哥",18));
        //3.释放资源
        oos.close();

    }
}

ObjectInputStream流
反序列的前提
1.类必须实现 Serializable接口
2.必须存在对应的class文件
步骤:
//1.创建序列流
//2.用readobject方法
//3.释放资源
//4.打印对象

import java.io.*;

public class demo8 {

    public static void main(String[] args) throws IOException, ClassNotFoundException {
       //1.创建序列流
        ObjectInputStream  ois =new ObjectInputStream(new FileInputStream(".//k.txt"));
       //2.用readobject方法
        Object o=ois.readObject();
        //3.释放资源
        ois.close();
        //打印对象
        System.out.println(o);
        person p=(person)o;
        System.out.println(p.getName()+p.getAge());

    }
}

瞬态关键字

static :静态 --不能被序列化的(不能被修改,写入的)
transient: 瞬态关键字 --也是不能被序列化的(不能被修改,写入的)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值