IO流

1.字节流

1)字节输出流
java.io.OutputStream

:字节输出流顶层父类, 这个抽象类是表示字节输出流的所有类的超类。输出流接收输出字节并将其发送到某个接收器。

成员方法:

void write(int b) 将指定的字节写入此输出流。写出的字节会被解码为对应的字符数据。一次只能写出一个字节数据,如果超出一个字节,只能写出最后的8个二进制数据。
void write?(byte[] b) 将数组中的所有数据写到指定的接收器。
void write?(byte[] b, int off, int len) 将数组中的指定范围的数据写到指定的接收器。
int off:写出数据的起始下标 , int len:写出的字节个数
void close?() 关闭此输出流并释放与此流相关联的任何系统资源。

java.io.FileOutputStream

:文件字节输出流

构造方法:如果文件路径不存在,则抛出异常,如果文件路径存在,但是文件不存在,则创建文件。

FileOutputStream(String name) 创建文件输出流以指定的名称写入文件。

​ String name: 需要写入数据的文件路径。

FileOutputStream(File file) 创建文件输出以写入由指定的File对象表示的文件。

​ File file :需要写入数据的文件对象。

FileOutputStream(String name, boolean append) 创建文件的输出流以指定的名称的写入文件。

FileOutputStream(File file,boolean append)创建文件输出流以指定的File对象文件写入。

​ boolean append:默认为false,指定为true时可实现数据的追加。

public static void  Func(){
    FileOutputStream fos=new FileOutputStream(File file);
        fos.write();
        fos.close();
}
2)字节输入流
java.io.InputStream

: 字节输入流顶级父类

成员方法:

void close?() 关闭此输入流并释放与流相关联的任何系统资源。
int read?() 从输入流读取一个字节数据。'返回的是读取的字符编码值,如果返回-1表示文件读取完成。
int read?(byte[] b) 从输入流中读取一些字节数,并将它们存储到缓冲器阵列 b 。
int read?(byte[] b, int off, int len) 从输入流读取最多 len个字节的数据到字节数组。

java.io.FileInputStream

: 文件字节输入流, 从文件中读取数据。

构造方法: 文件一定要存在。
FileInputStream(File file) 创建字节输入流对象,指定需要读取的文件对象。
FileInputStream(String name) 创建字节输入流对象,指定需要读取的文件路径。

public static void  Func(){
    FileIntputStream fos=new FileIntputStream(File file);
        fos.read();
        fos.close();
}

2.字符流

1)字符输出输入流

字符流: 字节流 + 编码表 操作的一定是字符数组。

java.io.Writer

: 字符流顶层父类

字符输出流: Writer
FileWriter: 给目标文件中写入字符数据。

构造方法:
FileWriter(File file) 给一个File对象构造一个FileWriter对象。
FileWriter(File file, boolean append) 给一个File对象构造一个FileWriter对象。
FileWriter(String fileName) 构造一个给定文件名的FileWriter对象。
FileWriter(String fileName, boolean append) 构造一个FileWriter对象,给出一个带有布尔值的文件名,表示是否附加写入的数据。

public static void  Funs(){
    FileWriter fw=new FileWriter(File file);
    fw.writer();
}
java.io.Reader

:字符流输入流顶层父类

字符输入流: Reader
FileReader: 从目标文件中读取字符数据

成员方法:

int read() 读一个字符 。
int read(char[] cbuf) 将字符读入数组。
int read(char[] cbuf, int off, int len) 将字符读入数组的一部分。
void close() 关闭流并释放与之相关联的任何系统资源。

public static void Func(){
    FileReader fd=new FileReader(File file);
    fd.reader();
}

3.转换流

1)字节转字符输入流

实现字符和字节数据之间的转换(编码、解码)。数据最终都是以字节的形式保存在文件中。

java.io.InputStreamReader

: 从字节流到字符流的桥梁:它读取字节,并使用指定的charset将其解码为字符。

​ 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。
'字节转字符输入流,没有字符转字节输入流。

构造方法:
InputStreamReader?(InputStream in) 创建一个使用默认字符集的InputStreamReader。
InputStreamReader?(InputStream in, String charsetName) 创建一个使用命名字符集的InputStreamReader。

public static void Func(){
    InputStream  is=new InputStream(new FileInputStream("路径"));
    InputStreamReader isr=new InputStreamReader(is);
    isr.reader();
    isr.close();
    is.close();
}
2)字符转字节输出流
java.io.OutputStreamWriter

:是从字符流到字节流的桥梁:使用指定的charset将写入的字符编码为字节。
它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。
'字符转字节输出流,没有字节转字符输出流
构造方法:
OutputStreamWriter?(OutputStream out) 创建一个使用默认字符编码的OutputStreamWriter。
OutputStreamWriter?(OutputStream out, String charsetName) 创建一个使用命名字符集的OutputStreamWriter。

流的关闭问题: 先开后关, 如果流之间有依赖的关系,先关闭被依赖的流。

public static void Func(){
    OutputStream  os=new OutputStream(new FileOutputStream("路径"));
    OutputStreamWriter osw=new OutputStreamWrotero(os);
    osw.writer();
    osw.close();
    os.close();
}

4.缓冲流

缓冲流: 高效率,读写的效率特别高。

1)字节输出缓冲流
java.io.BufferedOutputStream

: 字节输出缓冲流
构造方法:
BufferedOutputStream?(OutputStream out) 创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
BufferedOutputStream?(OutputStream out, int size) 创建一个新的缓冲输出流,以便以指定的缓冲区大小将数据写入指定的底层输出流。

public class BufferedCopy {
    public static void main(String[] args) throws IOException {
        copy02();
    }
    // 使用高效率复制文件
    public static void copy02() throws IOException {
        long time = System.currentTimeMillis();
        // 创建高效率输入输出流对象
        BufferedInputStream bis = new BufferedInputStream( new FileInputStream("d:\\demo\\1.avi"));
        BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream("d:\\demo\\2.avi"));
        // 声明变量
        int len = 0;
        // 声明数组
        byte[] bytes = new byte[1024];
        // 复制
        while ( (len = bis.read(bytes) ) != -1 ) {
            bos.write(bytes,0,len);
        }
        // 关流
        bos.close();
        bis.close();

        System.out.println( "tiem = " + (System.currentTimeMillis() - time) );
    }
}
2)字节输入缓冲流
java.io.BufferedInputStream

: 字节输入缓冲流
构造方法:
BufferedInputStream?(InputStream in) 创建一个 BufferedInputStream并保存其参数,输入流 in供以后使用。
BufferedInputStream?(InputStream in, int size) 创建具有指定缓冲区大小的 BufferedInputStream ,并保存其参数,输入流 in供以后使用。

public class BufferedCopy {
    public static void main(String[] args) throws IOException {
        copy02();
    }
    // 使用高效率复制文件
    public static void copy02() throws IOException {
        long time = System.currentTimeMillis();
        // 创建高效率输入输出流对象
        BufferedInputStream bis = new BufferedInputStream( new FileInputStream("d:\\demo\\1.avi"));
        BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream("d:\\demo\\2.avi"));
        // 声明变量
        int len = 0;
        // 声明数组
        byte[] bytes = new byte[1024];
        // 复制
        while ( (len = bis.read(bytes) ) != -1 ) {
            bos.write(bytes,0,len);
        }
        // 关流
        bos.close();
        bis.close();

        System.out.println( "tiem = " + (System.currentTimeMillis() - time) );
    }
}
3)字符输入缓冲流
java.io.BufferedWriter

: 字符输出缓冲流
构造方法:
BufferedWriter?(Writer out) 创建使用默认大小的输出缓冲区的缓冲字符输出流。
BufferedWriter?(Writer out, int sz) 创建一个新的缓冲字符输出流,使用给定大小的输出缓冲区。

特有的成员方法:
void newLine?() 写一行行分隔符。

public class BufferedLine {
    public static void main(String[] args) throws IOException {
        // 创建字符输出缓冲流
        BufferedWriter bw = new BufferedWriter( new FileWriter("d:\\demo\\bw.txt"));*/
        // 写出数据
        bw.write("床前明月光");
        // 写出换行
        bw.newLine();
        bw.write("疑是地上霜");
        ///
        // 声明变量 保存读取到的一行数据
        String line = null;
        while ( ( line = br.readLine()) != null ) {
            System.out.println(line);
        }
        // 关流
        bw.close();
    }
}

4)字符输出缓冲流
java.io.BufferedReader

: 字符输入缓冲流
构造方法:
BufferedReader?(Reader in) 创建使用默认大小的输入缓冲区的缓冲字符输入流。
BufferedReader?(Reader in, int sz) 创建使用指定大小的输入缓冲区的缓冲字符输入流。
特有的成员方法:
String readLine?() 读一行文字。'撒多浪费TMD就对NND了撒发

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

        // 创建字符输入缓冲流

        BufferedReader br = new BufferedReader( new FileReader("d:\demo\bw.txt"));

        // 声明变量 保存读取到的一行数据

        String line = null;

        while ( ( line = br.readLine()) != null ) {

            System.out.println(line);

        }

        // 关流

        br.close();
}
5)属性集
java.util.Properties
Properties类表示一组持久的属性。 public class BufferedLine {

}Properties可以保存到流中或从流中加载。 属性列表中的每个键及其对应的值都是一个字符串。
'要求 key 和 value 都是String类型数据

成员方法:
setProperty?(String key, String value) 调用 Hashtable方法 put 。
String getProperty?(String key) 使用此属性列表中指定的键搜索属性。 get(Object key)
Set stringPropertyNames?() 获取key值的set视图。相当于 keySet()方法
将集合中的数据写到指定的文件中:
void store?(OutputStream out, String comments)
void store?(Writer writer, String comments)
将文件中的数据读取到程序中:
void load?(InputStream inStream)
void load?(Reader reader)

public class PropertiesDemo {
    public static void main(String[] args) throws IOException {
        // 创建属性集对象
        Properties prop = new Properties();
        // 给属性集中保存数据
        prop.setProperty("东邪", "黄药师");
        prop.setProperty("xidu", "ouyangfeng");
        prop.setProperty("男滴", "段皇爷");
        prop.setProperty("北丐", "洪七公");
        prop.setProperty("中神通", "王重阳");
        prop.setProperty("中神通", "磊哥");
        System.out.println("prop = " + prop);
6)键盘录入

键盘录入: 通过键盘将数据录入到程序中。 操作系统 System.in: 基于获取输入流,读取键盘录入的数据
// 获取系统的输入流,读取键盘录入的数据
InputStream in = System.in;
// 将字节流转换为字符流
InputStreamReader isr = new InputStreamReader( in );
// 缓冲流读取一行键盘录入的数据
BufferedReader br = new BufferedReader( isr );
br.readLine(); // 回车结束 null

​ BufferedReader br = new BufferedReader( new InputStreamReader(System.in));
’ 输入流,有模板代码读取,但是需要通过if指定一个结束的语句。

5.序列化与反序列化流

序列化和反序列化流 : 对象的数据读写(将对象写到文件中,也可以将写到文件中的对象读取到程序中)
序列化 : 将对象写到本地文件中。
反序列化 : 将本地文件中的对象读取到程序中。

1)序列化类
java.io.ObjectOutputStream

: 序列化类
构造方法:
ObjectOutputStream?(OutputStream out) 创建一个写入指定的OutputStream的ObjectOutputStream。
成员方法:
void writeObject?(Object obj) 将指定的对象写入ObjectOutputStream。

public class ObjectStreamDemo {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        readObject();
    }
    // 反序列化
    public static void readObject() throws IOException, ClassNotFoundException {
        // 创建反序列化对象
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d:\\demo\\oos.txt"));
        // 调用方法 反序列化
        ArrayList<String> list = (ArrayList<String>)ois.readObject();
        // 遍历集合
        for (String s : list) {
            System.out.println("s = " + s);
        }
        // 关流
        ois.close();
    }
2)反序列化类
java.io.ObjectInputStream

:反序列化类
构造方法:
ObjectInputStream?(InputStream in) 创建从指定的InputStream读取的ObjectInputStream。
成员方法:
Object readObject?() 从ObjectInputStream读取一个对象。

public class ObjectStreamDemo {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        writerObject();
    }
    // 序列化
    private static void writerObject() throws IOException {
        // 创建序列化对象
        ObjectOutputStream oos = new ObjectOutputStream(new 
        FileOutputStream("d:\\demo\\oos.txt")); 
        // 创建集合,将需要序列化的数据保存到集合中
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list,"ww","www","222");
        // 写出对象
        oos.writeObject( list );
        // 关流
        oos.close();
    }
}

3)序列化接口
java.io.Serializable

: 序列化接口,标记型接口。只有实现了此接口的类对象才能被序列化。
当类实现了 Serializable 接口之后 ,会根据类中的代码计算出一个串行版本号变量 static final serialVersionUID。
对象被序列化时会绑定UID变量,要求反序列化时对象绑定的UID变量要一致。 如果不一致抛出异常。
在类中自定义一个UID变量的值 = ;
如果某个成员变量不希望被序列化则使用 transient 瞬态关键字修饰即可。

public class Student implements Serializable {
    // 版本号固定
    static final long serialVersionUID = 2379243874927349L;
    // transient 瞬态关键字
    private transient String name;
    private int age;
    private char sex;

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

    public Student() {
    }

    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;
    }

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

6.随机流

1)随机流
java.io.RandomAccessFile

: 随机流,它是将操作的文件当做一个大型的byte数组。
构造方法:
RandomAccessFile?(String name, String mode) 创建随机访问文件流,以从中指定名称的文件读取,并可选择写入文件。
String name:读写的文件路径 , String mode: "r"只读 "rw"读写
void seek?(long pos) 设置文件指针偏移,从该文件的开头测量,发生下一次读取或写入。

public class RandomAccessFileDemo {
    public static void main(String[] args) throws IOException {
        // 创建对象
        RandomAccessFile raf = new RandomAccessFile("d:\\demo\\a.txt","rw");
        // 设置读取的起始下标
        /*raf.seek(1);
        int read = raf.read();
        System.out.println("read = " + read);
        */
        raf.write(97);
        // 关流
        raf.close();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值