java总结--IO流

java总结

File类、字节流字符流、缓冲流转换流序列化流打印流

1.File类

1.1构造方法:

  • public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
    public File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。
    public File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。

1.2获取功能的方法:

  • public String getAbsolutePath() :返回此File的绝对路径名字符串。
    public String getPath() :将此File转换为路径名字符串。
    public String getName() :返回由此File表示的文件或目录的名称。
    public long length() :返回由此File表示的文件的长度。

1.3判断功能的方法:

  • public boolean exists() :此File表示的文件或目录是否实际存在。
    public boolean isDirectory() :此File表示的是否为目录。
    public boolean isFile() :此File表示的是否为文件。

1.4创建删除功能的方法

  • public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
    public boolean delete() :删除由此File表示的文件或目录。
    public boolean mkdir() :创建由此File表示的目录。
    public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。

1.5目录遍历

  • public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录。
    public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。
package Demoreview;

import java.io.File;

public class 遍历文件夹 {
    public static void main(String[] args) {
        File dir = new File("D:\\ideaproject\\basic-code\\test05-code\\src\\cn\\itcast\\test05");
        /*System.out.println(file);*/

        method(dir);
    }

    public static void method(File dir){
        //获取子文件和目录
        File[] files = dir.listFiles();

        for (File file:files) {
            if (file.isFile()){
                System.out.println("文件名:"+ file.getAbsolutePath());
            }else{
                System.out.println("目录:" + file.getAbsolutePath());
            }
            method(file);
        }
    }
}

2.字节流和字符流

  • 字节流:InputStream、OutputStream
  • 字符流:Reader、Writer

对于文件的字符流和字节流操作一般步骤:

  • 根据字节流或字符流的子类实例化父类对象

  • 进行数据的读取或写入操作

  • 关闭流

    字节流是原生的操作,字符流是经过处理后的操作,在对于文件操作时,由于OutputStream和InputStream是一个抽象类,为父类实例化时,必须使用子类FileOutputStream和FileInputStream,同理字符流也一样。

2.1 OutputStream

  • 基本功能方法:

    public void close() :关闭此输出流并释放与此流相关联的任何系统资源。

    public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。
    public void write(byte[] b) :将 b.length字节从指定的字节数组写入此输出流。
    public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输
    出到此输出流。
    public abstract void write(int b) :将指定的字节输出流

  • FileOutputStream类

    • 构造方法

      public FileOutputStream(File file) :创建文件输出流以写入由指定的 File对象表示的文件。
      public FileOutputStream(String name) : 创建文件输出流以指定的名称写入文件。

    • 写出字节数据

      1.写出字节: write(int b) 方法,每次可以写出一个字节数据

      2.写出字节数组: write(byte[] b) ,每次可以写出数组中的数据

      3.写出指定长度字节数组: write(byte[] b, int off, int len) ,每次写出从off索引开始,len个字节

      4.数据追加续写:

      public FileOutputStream(File file, boolean append) : 创建文件输出流以写入由指定的 File对象表示的文件。
      public FileOutputStream(String name, boolean append) : 创建文件输出流以指定的名称写入文件。

      参数中都需要传入一个boolean类型的值, true 表示追加数据, false 表示清空原有数据

      5.写出换行:

      Windows系统里,每行结尾是 回车+换行 ,即\r\n ;
      Unix系统里,每行结尾只有 换行 ,即\n ;
      Mac系统里,每行结尾是 回车 ,即\r 。从 Mac OS X开始与Linux统一

    package Demoreview;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class DemoFileOutputStream {
        public static void main(String[] args) throws IOException {
            //使用文件名称创建流对象
            FileOutputStream fos = new FileOutputStream("a.txt");
            //定义字符串
            String str = "abcde";
            //字符串转为字节数组
            byte[] bytes = str.getBytes();
            fos.write(bytes,2,2);
            //也可以遍历数组
            for (int i = 0; i < bytes.length; i++) {
                byte aByte = bytes[i];
                fos.write(aByte);
                //写一个换行,换行符转换成数组写出
                fos.write("\r\n".getBytes());
            }
            //关闭资源
            fos.close();
        }
    }
    

2.2 InputStream

  • 基本功能:

    public void close() :关闭此输入流并释放与此流相关联的任何系统资源。
    public abstract int read() : 从输入流读取数据的下一个字节。
    public int read(byte[] b) : 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。

  • FileInputStream

    • 构造方法:

      FileInputStream(File file) : 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。
      FileInputStream(String name) : 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。

    • 读取字节数据

      1. 读取字节: read 方法,每次可以读取一个字节的数据,提升为int类型,读取到文件末尾,返回-1
      2. 使用字节数组读取: read(byte[] b) ,每次读取b的长度个字节到数组中,返回读取到的有效字节个数,读
        取到末尾时,返回-1
package Demoreview;

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

public class DemoFileInputStream {
    public static void main(String[] args) throws IOException {
        //使用文件名称创建流对象
        FileInputStream fis = new FileInputStream("a.txt");
        //定义一个变量,作为有效的个数
        int len;
        //定义字节数组,作为装字节数据的容器
        byte[] bytes = new byte[2];
        //循环读取
        while((len = fis.read(bytes)) != -1){
            System.out.println(new String(bytes,0,len));
        }
        fis.close();
    }
}

2.3 Reader

  • 为了读取中文字符,采用字符输入流,其基本功能方法有:

    • public void close() :关闭此流并释放与此流相关联的任何系统资源。
      public int read() : 从输入流读取一个字符。
      public int read(char[] cbuf) : 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中 。
  • FileReader

    • 构造方法

      FileReader(File file) : 创建一个新的 FileReader ,给定要读取的File对象。
      FileReader(String fileName) : 创建一个新的 FileReader ,给定要读取的文件的名称

    • 读取字符数据:

      1. 读取字符: read 方法,每次可以读取一个字符的数据,提升为int类型,读取到文件末尾,返回-1
      2. 使用字符数组读取: read(char[] cbuf) ,每次读取b的长度个字符到数组中,返回读取到的有效字符个数,
        读取到末尾时,返回-1
package Demoreview;


import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class DemoFileReader {
    public static void main(String[] args) throws IOException {
        //使用文件名称创建流对象
        FileReader fr = new FileReader(new File("D:\\ideaproject\\basic-code\\test-program\\reader.txt"));
        //定义一个变量
        int len;
        //定义字符数组,作为装字符数据的容器
        char[] chars = new char[2];
        //循环读取
        while((len = fr.read(chars))!=-1){
            System.out.println(new String(chars,0,len));
        }
        fr.close();
    }
}

2.4 Writer

  • 基本功能方法:

    void write(int c) 写入单个字符。
    void write(char[] cbuf) 写入字符数组。
    abstract void write(char[] cbuf, int off, int len) 写入字符数组的某一部分,off数组的开始索引,len
    写的字符个数。
    void write(String str) 写入字符串。
    void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个
    数。
    void flush() 刷新该流的缓冲。
    void close() 关闭此流,但要先刷新它。

  • FileWriter

    • 构造方法

      FileWriter(File file) : 创建一个新的 FileWriter,给定要读取的File对象。
      FileWriter(String fileName) : 创建一个新的 FileWriter,给定要读取的文件的名称。

    • 写出数据

      1.写出字符: write(int b) 方法,每次可以写出一个字符数据

      2.关闭和刷新:若不关闭输出流就无法写出字符到文件中,但若关闭流对象将无法继续写出数据。若既想写出数据又想继续使用数据,就需要flush方法

      • flush :刷新缓冲区,流对象可以继续使用。
        close :先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。
    • 写出其他数据

      1.写出字符数组:write(char[] cbuf) 和 write(char[] cbuf, int off, int len) ,每次可以写出字符数组中的数据

      2.写出字符串: write(String str) 和 write(String str, int off, int len) ,每次可以写出字符串中的数据,更为方便

      3.续写和换行:操作类似于FileOutputStream

package Demoreview;


import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class DemoFileWriter {
    public static void main(String[] args) throws IOException {
        //使用file对象创建流对象
        FileWriter fw = new FileWriter(new File("D:\\ideaproject\\basic-code\\test-program\\writer.txt"));
        //将字符串转换成字符数组
        char[] chars = "欢迎光临".toCharArray();
        //写出字符数组
        fw.write(chars);
        //写出从索引2开始,2个字节
        fw.write(chars,2,2);
        fw.flush();
    }
}

3.缓冲流

通过缓冲区读写,提高读写效率

​ 字节缓冲流:BufferedInputStream , BufferedOutputStream

​ 字符缓冲流:BufferedReader , BufferedWriter

  • 字节缓冲流

    • 构造方法:

      public BufferedInputStream(InputStream in) :创建一个 新的缓冲输入流。
      public BufferedOutputStream(OutputStream out) : 创建一个新的缓冲输出流。

    package Demoreview;
    
    import java.io.*;
    
    public class DemoBuffere {
        public static void main(String[] args) {
            long start = System.currentTimeMillis();
            //创建流对象
            try ( BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\ideaproject\\basic-code\\test-program\\src\\Demoreview\\01.jpg"));
                  BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\ideaproject\\basic-code\\test-program\\src\\Demoreview\\out.jpg"));
                  ){
                //读写数据
                int len;
                byte[] bytes = new byte[1024];
                while ((len=bis.read(bytes))!=-1){
                    bos.write(bytes,0,len);
                }
    
            }catch(IOException e){
                e.printStackTrace();
            }
            //记录时间
            long end = System.currentTimeMillis();
            System.out.println(end-start);
    
        }
    }
    
  • 字符缓冲流

    • 构造方法:

      public BufferedReader(Reader in) :创建一个 新的缓冲输入流。
      public BufferedWriter(Writer out) : 创建一个新的缓冲输出流。

    • 特有方法:

      BufferedReader: public String readLine() : 读一行文字。
      BufferedWriter: public void newLine() : 写一行行分隔符,由系统属性定义符号。

/*3.侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下。愚以为宫中之事,事无大小,悉
以咨之,然后施行,必得裨补阙漏,有所广益。
5.愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。若无兴德之言,则责攸之、祎、允等之慢,以彰其
咎;陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏,臣不胜受恩感激。
4.将军向宠,性行淑均,晓畅军事,试用之于昔日,先帝称之曰能,是以众议举宠为督。愚以为营中之事,悉以咨之,
必能使行阵和睦,优劣得所。
2.宫中府中,俱为一体,陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不
宜偏私,使内外异法也。
1.先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外
者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以
塞忠谏之路也。*/

package Demoreview;

import java.io.*;
import java.util.HashMap;

public class DemoBuffere02 {
    public static void main(String[] args) throws IOException {
        //创建map集合,保存文本数据,键为序号,值为文字
        HashMap<String, String> map = new HashMap<>();
        //创建流对象
        BufferedReader br = new BufferedReader(new FileReader("D:\\ideaproject\\basic-code\\test-program\\src\\Demoreview\\a.txt"));
        BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\ideaproject\\basic-code\\test-program\\src\\Demoreview\\out.txt"));
        //读取数据
        String line = null;
        while((line=br.readLine())!=null){
            //解析文本
            String[] split = line.split("\\.");
            //保存到集合
            map.put(split[0],split[1]);
        }
        //释放资源
        br.close();

        //遍历集合
        for (int i = 1; i <= map.size(); i++) {
            String key = String.valueOf(i);
            //获取map中文本
            String value = map.get(key);
            //写出拼接文本
            bw.write(key+"."+value);
            //写出换行
            bw.newLine();
        }
        //释放资源
        bw.close();
    }
}

4 转换流

常见字符集有ASCII字符集、GBK字符集、Unicode字符集(UTF-8 UTF-16 UTF32编码)等

  • InputStreamReader类

    • 构造方法:

      InputStreamReader(InputStream in) : 创建一个使用默认字符集的字符流。
      InputStreamReader(InputStream in, String charsetName) : 创建一个指定字符集的字符流。

  • OutputStreamWriter类

    • 构造方法:

      OutputStreamWriter(OutputStream in) : 创建一个使用默认字符集的字符流。
      OutputStreamWriter(OutputStream in, String charsetName) : 创建一个指定字符集的字符流。

//将GBK编码的文本文件,转换为UTF-8编码的文本文件

package Demoreview;

import java.io.*;

public class DemoBuffere02 {
    public static void main(String[] args) throws IOException {
        //创建流对象
        //转换输入流,读取指定GBK文件
        InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\ideaproject\\basic-code\\test-program\\src\\Demoreview\\a.txt"), "GBK");
        //转换输出流,默认utf-8
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\ideaproject\\basic-code\\test-program\\src\\Demoreview\\b.txt"));

        //读写数据
        //定义数组
        char[] chars = new char[1024];
        //定义长度
        int len;
        //循环读取
        while((len=isr.read(chars))!=-1){
            osw.write(chars,0,len);
        }
        //释放资源
        osw.close();
        isr.close();
    }
}

5.序列化

用一个字节序列表示一个对象,该字节序列包含该对象的数据、对象的类型和对象中存储的属性

对象——>字节:ObjectOutputStream序列化

字节——>对象:ObjectInputStream反序列化

  • 构造方法:

    public ObjectOutputStream(OutputStream out) : 创建一个指定OutputStream的ObjectOutputStream。

    public ObjectInputStream(InputStream in) : 创建一个指定InputStream的ObjectInputStream。

  • 序列化操作:

    1. 一个对象要想序列化,必须满足两个条件:
      该类必须实现java.io.Serializable 接口, Serializable 是一个标记接口,不实现此接口的类将不会使任何状态序列化或反序列化,会抛出NotSerializableException 。
      该类的所有属性必须是可序列化的。如果有一个属性不需要可序列化的,则该属性必须注明是瞬态的,使用transient 关键字修饰

​ 2.写出对象方法:public final void writeObject (Object obj) : 将指定的对象写出。

  • 反序列化操作:

    1.如果能找到一个对象的class文件,我们可以进行反序列化操作,调用ObjectInputStream 读取对象的方法:public final Object readObject () : 读取一个对象。

    2.当JVM反序列化对象时,能找到class文件,但是class文件在序列化对象之后发生了修改,那么反序列化操作也会失败,抛出一个InvalidClassException 异常。发生这个异常的原因如下:该类的序列版本号与从流中读取的类描述符的版本号不匹配;该类包含未知数据类型;该类没有可访问的无参数构造方法。
    Serializable 接口给需要序列化的类,提供了一个序列版本号。serialVersionUID 该版本号的目的在于验证序列化的对象和对应类是否版本匹配。

    private static final long serialVersionUID = 1L;
    
//1. 将存有多个自定义对象的集合序列化操作,保存到list.txt 文件中。
//2. 反序列化list.txt ,并遍历集合,打印对象信息。
/*1. 把若干学生对象 ,保存到集合中。
2. 把集合序列化。
3. 反序列化读取时,只需要读取一次,转换为集合类型。
4. 遍历集合,可以打印所有的学生信息*/

public class SerTest {
    public static void main(String[] args) throws Exception {
// 创建 学生对象
        Student student = new Student("老王", "laow");
        Student student2 = new Student("老张", "laoz");
        Student student3 = new Student("老李", "laol");
        ArrayList<Student> arrayList = new ArrayList<>();
        arrayList.add(student);
        arrayList.add(student2);
        arrayList.add(student3);
// 序列化操作 
     // serializ(arrayList);
// 反序列化
    ObjectInputStream ois = new ObjectInputStream(new FileInputStream("list.txt"));
// 读取对象,强转为ArrayList类型
    ArrayList<Student> list = (ArrayList<Student>)ois.readObject();
    for (int i = 0; i < list.size(); i++ ){
        Student s = list.get(i);
        System.out.println(s.getName()+"‐‐"+ s.getPwd());
       }
    }
   private static void serializ(ArrayList<Student> arrayList) throws Exception {
// 创建 序列化流
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("list.txt"));
// 写出对象
        oos.writeObject(arrayList);
// 释放资源
        oos.close();
}
}

6 打印流

在控制台打印输出,是调用print 方法和println 方法完成的,这两个方法都来自于java.io.PrintStream 类,该类能够方便地打印各种数据类型的值,是一种便捷的输出方式。

  • PrintStream类

    • 构造方法

      public PrintStream(String fileName) : 使用指定的文件名创建一个新的打印流

public class PrintDemo {
public static void main(String[] args) throws IOException {
// 调用系统的打印流,控制台直接输出97
System.out.println(97);
// 创建打印流,指定文件的名称
PrintStream ps = new PrintStream("ps.txt");
// 设置系统的打印流流向,输出到ps.txt
System.setOut(ps);
// 调用系统的打印流,ps.txt中输出97
System.out.println(97);
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>