Java的IO包,Java的多线程

一.Java的IO包

1.File类

File类表示文件类,可以操作与文件相关的功能.File类属于java.IO包,提供了大量大量的文件操作方法.

文件可以直接删,目录不能直接删(可以通过级联删除文件来删除)

文件不存在时会自动创建,但是目录不存在时会报错,不会自动创建目录.

创建一个文件类/文件路径类:

File file =new File(/*path*/);//指定盘符地址 或相对地址
2.Java 的I/O
1.什么是I/O

在生活中,需要将U盘的文件拷贝到电脑(或者将电脑的文件拷贝到其他设备),文件是通过数据流的方式依次到达另一个设备,文件的拷贝就是一个输入(Input)和输出(Output)的过程

Java中提供对应的API支持对文件的输入和输出,java.io.*

什么是流?

生活中也存在流的概念,例如管道中的流水,从管道的入口到达管道出口,一滴水可以从入口流到出口,可以将“字节数据或者字符数据”比做“水”,数据也可以从一端流到另一端.

输入(Input):Java中,以“应用程序(内存)”为中心,将磁盘文件(设备端)到达内存中的过程 称为 输入

输出 (Output): 以“应用程序(内存)”为中心,将数据从内存到达磁盘文件(设备端)的过程称为 输出

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A21XhE1F-1604899854721)(/Users/yanjiamin/Desktop/2020:9软帝/笔记/assets/IO操作.png)]

根据文件操作方式不同可以将IO分为三类:

1.根据读写方向不同:输入流(InputStream)和输出流(OutputStream)

2.根据读写数据类型不同:字节流(Byte)和字符流(Char)

3.根据读写效率不同:单一流(简单流)和包装流(处理流)(buffered等缓冲流)

关于流的分类,Java提供4个顶级抽象类,分别构建它们的子类:

输入流 输出流
字节流 InputStream(字节输入流) OutputStream(字节输出流)
字符流 Reader(字符输入流) Writer(字符的输出流)

常见的流

1、文件字节输入流和文件字节输出流 : FileInputStream 和 FileOutputStream

2、文件字符输入流和文件字符输出流: FileReader 和 FileWriter

3、缓存字节输入流和 缓存字节输出流 BufferedInputStream 和 BufferedOutputStream

4、缓存字符输入流和缓冲字符输出流 BufferedReader 和BuffereWriter

5、数据字节输入流和数据输出流: DataInputStream 和 DataOutputStream

6、字节数组输入流 和 字节数组输出流 : ByteArrayInputStream 和 ByteArrayOutputStream

7、字符数组输入流 和 字符数组输出流: CharArrayReader 和 CharArrayWriter

8、转换流:(字节流转成字符流) InputStreamReader 和 OutputStreamWriter

9、对象流(序列化流): ObjectInputStream 和 ObjectOutputStream

10、随机访问流(这个流既可以读,也可以写):RandomAccessFile

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sojrxYIJ-1604899854724)(/Users/yanjiamin/Desktop/2020:9软帝/笔记/assets/常见流分类.png)]

2.文件字节流

​ 定义: 文件的输入输出以“字节”为单位,进行流处理

FileInputStream 和 FileOutputStream

读入: 将文件中的数据读到内存中

常用方法:

​ int read() : 一个字节的读取 ,返回字节 的ASCII码 ,对于UTF-8编码,汉字会分3次读取

​ int read(byte[]) : 按一个数组长度读取, 返回实际读取的字节长度, 数据存放在数组中

​ int read(byte[] , offset , len) : 读取流中指定长度的数据,并从offset开始存放到字节数组中,

​ available() :返回流中剩余的字节长度,如果已读完,则返回0

​ skip(long n ): 丢弃(跳过)指定的字节长度,从下一个开始读取

​ 以字节流读取文件内容时是以一个字节为单位进行读取的,若文件中的字节的ASCII码值超过了一个字节范围(-127-128),则会被拆分为单个字节读入(从而出现乱码的情况,与编码方式有关:比如在UTF-8编码方式中,一个汉字占三个字节,就会被拆分成三个字节,在ANSI中一个汉字占两个字节,对于英文字符占的字节个数都是一样的).

​ 字节流可以传输文本,图片,视频等类型数据,但是对于汉字要转码(比如UTF-8,在ASCII(ANSI)码中占两个字节),而字符流只能传输文本类型数据,比如汉字,英文字符等,优点是效率高.

`**available**()`  
      File file = new File("d:/aaa.txt");
        FileInputStream fis = new FileInputStream(file);
       //
		byte [] b= new byte[10];
        StringBuffer sb = new StringBuffer();
            //每次读取的长度,  b: 存放数据的数组
          int len = 0;
          while((len = fis.read(b)) !=-1){
   
              sb.append( new String(b,0,len));
          }

        System.out.println(sb);
        fis.close();
 public static void read2() throws IOException {
   
        // InputStream是抽象类
        InputStream is = new FileInputStream("d:/aaa.txt");
        //丢弃前两个字节
        is.skip(2);
        System.out.println((char)is.read());
        System.out.println("还剩下多少个字节:"+ is.available());
        // 将后面的字节继续使用字节数组读
        byte [] b = new byte[10];
        int len = is.read(b,1,4);
        // 显示数组中读取的所有数据
        System.out.println(Arrays.toString(b));
        //将数组的内容转成字符串  对于空内容不会转换
        System.out.println(new String(b));

        is.close();


    }

文件写出: 将内存的数据写出到磁盘中

构造方法:

new FileOutputStream(File/String ) : 构造文件对象的写出流, 默认覆盖写出

new FileOutputStream(File/String , boolean append): 构造文件对象的写出流,

boolean append:true表示在原有文件上追加数据, false : 覆盖原数据

常用方法:

​ void write(int) : 写出一个字节

​ void writer(byte []) :写出一个字节数组,这里需要指定数组的编码格式 “UTF-8”

​ void writer(byte[] , offerset,len) : 写出一个指定长度的字节数组,指定数组的长度和下标。 从数组的下标开始写出,len表示写出长度.从下标offerset开始,从字节数组中写出len个字节

​ flush():清空缓存,对于使用缓冲流时,将缓冲强制清空.

   //将内存的数据写出到文件   如果文件不存在,会自动创建, 默认覆盖写入  true:追加
        FileOutputStream fos = new FileOutputStream("d://aaa.txt" ,true);
        String str="今天天气还不错";
        fos.write(99);
        //写出一个字符串    字符串可以转成字节数组 或字符数组
        fos.write(str.getBytes("UTF-8"));
        // 写出指定长度
        fos.write(str.getBytes("UTF-8"),0,3); // 写出这个数组的前2个字节
        // 清空缓存
        fos.flush();
        // 关闭流
        fos.close();
        System.out.println("写出成功");

文件复制:

将文件(图片,文本,视频)从一个目录复制到另一个目录, 其中数据长度不变,通过文件读写的方式完成复制

复制过程:从源文件读取数据,然后再将数据写出到目标文件中.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sv1gATGR-1604899854725)(/Users/yanjiamin/Desktop/2020:9软帝/笔记/assets/filecopy.png)]

/**
     * 单个字节复制
     * @param srcFile 源文件
     * @param disFile 目标文件
     */
    public static void copyFile(File srcFile, File disFile){
   
        FileInputStream fis=null;
        FileOutputStream fos =null;
        try {
   
            // 源文件输入流
             fis = new FileInputStream(srcFile);
            // 目标文件输出流
             fos = new FileOutputStream(disFile);
            int n=0;
            while( (n =fis.read()) !=-1){
   
                 //将读到的n写出到 目标文件中
                 fos.write(n);
             }
            System.out.println("复制成功。。");
        } catch (FileNotFoundException e) {
   
            e.printStackTrace();
        } catch (IOException e) {
   
            e.printStackTrace();
        } finally{
   
            //无论是否发生异常 都会关闭流
            try {
   
              //先关闭写出流再关闭输入流:这个关闭顺序可以防止输入流已关闭但是还有写出操作的问题
                fos.close();
                fis.close();
            } catch (IOException e) {
   
                e.printStackTrace();
            }

        }

    }

    /**
     * 一个字节数组的赋值
     * @param src  源地址
     * @param disc 目标地址
     */
    public static void copyFile(String src,String disc){
   
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
   
            //创建 字节输入流
            fis=new FileInputStream(src);
            fos = new FileOutputStream(disc);
            int len=0;
            byte [] b = new byte[1024];
            while( (len= fis.read(b)) !=-1){
   
                // 写出 实际读取的长度 ,为了避免在最后一次写出时出现多余字节
                fos.write(b,0,len);
            }

            System.out.println("复制成功");
        } catch (FileNotFoundException e) {
   
            e.printStackTrace();
        } catch (IOException e) {
   
            e.printStackTrace();
        } finally{
   
            try {
   
                fos.close();
                fis.close();
            } catch (IOException e) {
   
                e.printStackTrace();
            }

        }
    }
3.文件字符流

字符流用于读写存储字符的文件,以字符为单位进行流处理,依次读取字符文件中的字符,常用类以Reader或Writer为父类,对文件的操作使用java.io.FileReader和java.io.FileWriter类.

读文件 :FileReader

常用方法:

​ new FileReader(path): 通过文件路径构建字符输入流

​ new FileReader(File):通过文件对象构建字符输入流

  • ​ int read() :读取一个字符 ,返回字符的int类型

  • ​ int read(char ):读取字符数组长度的数据 ,返回实际读取字符长度,数据存放在字符数组中

  • ​ int read(char offerset len):读取指定字符长度的数组,返回 实际读取字符的长度,数据存放在字符数组中

  • ​ mark(int) :标记流中当前位置 (读取到哪里了)

  • ​ markSupported():判断此流是否支持mark操作

  • ​ reset(): 重置流数据,(又可从头开始读取)

  • ​ skip(long) :丢弃指定长度字符

    注意:并不是所有的流都支持mark(),reset(),随机访问流支持reset().

读字符文件

    // 1、创建字符输入流
        try {
   
            FileReader reader = new FileReader("d:/myfile.txt");
            // 丢弃字符
            reader.skip(1);
            //读一个字符
            System.out.println((char)reader.read());
            System.out.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值