20:File类与IO流-----IO字节流

一:IO的分类:

根据数据的流向分为:输入流和输出流
.输入流:把数据从其他设备读取到内存中的流。
输出流:把数据从内存中写到其他设备。

根据数据的类型分为:
字节流和字符流
在这里插入图片描述

二:字节输出流OutputStream

java.io.OutputStream抽象类是表示字节输出流的所有类的超类,将指向的字节信息流写出到目的地。它定义了字节输出流的基本共性功能方法。

public void close();关闭此输出流并释放与此流相关联的任何系统资源
public void flush();刷新此输出流并强制任何缓冲的输出流字节流被写出。
public void write(byte[] b);将b.length字节从指定的字节数组写入此输出流。
public void write(byte[] b,int off,int len);从指定的字节数组写入len字节,从偏移量off开始输出到此输出流。
public abstract void write(int b);将指定的字节写入此输出流。  

一次写一个字节。

package Demo4;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/*
    java.io.OutputStream;此抽象类是表示输出字节流的所有类的超类。
    定义了一些子类的共性的成员方法。
    public void close();关闭此输出流并释放与此流相关联的任何系统资源
    public void flush();刷新此输出流并强制任何缓冲的输出流字节流被写出。
    public void write(byte[] b);将b.length字节从指定的字节数组写入此输出流。
    public void write(byte[] b,int off,int len);从指定的字节数组写入len字节,从偏移量off开始输出到此输出流。
    public abstract void write(int b);将指定的字节写入此输出流。

  java.io.FileOutputStream extends OutputStream
  FileOoutputStream:文件字节输出流
  作用:把内存中的数据写入到硬盘文件中。

  构造方法:
    FileOutputStream(String name)
        创建一个向具有指定名称的文件中写入数据输出文件流
        FileOutputStream(File file)
        创建一个向指定File对象表示的文件中写入数据的文件输出流。
        参数:写入数据的目的
            String name:目的地是一个文件。
            File file:目的地是一个文件。
        构造方法的作用:
            1:创建一个FileOutputStream对象
            2:会根据构造方法中传递的文件/文件夹路径,创建一个空文件。
            3:会把FileOutputStream对象指向创建好的文件。

     写入数据的原理(内存-->硬盘)
     java程序-->JVM(java虚拟机)--->OS(操作系统)-->OS调用写数据的方法--->会把数据写入到文件。

     字节输出的使用步骤:
        1:创建一个FileOutputStream对象,构造方法中传递写入数据的目的地。
        2:调用FileOutputStram对象中的方法write,把数据写入到文件中。
        3:释放资源。(流使用会占用一定的内存,使用完毕要把内存青葵,提供程序的效率)
*/
public class Demo01OutputStream {
    public static void main(String[] args) throws IOException {
        //1:创建一个FileOutputStream对象,构造方法中传递写入数据的目的地。
        FileOutputStream fos =new FileOutputStream("C:\\Users\\Sky\\Desktop\\one.txt");
        //2:调用FileOutputStram对象中的方法write,把数据写入到文件中。
        //3:释放资源。(流使用会占用一定的内存,使用完毕要把内存青葵,提供程序的效率)
        fos.write(97);
        /*写数据的时候,会把10进制的整数97,转换为二进制97.
        97---1100001
        在任意的文本编辑器(记事本,notepad++)
        在打开文件的时候,都会查询编码表,把字节转换我字符表示。
        0-127:查询ASCII表
        其它值:查询系统默认编码表。(中文系统GBK) 
        fos.close();
    }
}

字节输出流写多个字节的方法

package Demo4;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;

/*
    一次写多个字节的方法:
        public void write(byte[] b);将b.length字节从指定的字节数组写入此输出流。
        public void write(byte[] b,int off,int len);从指定的字节数组写入len字节,从偏移量off开始输出到此输出流。
*/
public class Demo02OutputStream {
    public static void main(String[] args) throws IOException {
        //1:创建一个FileOutputStream对象,构造方法中传递写入数据的目的地。
        FileOutputStream  fos =new FileOutputStream(new File("C:\\Users\\Sky\\Desktop\\one.txt"));
        //2:调用FileOutputStram对象中的方法write,把数据写入到文件中。
        /*
            public void write(byte[] b);将b.length字节从指定的字节数组写入此输出流。
            一次写多个字节
                如果写的第一个字节是正数(0-127),那么显示的时候会查询ASCII表。
                如果写的第一个字节是负数,那第一个字节会和第二个字节,两个字节组成一个一个中文显示,查询系统默认码表(GBK表
        */
        byte[] bytes ={65,66,67,68,69};//ABCDE
        fos.write(bytes);
        /*
             public void write(byte[] b,int off,int len);从指定的字节数组写入len字节,从偏移量off开始输出到此输出流。
        */
        fos.write(bytes,1 ,2 );//BC

        /*
            写入字符的方法:可以使用String类中的方法把字符串,转换为字节数组。
            byte[] getByte(); 把字符串转换为字节数组。
        */
        byte[] byte3="你好".getBytes();
        System.out.println(Arrays.toString(byte3));
        fos.write(byte3);
        //释放资源
        fos.close();;
    }
}

三:字节输出流的续写和换行

package Demo4;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

/*
    追加写/续写:使用两个参数的构造方法:
    FileOutputStream(String name,boolean append);  创建一个向具体指定name的文件中写入数据的输出文件流。
    FileOutputStream(File file,boolean append)
        创建一个向指定File对象表示的文件中写入数据的文件输出流。
    参数:
        String name,File file :写入数据的目的地
        boolean append;追加写开关 true:创建对象不会覆盖原文件,继续在文件的末尾追加写数据。
        false:创建一个新文件,覆盖原文件。

     写换行:
        windows:\r\n
        linux : /n
        mac :   /r
*/
public class Demo03OutputStream {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos =new FileOutputStream("C:\\Users\\Sky\\Desktop\\one.txt",true);
        for (int i=1;i<=10;i++){
            fos.write("你好".getBytes());
            fos.write("\r\n".getBytes());
        }
        fos.close();;
    }
}

四:字节输入流------InputStream类

java.io.InputStream抽象类是表示字节输入流的所有类的超类,可以读写字节信息到内存中。它定义了字节输入流的基本共性功能方法:

.public void close();关闭此输入流并释放与此流相关联的任何系统资源。
public abstract int read();//从输入流读取数据的下一个字节。
public int read(byte[] b);从输入流中读取一些字节数,并将它们存在到字节数组中。

注意:
	close();当完成流的操作时,必须调用此方法,释放系统资源。

FileInputStream类

java.io.FileInputStream类是文件输入流,从文件中读取字节。

构造方法:

FileInputStream(File file);通过打开与实际文件的连接来创建一个FileInputStream,该文件由文件系统中的File对象file命名。
FileInputStream(String name);通过打开与实际文件的连接创建一个FileInputStream,该文件由文件系统中的路径名name命名。
package Demo4;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/*
    java.io.InputStream:字节输入流
    此抽象类是表示字节输入流的所有类的超类。
    定义了所有子类共性的方法:
        int read();//从输入流中读取数据的下一个字节。
        int read(byte[] b);从输入流中读取一定数量的字节,并将其存储在缓存区数组b中。
        void close();关闭此输入流并释放与该流关联的所有系统资源。

    java.io.FileInputStream extends InputStram
    FileInputStream:文件字节输入流
    作用:把硬盘文件中的数据,读取到内存中使用。

    构造方法:
        FileInputStream(String name);
        FileInputStream(File file);
        参数:读取文件的数据源。
            String name;
            File file:文件
        构造方法的作用:
            1:会创建一个FileInputStream对象。
            2:会把FileInputStream对象指定构造方法中要读取的文件
      读取数据的原理(硬盘---》内存)
      java程序--->JVM---》OS--->OS读取数据的方法---->读取文件。
      字节输入流的使用步骤:
        1:创建FileInputStream对象,构造方法绑定要读取的数据源。
        2:使用FileInputStream对象中方法read,读取文件。
        3:释放资源。
*/
public class InputStream {
    public static void main(String[] args) throws IOException {
        // 1:创建FileInputStream对象,构造方法绑定要读取的数据源。
        FileInputStream fis =new FileInputStream("C:\\Users\\Sky\\Desktop\\one.txt");
        //2:使用FileInputStream对象中方法read,读取文件。
        //int read()读取文件中的一个字节并返回,读取文件末尾返回-1
        int len =0;//记录读取到字节。
        while ((len=fis.read())!=-1){
            //System.out.print(len);
        }
      /*  while (fis.read()!=-1){
            System.out.println(fis.read());//错误写法。
        }*/
        //释放资源。
        System.out.println((char)98);
        fis.close();;
    }
}

五:字节输入流一次读取多个字节

package Demo4;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;

/*
    字节输入流一次读取多个字节的方法:
        int read(byte[] b)从输入流中读取一定数量的的字节,并将器存储在缓冲区数组b中。
    明确两件事:
        1:方法的参数byte[]的作用?
        缓存作用,存储读取的多个字节。
        数组的长度一般定义1024(1kb)或者1024的整数倍。
        2:方法的返回值int是什么?
            读取的有效字节个数。

    String类的构造方法:
        String(byte[] bytes)把字节数组转换为字符串。
        String(byte[] bytes,int offset,int length);把字节数组的一部分转换为字符串。offset:数组的开始索引,Length:转换的字节个数。
*/
public class Demo02InputStream {
    public static void main(String[] args) throws IOException {
        //创建FileInputStream对象,构造方法中绑定要读取的数据源。
        FileInputStream fis =new FileInputStream("C:\\\\Users\\\\Sky\\\\Desktop\\\\one.txt");
        //使用FileInputStream对象中的方法read读取文件。
        //int read(byte[] b)从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中。
     /*   byte[] bytes =new byte[1024];
        int len =fis.read(bytes);
        System.out.println(len);
        System.out.println(new String(bytes));*/
       /*
            while循环结束的条件,读取到-1结束。
       */
       byte[] bytes =new byte[1024];//存储读取的多个字节。
       int len =0;//记录每次读取的有效字节个数。
       while ((len = fis.read(bytes))!=-1){
           System.out.println(new String(bytes,0,5));
       }
    }
}

六:字节流练习:图片复制。

原理:从已有文件中读取字节,将该字节写到另外一个文件中。

package Demo4;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/*
        文件复制练习:一读一写:
        明确:
            数据源:C:\Users\Sky\Desktop\mmexport1577083312773.jpg
            数据的目的地:C:\Users\Sky\Desktop、one\1.jpg
        文件复制的步骤:
            1:创建一个字节输入流对象,构造方法绑定要读取的数据源
            2:创建一个字节输出对象,构造方法绑定要写入的目的地
            3:使用字节输入流对象中的方法read读取文件.
            4:使用字节输出流中的方法write,把读取的字节写入到目的地文件中。
            5:关闭资源。
*/
public class Demo01CopyFile {
    public static void main(String[] args) throws IOException {
        long e=System.currentTimeMillis();
        //1:创建一个字节输入流对象,构造方法绑定要读取的数据源
        FileInputStream fis = new FileInputStream("C:\\Users\\Sky\\Desktop\\mmexport1577083312773.jpg");
        //2:创建一个字节输出对象,构造方法绑定要写入的目的地
        FileOutputStream fos =new FileOutputStream("C:\\Users\\Sky\\Desktop\\one\\1.jpg");
        //一次读取一个字节写入一个字节的方式
        //3:使用字节输入流对象中的方法read读取文件.
       /* int len=0;
        while ((len = fis.read())!= -1) {
            // 4:使用字节输出流中的方法write,把读取的字节写入到目的地文件中。
            fos.write(len);
        }*/
        //使用数组缓冲读取多个字节,写入多个字节
        byte[] bytes=new byte[1024];
        //3:使用字节输入流对象中的方法read读取文件.
        int len=0;
        while ((len=fis.read(bytes))!=-1){
            //4:使用字节输出流中的方法write,把读取的字节写入到目的地文件中。
            fos.write(bytes,0,len);
        }
        //释放资源(先关写的,后关闭读的,如果写完了,肯定读取完毕了)
        fos.close();;
        fis.close();
        long e1 =System.currentTimeMillis();
        System.out.println("复制文件耗时:"+(e1-e));
    }
}

七:使用字节流读取中文的问题

package Demo4;

import java.io.FileInputStream;
import java.io.IOException;

/*
    使用字节流读取中文文件:
    1个中文:
        GBK:占用两个字节
        UTF-8:占用3个字节。
*/
public class Demo01InputStream {
    public static void main(String[] args) throws IOException {
        FileInputStream  fis =new FileInputStream("C:\\Users\\Sky\\Desktop\\one.txt");
        int len =0;
        while ((len =fis.read())!=-1){
            System.out.println((char)len);
        }
        fis.close();
    }
}

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值