JAVA IO流(File类,字节流,字符流)

File类

分隔符:
a.路径名称分隔符:
windows:
linux: /
b.路径分隔符:一个路径和其他路径之间的分隔符
;
1.概述:文件和目录(文件夹)路径名的抽象表示

2.File的静态成员

static String pathSeparator:与系统有关的路径分隔符,为了方便,它被表示为一个字符串。
static String separator:与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。

		String path1 = "E:\\Idea\\io";
        System.out.println(path1);
        System.out.println("==================");

        //要求代码写完,一次编写,到处运行
        String path2 = "E:"+File.separator+"Idea"+File.separator+"io";
        System.out.println(path2);
 	String pathSeparator = File.pathSeparator;
        System.out.println("pathSeparator = " + pathSeparator); //  输出 ;
        //static String separator:与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。
        String separator = File.separator;
        System.out.println("separator = " + separator); //  输出 \

3.File的构造方法

File(String parent, String child) 根据所填写的路径创建File对象
parent:父路径
child:子路径
File(File parent, String child) 根据所填写的路径创建File对象
parent:父路径,是一个File对象
child:子路径
File(String pathname) 根据所填写的路径创建File对象
pathname:直接指定路径

 		File file1 = new File("E:\\Idea\\io", "1.jpg");
        System.out.println("file1 = " + file1);

4.File的获取方法

String getAbsolutePath() -> 获取File的绝对路径->带盘符的路径
String getPath() ->获取的是封装路径->new File对象的时候写的啥路径,获取的就是啥路径
String getName() -> 获取的是文件或者文件夹名称
long length() -> 获取的是文件的长度 -> 文件的字节数

5.File的创建方法

boolean createNewFile() -> 创建文件
如果要创建的文件之前有,创建失败,返回false
如果要创建的文件之前没有,创建成功,返回true

boolean mkdirs() -> 创建文件夹(目录)既可以创建多级文件夹,还可以创建单级文件夹
如果要创建的文件夹之前有,创建失败,返回false
如果要创建的文件夹之前没有,创建成功,返回true

6.File类的删除方法

boolean delete()->删除文件或者文件夹

注意:
1.如果删除文件,不走回收站
2.如果删除文件夹,必须是空文件夹,而且也不走回收站

7.File类的判断方法

boolean isDirectory() -> 判断是否为文件夹
boolean isFile() -> 判断是否为文件
boolean exists() -> 判断文件或者文件夹是否存在

8.File的遍历方法

String[] list() -> 遍历指定的文件夹,返回的是String数组
File[] listFiles()-> 遍历指定的文件夹,返回的是File数组 ->这个推荐使用

9.相对路径和绝对路径

细节:listFiles方法底层还是list方法
调用list方法,遍历文件夹,返回一个Stirng数组,遍历数组,将数组中的内容一个一个封装到File对象中,然后再将File对象放到File数组中

1.绝对路径:从盘符开始写的路径
E:\idea\io\1.txt
2.相对路径:不从盘符名开始写的路径

3.针对idea中写相对路径:
a.口诀:哪个路径是参照路径,哪个路径就可以省略不写,剩下的就是在idea中的相对路径写法
在idea中参照路径其实就是当前project的绝对路径

b.比如:在module21下创建了一个1.txt
先找1.txt的绝对路径:E:\Idea\idea2022\workspace\javase\module21\1.txt
再找参照路径:E:\Idea\idea2022\workspace\javase
参照路径可以省略:module21\1.txt

4.总结:
在idea中写的相对路径,其实就是从模块名开始写

5.注意:
如果直接写一个文件名1.txt,它所在的位置默认是在当前project下

字节流

1.IO流介绍以及输入输出以及流向的介绍

1.单词:
Output:输出
Input:输入

write:写数据
read:读数据

2.IO流:
将一个设备上的数据传输到另外一个设备上,称之为IO流技术

3.为啥要学IO流呢?
之前学了一个集合以及数组,可以保存数据,但是这两个都是临时存储(代码运行完毕,集合和数组会从内存中消失,从而数据就不存在了),所以集合和数组达不到永久保存的目的,我们希望咱们的数据永久保存起来,所以我们就可以将数据保存到硬盘上,此时我们就可以随时想拿到硬盘上的数据就随时拿

而且我们将来传输数据,必然要用到输入,输出动作

2.IO流分类

字节流:万能流,一切皆字节
字节输出流: OutputStream 抽象类
字节输入流: InputStream 抽象类

字符流:专门操作文本文档
字符输出流:Writer 抽象类
字符输入流:Reader 抽象类

4.OutputStream中子类[FileOutputStream]的介绍以及方法的简单介绍

1.概述:字节输出流,OutputStream 是一个抽象类
子类: FileOutputStream
2.作用:往硬盘上写数据

3.构造:
FileOutputStream(File file)
FileOutputStream(String name)

4.特点:
a.指定的文件如果没有,输出流会自动创建
b.每执行一次,默认都会创建一个新的文件,覆盖老文件

5.方法:
void write(int b) 一次写一个字节
void write(byte[] b) 一次写一个字节数组
void write(byte[] b, int off, int len) 一次写一个字节数组一部分
b:写的数组
off:从数组的哪个索引开始写
len:写多少个
void close() -> 关闭资源
1.字节流的续写追加:
FileOutputStream(String name, boolean append) append:true -> 会实现续写追加,文件不覆盖了

2.换行:
a.windows: \r\n -> 占2个字节 \n
b.linux: \n
c.mac os : \r

		FileOutputStream fos = new FileOutputStream("module21\\1.txt",true);
        fos.write("床前明月光\r\n".getBytes());
        fos.write("疑是地上霜\n".getBytes());
        fos.write("举头望明月\n".getBytes());
        fos.write("低头思故乡\n".getBytes());
        fos.close();

5.InputStream子类[FileInputStream]的介绍以及方法的使用

1.概述:字节输入流 InputStream ,是一个抽象类
子类:FileInputStream

2.作用:读数据,将数据从硬盘上读到内存中来

3.构造:
1 FileInputStream(File file)
2 FileInputStream(String path)

4.方法:
int read() 一次读一个字节,返回的是读取的字节
int read(byte[] b) 一次读取一个字节数组,返回的是读取的字节个数
int read(byte[] b, int off, int len) 一次读取一个字节数组一部分,返回的是读取的字节个数
void close() 关闭资源

6.一次读取一个字节

    private static void method01()throws Exception {
        FileInputStream fis = new FileInputStream("module21\\1.txt");

        //定义一个变量,接收读取到的字节
        int len;
        while((len = fis.read())!=-1){
            System.out.println((char)len);
        }
        fis.close();
    }

问题1:一个流对象,读完之后,就不要再读了;除非重新new一个新的对象
问题2:流关闭之后,流对象不能继续使用了

7.一次读取一个字节数组以及过程

 private static void method02()throws Exception {
        FileInputStream fis = new FileInputStream("module21\\1.txt");
        /*
           创建一个数组:byte[]
            1.创建的数组相当于一个临时存储区域,我们要读取的内容会临时保存到数组中
              然后我们再从数组中将数据获取

            2.数组长度定为多少,每次读取多少个,一般情况下数组长度定为1024或者1024的倍数
              如果剩下的字节不够数组长度了,那么就最后有多少读多少
         */
        byte[] bytes = new byte[2];
        int len;
        while((len = fis.read(bytes))!=-1){
            //System.out.println(new String(bytes,0,len));
            System.out.println(new String(bytes));
        }
        fis.close();
    }  

字符流

1.字节流读取中文的问题

1.注意:
字节流是万能流,更侧重于文件复制,但是尽量不要边读边看

2.原因:
UTF-8:一个汉字占3个字节
GBK:一个中文占2个字节

如果按照字节读取,每次读取的字节没有构成一个汉字的字节数,就直接输出,汉字是显示不了的

3.解决:
将文本文档中的内容,按照字符去操作

2.FileReader的介绍以及使用

**1.概述:**字符输入流 -> Reader -> 是一个抽象类
子类:FileReader
**2.作用:**将文本文档中的内容读取到内存中来
3.构造:
1 FileReader(File file)
2 FileReader(String path)
4.方法:
int read() -> 一次读取一个字符,返回的是读取字符对应的int值
int read(char[] cbuf) -> 一次读取一个字符数组,返回的是读取个数
int read(char[] cbuf, int off, int len) -> 一次读取一个字符数组一部分,返回的是读取个数
cbuf:读取的数组
off:从数组的哪个索引开始读
len:读多少个
void close() -> 关闭资源

private static void method02()throws Exception {
        FileReader fr = new FileReader("module21\\1.txt");
        char[] chars = new char[2];
        int len;
        while((len = fr.read(chars))!=-1){
            System.out.println(new String(chars,0,len));
        }
        fr.close();
}

3.FileWriter的介绍以及使用

1.概述:字符输出流 -> Writer -> 抽象类
子类:FileWriter
**2.作用:**将数据写到文件中
3.构造:
1 FileWriter(File file)
2 FileWriter(String fileName)
3 FileWriter(String fileName, boolean append) -> 追加,续写
4.方法:
void write(int c) -> 一次写一个字符
void write(char[] cbuf) 一次写一个字符数组
void write(char[] cbuf, int off, int len) 一次写一个字符数组一部分
void write(String str) 直接写一个字符串
void flush() :将缓冲区中的数据刷到文件中
void close() 关流

public class Demo01FileWriter {
    public static void main(String[] args)throws Exception {
        FileWriter fw = new FileWriter("module21\\2.txt");
        fw.write("千山鸟飞绝\r\n");
        fw.write("万径人踪灭\r\n");
        fw.write("孤舟蓑笠翁\r\n");
        fw.write("独钓寒江雪\r\n");
        //fw.flush();
        fw.close();
    }
}

5.注意:FileWriterr底层自带一个缓冲区,我们写的数据会先保存到缓冲区中,所以我们需要将缓冲区中的数据刷到文件中

flush():将缓冲区中的数据刷到文件中,后续流对象还能继续使用
close():先刷新后关闭,后续流对象不能使用了

5.JDK7之后io异常处理方式

1.格式:

  try(IO对象){
      可能出现异常的代码
  }catch(异常类型 对象名){
      处理异常
  }

2.注意:
以上格式处理IO异常,会自动关流

public class Demo02Exception {
    public static void main(String[] args) {
        try(FileWriter fw = new FileWriter("module21\\4.txt");){
            fw.write("你好");
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

=========================================================================
笔记来源尚硅谷

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值