IO流

IO流用来处理设备之间的数据传输,文件复制,上传文件和下载文件

绝对路径:固定不可改变的路径,以盘符开头

相对路径:相对某个参照物,不能以盘符开头

      在eclipse中相对路径相对当前项目的根目录

IO流流向分类

  输出流,数据从java程序中出去

    FileWriter——如果要在文件中追加数据,在创建对象的时候,加一个true

    创建输出流对象时会调用系统资源创建一个文件,创建输出流对象,把输出流对象指向文件

    write()——写字符串,字符串不会直接写入文件中,会自动进入缓冲区 

      如果不写绝对路径,就会默认为相对路径,相对路径会在项目的根目录下

      \n,可以实现换行,但是windows系统识别的换行符是\r\n,linux:\n,mac:\r

    flush()——刷新缓冲区

    close()——释放资源,通知系统释放和该文件相关的资源,同时检查缓冲区是否有数据,也会做flush动作

    

  输入流,将数据写入Java程序

    FileReader

    read()——读取一个字符,返回字符的ASKII码,如果没有字符,会返回-1

    while((ch = fr.read()) != -1){}——通常用这种方式读取

 

文件复制粘贴基本原理:

// 逐个字符读取
FileReader fr = null;
FileWriter fw =null;
try {
    fr = new FileReader("源文件绝对路径");
    fw = new FileWriter("目标文件绝对路径");
    // 如果没有该文件会自动创建
    // fw = new FileWriter("目标文件绝对路径",true),这样表示在目标文件上面追加
    int ch;
    while ((ch = fr.read()) != -1) {
        fw.write(ch);
     }
}catch (IOException e){
    e.printStackTrace();
}finally {
    if(fr != null){
        try {
            fr.close();
    }catch (IOException e){
        e.printStackTrace();
    }
        }
    if(fw != null){
        try {
            fw.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}
// 逐行读取
FileReader fr = null;
FileWriter fw =null;
try {
    fr = new FileReader("源文件绝对路径");
    fw = new FileWriter("目标文件绝对路径");
    // 如果没有该文件会自动创建
    // fw = new FileWriter("目标文件绝对路径",true),这样表示在目标文件上面追加
    char[] chs = new char[1024];
    int leng;
    while ((leng = fr.read(chs)) != -1) {
        fw.write(chs,0,leng);
        fw.flush();
     }
}catch (IOException e){
    e.printStackTrace();
}finally {
    if(fr != null){
        try {
            fr.close();
    }catch (IOException e){
        e.printStackTrace();
    }
        }
    if(fw != null){
        try {
            fw.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}    

 

File类:文件和目录路径明的抽象表示形式,File类的实例时不可变的

  构造方法:

    File(File parent , String child)——将指定的路径转换为一个File对象

    new File("D:\\a\\b.txt");

    File(String pathname)——根据指定的父路径和文件路径创建File对象

    new File("D:\\a","b.txt");

    File(String parent , String child)——根据指定父路径对象和文件路径创建File对象

    new File(new FIle("D:\\a"),"b.txt");

   常用功能:

    创建功能:

      boolean createNewFIle()——创建文件

      boolean mkdir()——创建文件夹

      boolean mkdirs()——创建指定文件夹,当文件夹所在的目录不存在,则一起创建

    删除功能:

      boolean delete()——删除文件/文件夹,不能删除有子文件或者子文件夹

    获取功能:

      String getAbsolutePath()——获取绝对路径

      File getAbsoluteFile()——获取绝对路径的File对象

      String getName()——获取File对象的文件名,包括后缀名

      String getParent()——获取File对象的父目录

      File geParentFile()——获取源File对象父目录的File对象

      String getPath()——获取创建File对象时给的路径

      long lastModified()——获取最好一次修改的时间

      long length()——获取文件字节数(大小)

      常用的获取功能:

        String[] list()——获取当前文件夹下所有的文件和文件夹名称数组

        File[] listFiles()——获取当前文件夹下所有文件和文件夹的FIle数组,每个File对象都是以绝对路径创建

        static File[] listRoots()——获取所有盘符

    判断功能:

      boolean exists()——文件是否存在

      boolean isDirectory()——判断File对象指定的路径是否是文件夹

      boolean isAbsolute()——判断File对象指向的路径是否绝对路径

      boolean isFile()——判断File对象指定的路径是否是文件

      boolean isHidden()——判断File对象指定的路径是否是隐藏文件

    修改功能

      boolean renameTo(File dest)——当前File对象所指向的路径修改为指定File所指向的路径

 

 

IO流数据类型分类:

  字节流——用于读取字节

   字节输入流——InputStream

   字节输出流——OutputStream,不用刷新,

  字符流——用于读汉字

   字符输入流——Reader

   字符输出流——Writer

字节流的复制二进制文件

  int len;

  byte[] bys = new byte[1024];

  while((len = fis.read(bys)) != -1){

    fos.write(bys,0,len);

  }

标准输入流——字节输入流,用来读取键盘录入的数据

  public static final InputStream in

    InputStream is = System.in;

    Scanner sc = new Scanner(System.in);

标准输出流——字节输出流,将数据输出到命令行

  public static final PrintStream out;

    OutputStream os = System.out;

    System.out.printIn();

InputStreamReader——把输入的字节转换为字符 

Reader r  = new InputStreamReader(System.in);

OutputStreamWriter——把输出的字节变成字符

Writer w = new OutputStreamWriter(System.out);

 

打印流,只能输出

  PrintStream

  PrintWriter 

    ——实现所有print的所有的方法

    ——不能输出字节

    ——通过某些配置,可以实现自动刷新,println,printf或者format才能用

    ——也是包装流,不具备写出功能

  PrintWriter pw = new PrintWriter("路径.txt");

  pw.println("可以写入txt文件中,还可以自动换行");

  PrintWriter pw = new PrintWriter(new FileWriter("d.txt",true),true);

  pw.println("创建FileWriter对象时Boolean参数是是否追加,打印流对象Boolean类型是是否自动刷新")

打印流复制文本文件:

  BufferedReader br = new BufferedReader(new FileReader("路径文件"));

  PrintWriter pw = new PrintWriter(new FileWriter("路径文件"),true);

  String line;

  while((line = br.readLine()) != -1){

    pw.println(line);

  }

  pw.close();

  br.close();

 

对象操作流:

  ObjectOutputStream

    writeObject

    ObjcetOutputStream(OutputStream out)

  ObjectInputStream

    readObject

    ObjectInputStream(InputStream in)

  注意:使用对象输出流写出对象,只能使用对象输入流来读取对象

     需要实现Serializable接口——是一个标识的接口,只起标识作用,没有方法,当一个类的对象需要IO六进行读写的时候,这个类必须实现该接口,给类生成一个版本号

  //创建输出流的对象

  ObjectOutputStream oos= new ObjectOutputStream(new FileOutputStream("路径.txt"));

  Student s = new Student();

  oos.writeObject(s);

  oos.close

 

  //创建输入流的对象

  ObjectIntputStream ois = new ObjectIntputStream(new fileInputStream("a.txt"));

  try{

    while(true){

      Object obj = ois.readObject();

      sysout(obj);//可以将对象都放到集合中,写出集合,读的时候直接读集合,就能拿到集合中的所有对象,这样就可以避免多次读取,需要用trycatch来停止循环

 

    }

  }catch(EOFException e){

    sysout("读到文件的末尾");

  }

  

posted @ 2020-10-09 11:05  JoelYe  阅读(203)  评论(0编辑  收藏  举报