Java开发之IO流

目录

一、IO流是什么?

二、File类

1、File类是什么?

2、构造方法:

3、绝相对路径对路径与

4、File类的常用功能

(1)File的创建功能

(2)File的删除功能

(3)File的判断和获取方法

(4)File的高级获取功能

三、字节流(可以操作所有文件)

1、写数据的步骤

(1)创建字节输出流的对象:

注意:1)如果文件不存在,则会帮我们自动创建该文件

           2)如果文件存在,则会将该文件清空

 (2)通过调用FileOutputStream对象的write()方法写入数据

注意:传递一个整数时,那么实际写入文件的是该整数在码表中对应的字符

(3)通过调用FileOutputStream对象的close()方法释放资源:

注意:每次使用完流必须要释放资源

2、字节流写数据的三种方式

3、字节流写数据可能遇到的问题:

(1)如何换行:

(2)如何进行续写(即创建FileOutputStream对象的时候不清空文件):

注意:在字节流调用方法是采用try...catch...finally来进行异常的抛出,因为任何字节流对象最终都需要调用close()方法来释放资源。也就是说close()方法是必须执行的,所以close()方法需要在异常抛出中放在finally里面进行判断(判断fos是否为空)执行。

4、读数据步骤

(1)创建字节流读入对象

(2)调用FileInputStream对象的read()方法进行读取

(3)调用FileInputStream对象的close()方法释放资源。

5、一次性读取多个字节

另一个比较简单的方法就是调用FileInputStream的read(byte[] b)方法:

6、文件复制

7、字节缓冲流

四、字符流(只能操作文本文件.txt)

字符流实现原理:字符流=字节流+编码表

1、既然字节流可以操作所有文件,那么为什么要使用字符流?

原因:由于字节流一次只能读取一个字节,但中文不管是什么编码格式都是两个字节以上,所以如果利用字节流把文本文件中的中文读到内存中,或者把中文写到文本文件中,可能会出现乱码。

2、字符串(String)中的编码与解码方法

3、写数据的步骤

(1)创建字符输出流的对象

(2)调用写数据方法:

(3)释放资源

4、flush()和close()方法的区别

5、读数据的步骤:

(1)创建字符输入流对象

(2)调用读数据方法

(3)释放资源

6、字符缓冲流(用法和字节缓冲流相似)


一、IO流是什么?

1、可以将数据从本地文件中读取出来。

2、可以将数据从内存中保存到本地文件中去。

二、File类

1、File类是什么?

(1)在读写数据时告诉虚拟机要操作的文件/文件夹在哪。

(2)对文件/文件夹本身进行操作,包括创建、删除等。

2、构造方法:

File(String pathname):通过给定路径名字符串转化为抽象路径名来创建新的File实例。

File(String path, String name):通过连接字符串path和name来充当充当抽象路径名来创建新的File实例。

File(File file,String name):也是将File实例和字符串name连接起来创建新的File实例。

3、绝相对路径对路径与

(1)绝对路径:从盘符开始

File file1 = new File("D:\\....");   //参数为绝对路径

(2)相对路径:相对当前项目文件夹下的路径

File file2 = new File("a.txt");   //在当前项目下创建文件a.txt的File实例
File file3 = new File("模块名\\a.txt");  //在当前项目的某个模块下创建a.txt的File实例

4、File类的常用功能

(1)File的创建功能

      1)public boolean createNewFile(): 创建一个空的文件

注意:如果文件存在,那么创建失败,返回false,如果文件不存在,那么创建成功,返回true,不管文件名是什么,只能创建文件。

      2)public boolean mkdir():创建一个单级文件夹

注意:只能创建单级文件夹,不能创建多级文件夹,不管文件夹名是什么,只能创建文件夹。

      3)public boolean mkdirs():创建一个多级文件夹

注意:可以创建单级文件夹,也可创建多级文件夹,不管文件夹名是什么,只能创建文件夹。

(2)File的删除功能

 public  boolean delete():删除指定文件或空文件夹。

注意:删除的文件或文件夹不走回收站,如果删除的是文件就直接删除,如果删除的是文件夹,只能删除空文件夹。

(3)File的判断和获取方法

public boolean isDirectory()测试此抽象路径名表示的File是否为目录
public boolean isFile()测试此抽象路径名表示的File是否为文件
public boolean exists()测试此抽象路径名表示的File是否存在
public String getName()返回此抽象路径名表示的文件或目录名称

(4)File的高级获取功能

public File[] listFiles();  

       进入文件夹,获取这个文件夹里面所有的文件和文件夹的File对象,并把这些File对象都放在一个数组中返回,包括隐藏文件和隐藏文件夹都可以获取。

注意:1)当调用者是一个文件或有权限的文件夹时,该方法会返回空值null。

           2)当调用者是一个空文件夹时,该方法会返回一个长度为0的空数组。

三、字节流(可以操作所有文件)

1、写数据的步骤

(1)创建字节输出流的对象:

 格式:

FileOutputStream fos = new FileOutputStream(路径字符串或者File对象);

注意:1)如果文件不存在,则会帮我们自动创建该文件

           2)如果文件存在,则会将该文件清空

 (2)通过调用FileOutputStream对象的write()方法写入数据

格式:

fos.write(写入的内容);

注意:传递一个整数时,那么实际写入文件的是该整数在码表中对应的字符

(3)通过调用FileOutputStream对象的close()方法释放资源:

格式:

fos.close();

注意:每次使用完流必须要释放资源

2、字节流写数据的三种方式

public void write(int  b)一次写一个数据
public void write(byte[]  b)一次写一个字节数组的数据
public void write(byte[] b, int st, int len)一次写一个字节数组的部分数据(st下标开始的长度为len的字节数据)

注意:写入字符串时可先调用字符串对象的getBytes()方法获得字节数组,再调用FileOutputStream对象的write方法进行写入。

3、字节流写数据可能遇到的问题:

(1)如何换行:

在需要换行的地方添加换行符的字节数组即可:

windows:换行为:\r\n

Linux:换行为:\r

可将换行符作为一个字符串调用其getBytes()方法获取换行符的字节数组,然后再调用write()方法写入即可。

(2)如何进行续写(即创建FileOutputStream对象的时候不清空文件):

在创建FileOuputStream对象时,设置其构造函数的append属性为true,即可对该文件进行续写。

FileOutputStream fos = new FileOutputStream(写入的文件路径,boolean append);

append属性默认为false,即不续写,若需要对文件进行续写操作就将append设为true即可。

注意:在字节流调用方法是采用try...catch...finally来进行异常的抛出,因为任何字节流对象最终都需要调用close()方法来释放资源。也就是说close()方法是必须执行的,所以close()方法需要在异常抛出中放在finally里面进行判断(判断fos是否为空)执行。

4、读数据步骤

(1)创建字节流读入对象

格式:

FileInputStream fis = new FileInputStream(要读的文件路径字符串或File对象);

注意:如果对应的文件不存在会报错!

(2)调用FileInputStream对象的read()方法进行读取

格式:

int rd = fis.read();

注意:一次只能读取一个字节,返回值就是本次读到的那个字节的数据,也就是字符在码表中对应的那个数字,如果我们想要看到字符数据,就需要对该整数进行强转为char类型。

(3)调用FileInputStream对象的close()方法释放资源。

格式:

fis.close();

注意:使用完文件必须进行资源释放!

5、一次性读取多个字节

思想:通过循环来进行实现,即循环取出文件中的每一个字节所对应的整形数据,并将其进行char类型的强制转换,最后将该字符存入字符数组中即可,注意:按字节从文件中读取字节数据时,读到-1表示文件结束。

//实现一次读多个字节数据
public class Main{
    public static void main(String[] args){
        FileInputStream fis = null;
        char[] contents = new char[10000];
        int id = 0;    //存储读到字符数据的下标
        try{
           //创建FileInputStream对象
           fis = new FileInputStream(文件路径);
           //获取数据存入数组中
           int k = fis.read();
           while(k!=-1) {
             contens[id++]=(char)k;
             k=fis.read();
           }
        }catch(Exception e){
          System.out.println(e);
        }finally{
         //释放资源
         fis.clear();
        }
  }
}

另一个比较简单的方法就是调用FileInputStream的read(byte[] b)方法:

 public int read(byte[] b)

从输入流中读取最多b.length个字节的数据,返回的是读入缓冲区的总字节数,也就是实际读取的字节个数。

6、文件复制

(1)对源文件创建FileInputStream对象,进行字节流文件读操作。

(2)对目的文件创建FileOutputStream对象,进行字节流文件写操作。

7、字节缓冲流

(1)BufferedOutputStream:字节缓冲输出流

格式:

BufferedOutputStream bos = new BufferedOutputStream(字节输出流对象);

(2)BufferedInputStream:字节缓冲输入流

格式:

BufferedInputStream bis = new BufferedInputStream(字节输入流对象);

注意:字节缓冲流仅仅只是提供了一个缓冲区而已,真正进行字节流读写操作的还是字节流对象,字节缓冲流只是为了提高读写效率而已。其读写方式和字节流的读写方式的一样。

四、字符流(只能操作文本文件.txt)

字符流实现原理:字符流=字节流+编码表

1、既然字节流可以操作所有文件,那么为什么要使用字符流?

原因:由于字节流一次只能读取一个字节,但中文不管是什么编码格式都是两个字节以上,所以如果利用字节流把文本文件中的中文读到内存中,或者把中文写到文本文件中,可能会出现乱码。

2、字符串(String)中的编码与解码方法

byte[] getBytes()利用idea默认的UTF-8格式将String字符串编码为一系列字节并存储与字节数组中
byte[] getBytes(String st)使用指定的编码格式st将String字符串编码为一系列字节并存储与字节数组中
String (byte[] bytes)利用idea默认的UTF-8格式将字节数组中的字节解码为字符串
String (byte[] bytes,String  st)使用指定的编码格式st将字节数组中的字节解码为字符串

3、写数据的步骤

(1)创建字符输出流的对象

格式:

FileWriter fw = new FileWriter(文件路径字符串或File对象);

注意事项:在保证父级文件夹路径存在的情况下,若文件不存在,系统自动创建该文件,若文件存在,该文件会被清空

(2)调用写数据方法:

void write(int c)向文件写一个字符
void write(char[]  st)向文件写一个字符数组
void write(char[] st, int off, int len)向文件写一个字符数组中的以下标off开始,长度为len的字符内容
void write(String str)向文件写一个字符串
void write(String str,int off,int len)向文件写一个字符串中的以下标off开始,长度为len的字符内容

注意事项:写int类型的整数,实际上写的是这个整数在码表中对应的字符,如果写的是字符串,会把字符串原样写出。

(3)释放资源

         通过调用FileWriter对象的close()方法释放资源。  

注意事项:每次使用完流必须进行释放资源。

4、flush()和close()方法的区别

       flush()方法用于刷新流,还可以写入数据,但close()方法为关闭流,释放资源,但在关闭前会刷新流,一旦关闭就不能再写数据了。

5、读数据的步骤:

(1)创建字符输入流对象

格式:

FileReader fr = new FileReader(文件路径字符串或File对象);

(2)调用读数据方法

public int  read()一次读取一个字符,返回的是该字符在码表中对应的整数值
public int read(char[]  ch)一次读取多个字符存入字符数组ch中,并将读到的字符数目返回,若一个字符都没读到则返回-1

(3)释放资源

  通过调用FileReader对象的close()方法释放资源。

6、字符缓冲流(用法和字节缓冲流相似)

(1)BufferedWriter:可以将数据高效的写出。

特有方法:void newLine()

写一行行分隔符,行分隔符字符串由系统属性定义。相当于换行符。

(2)BufferedReader:可以将数据高效的读取到内存。

特有方法:String readLine()

读一行文字,结果包含行的内容字符串,不包括任何行终止字符,如果流的结尾已经到达,则为null

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YWang_LQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值