首页 > 编程语言 >JAVA IO流(File类,字节流,字符流)

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

时间:2024-06-02 19:31:08浏览次数:27  
标签:读取 JAVA 字节 IO File int 数组 String

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();
        }
    }
}

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

标签:读取,JAVA,字节,IO,File,int,数组,String
From: https://blog.csdn.net/qq_52260669/article/details/139393975

相关文章

  • Java面试题:解释一下Java中的synchronized关键字,它是如何保证线程安全的?
    在Java中,synchronized关键字是一种同步锁机制,用于确保多个线程在访问共享资源时能够保持线程安全。线程安全是指在多线程环境下,当多个线程尝试同时访问共享资源时,任何时刻最多只有一个线程能够执行特定的代码段。synchronized关键字可以用于以下几个方面:方法同步:当synch......
  • File类(二)
    遍历文件夹的功能方法名称说明publicString[]list()获取当前目录下所有的"一级文件名称"到一个字符串数组中去返回。publicFile[]listFiles()获取当前目录下所有的"一级文件对象"到一个文件对象数组中去返回(重点)。Filef1=newFile("D:\\wuling\\");//......
  • [论文速览] DualVector@ Unsupervised Vector Font Synthesis with Dual-Part Represe
    Pretitle:DualVector:UnsupervisedVectorFontSynthesiswithDual-PartRepresentationaccepted:CVPR2023paper:https://arxiv.org/abs/2305.10462code:https://github.com/thuliu-yt16/dualvector关键词:Unsupervison,VectorFontSynthesis,TrueTypeFontConv......
  • 南昌航空大学大一下学期java题目集4-6总结性Blog-苏礼顺23201608
    一、前言——总结三次题目集的知识点、题量、难度等情况 关于知识点  这次的三次题目集更加进一步体现了面向对象程序设计的思想方法。主要是之前的三次题目集就只是利用了面向对象三大基础特性中的封装特性,而这三次的题目集增加了继承与多态,这正是面向对象设计的精髓所......
  • 【WEEK14】 【DAY5】Swagger Part 3【English Version】
    2024.5.31FridayFollowingupon【WEEK14】【DAY4】SwaggerPart2【EnglishVersion】Contents16.6.ConfigureAPIGroups16.6.1.ModifySwaggerConfig.java16.6.2.Restart16.7.EntityConfiguration16.7.1.Createanewpojofolder16.7.2.ModifyHelloCont......
  • 【WEEK14】 【DAY3】Swagger Part 1【English Version】
    2024.5.29WednesdayContents16.Swagger16.1.IntroductiontoSwagger16.1.1.Front-EndandBack-EndSeparation16.1.2.TheEraofFront-EndandBack-EndSeparation16.1.3.IssuesArising16.1.4.Solution16.1.5.Swagger16.2.IntegratingSwaggerintoSpringBoot1......
  • linux: 基础io
     在C语言中,我们也学习过对文件进行操作,使用C语言对文件进行读写操作是一个正在运行的进程去访问一个二进制文件,想要访问一个文件,首先需要打开这个文件,不同语言都有对文件操作的接口,但是文件本身是存在于磁盘外设中的,想要从磁盘外设中拿到数据,这是要通过操作系统接手的,因为操......
  • MVC中几种常用ActionResult
    一、定义MVC中ActionResult是Action的返回结果。ActionResult有多个派生类,每个子类功能均不同,并不是所有的子类都需要返回视图View,有些直接返回流,有些返回字符串等。ActionResult是一个抽象类,它定义了唯一的ExecuteResult方法,参数为一个ControllerContext,下面为您介绍MVC中的Act......
  • JAVA使用ForkJoinPool实现子任务拆分进行数值累加代码示例
      SumTask.javaimportjava.util.concurrent.RecursiveTask;/***定义任务和拆分逻辑*RecursiveTask<Long>这个是有返回值的*如果不需要返回值可以用RecursiveAction*/publicclassSumTaskextendsRecursiveTask<Long>{/***累加的开始值......
  • JAVA SMTP例子
    一、SimpleMailSender.javapackageorg.fh.util.mail;importjava.util.Date;importjava.util.Properties;importjavax.mail.Address;importjavax.mail.BodyPart;importjavax.mail.Message;importjavax.mail.Multipart;importjavax.mail.Session;importjavax......