Java IO流笔记

File

1.定义

文件和文件夹的抽象表示形式

java把文件和文件夹封装为File类我们可以使用File类对文件或文件夹进行操作

2.路径

绝对路径:是一个完整的路径,从盘符开始

相对路径:是一个简化的路径,相对指的是相对于当前项目的根目录,对路径进行简化,在路径中就不用再写项目的根目录了

注意:1,路径是不区分大小写的 2,路径中的文件分隔符斜杠(/)和反斜杠(\)都可以,但是如果用的是反斜杠,反斜杠又是转义字符,所以两条反斜杠才代表普通的反斜杠,如果是网络路径就一定是斜杠

3.构造方法

1.File(String pathname):通过给定路径字符串创建一个File类对象

2.File(String parent,String child):把路径分为了两个部分,一部分是父路径,一部分是子路径

3.File(File parent,String child):父路径是File类

注意:这里的路径可以以文件结尾也可以以文件夹结尾,可以是相对路径,也可以是绝对路径。如果传入的路径是不存在的,也是能够创建File对象成功

举例:

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

File f3=new File("D:\\ccc");
File f4=new File(f3,"a.txt");

4.File类具有获取功能的方法

1.getAbsolutePath()

public String getAbsolutePath():这个方法,会返回构造函数中传入的路径,无论你传的是相对路径还是绝对路径返回的都是绝对路径

2.getPath()

public String getPath():获取构造方法中传递的路径

3.getName()

public String getName():获取构造方法传递的路径的结尾部分(文件名/文件夹)

4.length()

public long length():返回构造方法指定的文件的大小,这个方法只能计算文件的大小,如果给的路径是假的则返回0

5.File类具有判断功能的方法

1.exists()

public boolean exists():判断构造方法中的路径是否存在

2.isDirectory()

public boolean isDirectory():判断此File表示的是否为文件夹

3.isFile()

public boolean isFile():判断此File表示的是否为文件

注意:2,3两个方法,如果路径是假的,那么都是false

6.File具有创建删除功能的方法

1.createNewFile()

public boolean createNewFile():当且仅当具有该名称的文件尚不存在的时候,创建一个空的文件,创建文件的路径和名称在构造方法中给出

当文件不存在时,会创建文件,返回true,当文件存在时,不会创建,返回false

此方法只能创建文件,不能创建文件夹。创建文件的路径必须存在,否则会抛异常

2.mkdir()

public boolean mkdir():创建单级空文件夹

3.mkdirs()

public boolean mkdirs():既可以创建单级文件夹,也可以创建多级文件夹

文件夹不存在就会创建文件夹,文件夹存在,则不会创建,返回false。如果路径不存在,则返回false。这个方法只能创建文件夹


            File file=new File("D:/demo2/abc");
            //创建file指定的文件,存在指定的file文件或文件夹就不创建了 
           file.createNewFile() ;      //D:\demo2
            System.out.println(file.getParentFile());  //返回上级路径
          file.mkdir(); //创建单层文件夹,指定文件名存在就不创建
           file.mkdirs();//创建多层文件夹,指定文件名存在就不创建
           file.delete();//删除file指定的文件或文件夹,且不能包含文件或者文件夹
           file.renameTo(new File("D:/demo3"));//重命名,如果指定文件不存在就创建

1、FileInputStream、FileOutputStream(字节流)

字节流的方式效率较低,不建议使用
构造方法做的事,不仅仅是创建了一个FileOutputStream对象,还会根据传入的路径,判断是否存在这个文件,如果存在的话就会把文件中的数据清空,如果不存在的话,就会创建一个空的文件,并把对象指向这个文件,FileInputStream必须存在指定文件

换行的话就写上write("\r\n".geyBytes())

read()和read(byte b)
read():返回读取到的字符(int),读到文末符就返回-1
read(byte b) :向b数组中读取b.length个长度的字节,并返回字节的个数,读到文末符就返回-1

 FileInputStream file=new FileInputStream("file.txt");
      int len=file.read();
      System.out.println(len);//1
     byte[]bs=new byte[1024];
      file.read(bs);//读取1024个字节
      System.out.println(new String(bs));

File打开文件默认会将文件清空,在后面加一个true表示文件追加功能

FileOutputStream file1=new FileOutputStream("file.txt",true);
            file1.write("我好帅".getBytes()); //表示将“我好帅”转换成byte数组写入到file1文件中
            file1.write(97);  //写入单个字符
            byte []b=new byte[]{97,98,99};
            file1.write(b,0,3);  //写入一个数组从下标0开始,写三个字节

2、BufferedInputStream、BufferedOutputStream(缓冲字节流)

缓冲字节流是为高效率而设计的,真正的读写操作还是靠FileOutputStream和FileInputStream,所以其构造方法入参是这两个类的对象。

public static void main(String args[]) throws IOException, ClassNotFoundException {
       BufferedInputStream in =new BufferedInputStream(new FileInputStream("file.txt")); 
       BufferedOutputStream out=new BufferedOutputStream(new FileOutputStream("file.txt"));
        String s="aaaaa松下问童子,言师采药去。只在此山中,云深不知处。";
        out.write(s.getBytes());//因为Write方法的数组只能是字节数组,所以将字符转化成字节数组写入
        byte[] b=new byte[1024];
        int len;
        while((len=in.read(b))!=-1)  //当没有读到文末符就不是-1
        {
            System.out.println(new String(b,0,len));  //输出读到数组的指定长度
        }
        out.close();
        in.close();
      }

    }

3.BufferedReader、BufferedWriter(字符缓冲流)

BufferReader在打开文件的时候要嵌套new一个FileReader:

  • BufferedReader类readLine() :读取一个文本行。
  • BufferedWriter类newLine() :将会自动根据操作系统的不同,选择\r\n或者是\r或者是\n。

public String readLine():直到程序遇到了换行符或者是对应流的结束符,该方法才会认为读到了一行,才会结束。
返回:到达流末尾,就返回null

public static void main(String args[]) throws IOException {
       BufferedReader br=new BufferedReader(new FileReader("file.txt"));
       String s=null;
       while((s=br.readLine())!=null)  //字符缓冲流可以读取一行
       {
           System.out.println(s);
       }
    }

4. 对象流 ObjectInputStream和ObjectOutputStream

 public static void main(String args[]) throws IOException, ClassNotFoundException {
ObjectOutputStream op=new ObjectOutputStream(new FileOutputStream("file.txt"));
         Person p=new Person("蔡徐坤",1);
         op.writeObject(p);  //向文件中写入一个对象
         op.flush();
         op.close();
         ObjectInputStream in=new ObjectInputStream(new FileInputStream("file.txt"));
         Object oj=in.readObject();  //从文件中读取一个对象,默认为Object
         Person date=(Person)oj;
         System.out.println(date.getAge());
         in.close();
    }

将对象转化成对象是序列化
将字节转化成对象是反序列化

InputStreamReader、OutputStreamWriter(字符流)

以字符为基本读取单位(双字节读取)

字符流适用于文本文件的读写,OutputStreamWriter类其实也是借助FileOutputStream类实现的,故其构造方法是FileOutputStream的对象

字符流便捷类

Java提供了FileWriter和FileReader简化字符流的读写,new FileWriter等同于new
OutputStreamWriter(new FileOutputStream(file, true))

IO流方法

字节流方法因为是字节流,所以读和写的数组只能是byte型数组。
字节输入流InputStream主要方法:

read() :从此输入流中读取一个数据字节。
read(byte[] b) :从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。
read(byte[] b, int off, int len) :从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。
close():关闭此输入流并释放与该流关联的所有系统资源。
字节输出流OutputStream主要方法:

write(byte[] b) :将 b.length 个字节从指定 byte 数组写入此文件输出流中。
write(byte[] b, int off, int len) :将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。
write(int b) :将指定字节写入此文件输出流。
close() :关闭此输入流并释放与该流关联的所有系统资源。

字符流方法因为是字符流,所以读和写的数组类型是字符型和字符串
字符输入流Reader主要方法:

read():读取单个字符。
read(char[] cbuf) :将字符读入数组。
read(char[] cbuf, int off, int len) : 将字符读入数组的某一部分。
read(CharBuffer target) :试图将字符读入指定的字符缓冲区。
flush() :刷新该流的缓冲。
close() :关闭此流,但要先刷新它。
字符输出流Writer主要方法:

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

  1. 字节流可以处理一切文件,而字符流只能处理纯文本文件。
  2. InputStream提供的是字节流的读取,而非文本读取,这是和Reader类的根本区别。用Reader读取出来的是char数组或者String,使用InputStream读取出来的是byte数组。

File

 public static void main(String args[]) throws IOException, ClassNotFoundException {
        { 
            File file = new File("D:/demo3");
            String[] list = file.list();   //list()方法存的是file指定的文件夹下的子文件
            for (String str : list) {
                System.out.println(str);
            }
        }
    }
 输出
a
a - 副本
a - 副本 - 副本
a - 副本 - 副本 - 副本
public static void main(String args[]) throws IOException, ClassNotFoundException {
        {
            File file = new File("D:/demo3");
            File[]list = file.listFiles();  //listFiles方法存的是文件夹的绝对路径
            for (File str : list) {
                System.out.println(str);
            }
        }
    }
输出:
D:\demo3\a
D:\demo3\a - 副本
D:\demo3\a - 副本 - 副本
D:\demo3\a - 副本 - 副本 - 副本   
    
    

Properties集合

Properties表示了一个持久的属性集,以键值对的形式存储数据,键和值都是字符串,他是唯一一个与IO流结合的集合

2.常用方法

1.public Object setProperty(String key,String value):保存一对属性

2.public String getProperty(String key):通过键来找值

3.public Set stringPropertyNames():所有键的名称的集合


        Properties p=new Properties();    //键值对都只能是字符串
        p.setProperty("蔡徐坤","只因你太美");   // 创建一组映射关系
        p.setProperty("太卷了吧","躺平青年");
        Set <String> set=p.stringPropertyNames(); //将所有的键值对都以String存入数组中
        for(String s:set){
            System.out.println(p.getProperty(s));    //通过键来获取值
        }

3.与流相关的方法

1.将Properties集合中的键值对保存到文件中

public void store(OutputStream out,String comments)
public void store(Write write,String comments)

comments参数,相当于就是给一个注释,解释一下这个方法是用来干什么的,不能用中文,一般传入一个空字符串即可

用properties对象调用此方法,就会把集合中的键值对存入到文件中

2.将数据读取到Properties集合中

public void load(InputStream inStream)
public void load(Reader reader)

用properties对象调用此方法,就会把文件中的键值对保存到集合中,调用get方法取就行了

 public  static  void main(String []args) throws IOException {
        Properties p=new Properties();//键值对都只能是字符串
        p.setProperty("蔡徐坤","只因你太美");   // 创建一组映射关系
        p.setProperty("太卷了吧","躺平青年");
        Writer w=new FileWriter("name.txt");
        //将p集合中的元素存入到数组w中
        p.store(w,"Hello");
        //#Hello
        //#Mon May 31 22:56:29 CST 2021
        //蔡徐坤=只因你太美
        //太卷了吧=躺平青年

        Reader r=new FileReader("abc.txt");
        // 将文件r中的映射元素读入到p集合中
         p.load(r);
        //{太卷了=当个躺平青年吧, 蔡徐坤=只因你太美, 太卷了吧=躺平青年}
        System.out.println(p);
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值