Java-IO流(==>通俗易懂)

1:文件操作(File类)

1.1构造方法
  File file1=new File("D:\\BBB");

注意: 一个File对象代表硬盘中实际存在的一个文件或者目录;无论该路径下是否存在文件或者目录,都不影响File对象的创建。

1.2常用方法
 //常用方法
        File file=new File("D:\\AAA");
        File file1=new File("D:\\AAA");

        System.out.println("文件是否可读"+file.canRead());
        System.out.println("文件是否可写"+file.canWrite());
        System.out.println("文件的名字"+file.getName());
        System.out.println("文件的上级目录"+file.getParent());
        System.out.println("文件是否是一个目录"+file.isDirectory());
        System.out.println("文件是否是一个文件"+file.isFile());
        System.out.println("文件是否隐藏"+file.isHidden());
        System.out.println("文件的大小"+file.length());
        System.out.println(file==file1); //这里是比较对象的地址
        System.out.println(file.equals(file1)); //这里是比较两个对象对应文件的路径

运行结果:
在这里插入图片描述

1.3跟目录相关的方法
   //跟目录相关的方法
        File f1=new File("D:\\a");
        //创建目录
        f1.mkdir();
        //创建多级目录
        File f2=new File("D:\\a\\b\\c");
        f2.mkdirs();
        //删除目录
//        f2.delete();
        //查看目录
        String[] list=f1.list();  //查看list目录下的一级目录
        for (String s:list){
            System.out.println(s);
        }
        File[] files=f2.listFiles(); //查看f2下的文件
        for (File f:files){
            System.out.println(f);
        }
1.4文件搜索(应用)
 @Test
    public static void printFile(File file){
        File[] files = file.listFiles(); //获取指定目录下的文件或目录
        for (File file1:files){
            if(file1.isFile()){ //判断是否为文件
                if(file1.getName().endsWith(".txt")){
                    System.out.println("文件名"+file1.getAbsolutePath());
                }
            }else {
                printFile(file1); //是目录则递归搜索
            }
        }
    }

运行结果:
在这里插入图片描述

2:IO流

2.1IO流的概念

简单来说:IO流就是简单的输入和输出,比如把硬盘中的数据,读取到内存中使用,或者是从网络连接中读取数据到内存中使用,这就称为"输入流",输出流就是把程序中的数据输出到硬盘或者网络节点。

2.2IO流的分类
2.2.1按照流的流向分,可以分为输入流和输出流。

输入流:只能从中读取数据,而不能向其写入数据。
输出流:只能向其写入数据,而不能向其读取数据。
以程序运行所在的内存来考虑示例图如下:
在这里插入图片描述

java的输入流主要是InputStream和Reader作为基类,而输出流则是主要由outputStream和Writer作为基类。它们都是一些抽象基类,无法直接创建实例。

2.2.2按照操作单元划分,可以划分为字节流和字符流。

字节流和字符流的用法几乎完成全一样,区别在于字节流和字符流所操作的数据单元不同,字节流操作的单元是数据单元是8位的字节,字符流操作的是数据单元为16位的字符。

字节流主要是由InputStream和outPutStream作为基类,而字符流则主要有Reader和Writer作为基类。

2.3字节流
2.3.1字节流的概述

一切文件数据(文本、图片、视频等)在存储时,都是以二进制数字的形式保存,都一个一个的字节,在传输时也是使用字节进行传输,我们称之为字节流;字节流可以传输任意文件数据,无论使用什么样的流对象,底层传输的始终为二进制数据。

2.3.2使用字节流进行文件的拷贝
package javaDailyProctice.IOproctice;

import org.junit.Test;

import java.io.*;

public class Test0528 {
    @Test
    public void TestDataStream() throws IOException {
        File file=new File("D:\\AAA\\a.txt");
        InputStream is=new FileInputStream(file);
        //拷贝到D:\AAA\dd\ll.txt的文本中
        OutputStream os=new FileOutputStream("D:\\AAA\\dd\\ll.txt");
        while (true){
            int ch= is.read();
            if(ch==-1){
                break;
            }
            os.write(ch);
        }
        os.flush();
        os.close();
        is.close();
        System.out.printf("拷贝完成!");
    }
}

图解
在这里插入图片描述
注意事项:
每次程序运行,创建输出流对象,都会清空目标文件中的数据;要想继续追加数据,只需要在输出流的参数中设置一个True即可。FileOutputStream(“D:\AAA\dd\ll.txt”,true);

2.4字符流
2.4.1字符流的概念

就是遇到中文字符时,可能不会显示完整的字符,那是因为 一个中文字符可能占用多个字节存储。所以Java提供一些字符流类,以字符为单位读写数据,专门用于处理文本文 件。

2.4.2使用字符流进行文件拷贝

import org.junit.Test;

import java.io.*;

public class Test0528 {
@Test
  public void TestStringStream() throws IOException {
      File file=new File("D:\\AAA\\a1.txt");
      Reader  reader=new FileReader(file);
      Writer writer=new FileWriter("D:\\AAA\\dd\\QQ.txt");
      while (true){
          int read = reader.read();
          if (read==-1){
              break;
          }
          writer.write(read);
      }
      System.out.println("拷贝成功!");
      writer.flush();
      writer.close();
      reader.close();
  }
}

2.5缓冲流
2.5.1缓冲流概念

缓冲流,也叫高效流,是对4个基本的 File* 流的增强;所以也是4个流,按照数据类型分类:
字节缓冲流: BufferedInputStream , BufferedOutputStream
字符缓冲流: BufferedReader , BufferedWriter。

2.5.2原理

缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO 次数,从而提高读写的效率。

2.5.3使用缓冲流来拷贝文件

import org.junit.Test;

import java.io.*;

public class Test0528 {
@Test
    public void TestHuanChongStream() throws IOException {
        InputStream is=new FileInputStream("D:\\AAA\\a1.txt");
        BufferedInputStream bufin=new BufferedInputStream(is);
        OutputStream os=new FileOutputStream("D:\\AAA\\dd\\QQ.txt");
        BufferedOutputStream bufOut=new BufferedOutputStream(os);
        while (true){
            int read = bufin.read();
            if (read==-1){
                break;
            }
            bufOut.write(read);
        }
        System.out.println("拷贝成功!");
        bufOut.flush();
        bufOut.close();
        bufin.close();
        os.close();
        is.close();
    }
}
import org.junit.Test;

import java.io.*;

public class Test0528 {
@Test
    public void TestHuanChongStream() throws IOException {
   Reader reader=new FileReader("D:\\AAA\\a1.txt");
      BufferedReader bufRead=new BufferedReader(reader);
      Writer writer=new FileWriter("D:\\AAA\\dd\\QQ.txt");
      BufferedWriter BufWrite=new BufferedWriter(writer);
      while (true){
          int read = bufRead.read();
          if(read==-1){
              break;
          }
          BufWrite.write(read);
      }
        System.out.println("拷贝成功!");
      BufWrite.flush();
      BufWrite.close();
      bufRead.close();
      writer.close();
      reader.close();
    }
}
2.6序列化
2.6.1什么是序列化

用一个字节序列可以表示一个对象,该字节序列包含该 对象的数据 、对象的 类型 和 对象中存储的属性 等信息
字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息。 字节序列还可以从文件中读取回来,重构对象,对它进行反序列化。
注意事项:
序列化的满足条件:该类必须实现 java.io.Serializable 接口;该类的所有属性必须是可序列化的。如果有一个属性不需要可序列化的,则该属性必须注明是瞬态的,使用 transient 关键字修饰.

代码示例:


import org.junit.Test;

import java.io.*;

class Person implements Serializable{
    String name;
    int age;

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


public class Test0528_2 {
    //序列化
    @Test
    public void TestObjiecSteam() throws IOException {
        Person p1=new Person("哈哈",15);
        OutputStream os=new FileOutputStream("D:\\AAA\\Person.txt");
        ObjectOutputStream objOUt=new ObjectOutputStream(os);
        objOUt.writeObject(p1);
        objOUt.flush();
        objOUt.close();
        os.close();

    }
    //反序列化
    @Test
    public  void TestUnobjectStream() throws IOException, ClassNotFoundException {
        InputStream is= new FileInputStream("D:\\AAA\\Person.txt");
        ObjectInputStream objIn=new ObjectInputStream(is);
        Person person =(Person) objIn.readObject();
        System.out.println(person.age);
        System.out.println(person.name);
    }

}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值