Java-IO流(1)(字节、字符输入输出流、文件拷贝)

个人简介

  • 大家好,我是翰慧腾。一名正在努力学JAVA的大一小白,本文章为初学的笔记,希望各位多多指教。💙
  • 欢迎点赞+收藏+留言💜
  • 成年人的世界 天黑可以矫情 天亮就得拼命🧡

一、IO流

IO流;IO流又称为输入输出流,就是用来读写数据的。

  • I表示intput,是数据从硬盘文件读入到内存的过程,称之输入,负责读。
  • O表示output,是内存程序的数据从内存写出到硬盘文件的过程,称之输出,负责写。

IO流分类:

按流的方向分:输入流\输出流

按流中的数据最小单位分为:字节流\字符流

  1. 字节输入流:以内存为基准,来自磁盘文件/网络中的数据以字节的形式读入到内存中去的流称为字节输入流
  2. 字节输出流:以内存为基准,把内存中的数据以字节写出到磁盘文件或者网络中去的流称为字节输出流。
  3. 字符输入流:以内存为基准,来自磁盘文件、网络中的数据以字符的形式读入到内存中去的流称为字符输入流。
  4. 字符输出流:以内存为基准,把内存中的数据以字符写出到磁盘文件或者网络介质中的流称为字符输出流。

 

二、实现类

1.文件字节输入流(FileInputStream类):

  • 作用:以内存为基准,把磁盘文件中的数据以字节的形式读取到内存中去。
  • 构造器:
  • 方法:

注意:read()方法的返回值是具体字节数。eg:A 返回值就是65

read(byte[] buffer)方法的返回值是读取到的字节个数。

代码:

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

/**
 * @author hanhan
 * date 2022/4/12 8:17
 * 努力已经来不及了,你得拼命
 */
public class File_Demo002 {
    public static void main(String[] args) throws IOException {
        //创建一个文件字节输入流
        InputStream f=new FileInputStream("src/Demo_");//该路径下的内容:1JAVA
        //读取一个字节返回,该方法只能读取内容为英文和数字的,因为英文和数组字节为1.由于中文是三个字节,所以直接读取就会出现乱码
       boolean flag=true;
        int b;
        while (flag) {
            if((b=f.read())!=-1){
                System.out.print((char)b);
            }else{
                flag=false;
            }
        }

        }

    }

import java.io.FileInputStream;
import java.io.InputStream;

/**
 * @author hanhan
 * date 2022/4/12 17:31
 * 努力已经来不及了,你得拼命
 */
public class File_Demo003 {
    public static void main(String[] args) throws Exception {
        InputStream f = new FileInputStream("src/Demo_");//内容:1JAVA
        //采用读取字节数组方式
        byte[] b=new byte[3];
        int a;
        while((a=f.read(b))!=-1){
            System.out.print(new String(b,0,a));//此处如果使用上述方法对字节数强转(char)类型,当字节数不是3的倍数时,读取最后一组数据会出现错误。而用String类构造方法可以解决这一问题,它可以做到只读出所取字节,并不一定是规定的字节数组长度
        }
    }
}

 当定义的字节数组长度不合适时候仍然会出现乱码情况,当文件偏小的时候我们可以定义一个与文件大小一样大的字节数组,一次性读取完文件的全部字节;但当文件过大时候,这种情况可能就会引起内存溢出。

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

/**
 * @author hanhan
 * date 2022/4/12 19:11
 * 努力已经来不及了,你得拼命
 */
public class File_Demo004 {
    public static void main(String[] args) throws Exception {
        //创建File对象
        File f=new File("src/Demo_");
        InputStream ff = new FileInputStream(f);
        byte[] b=new byte[(int)f.length()];//使字符数组大小等于文件的大小
        ff.read(b);//读取文件内容
        System.out.println(new String(b));
    }
}

官方也给我们提供了这种解决办法的直接API

import java.io.FileInputStream;
import java.io.InputStream;

/**
 * @author hanhan
 * date 2022/4/12 19:23
 * 努力已经来不及了,你得拼命
 */
public class File_Demo005 {
    public static void main(String[] args) throws Exception {
        InputStream f = new FileInputStream("src/Demo_");//文件内容:智者不入爱河,建设美丽中国
        byte[] b=f.readAllBytes();
        System.out.println(new String(b));//输出内容:智者不入爱河,建设美丽中国
    }
}

2.文件字节输出流(FileOutputStream):

 补充:String类中的getBytes方法:把一个字符串编码为字节序列,将结果存储到字节数组中。

 换行问题:文件输出流对象.write("\r\n".getBytes()).

import java.io.FileOutputStream;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;

/**
 * @author hanhan
 * date 2022/4/12 19:55
 * 努力已经来不及了,你得拼命
 */
public class FileOutputStreamDemo_ {
    public static void main(String[] args) throws Exception {
        //输出流的参数文件不一定要存在,但是输入流从文件中读取内容时候参数文件一定要存在
        OutputStream f = new FileOutputStream("src/File",true);//每次创建一次新管道,都会清空之前的数据;要想不清空之前的数据,须在参数后面加参数true
        //写一个字节
        f.write('2');//数字和英文都是一个字节
        f.write('a');
        f.write(97);
        f.write(98);
        f.write(99);
        //写一个字节数组
        byte[] b={'2','a',97,98,99};
        f.write(b);
        //采用该方法写中文
        String s="建设美丽中国";
        byte[] bb=s.getBytes(StandardCharsets.UTF_8);//参数可以修改编码形式
        f.write(bb);
        //选取字节数组的一部分写
        f.write(bb,0,3);//写数组前三个:建
        //写出换行
        f.write("\r\n".getBytes(StandardCharsets.UTF_8));
        //刷新数据
        f.flush();
        //关闭流,关闭包括刷新,关闭后流不可以再使用
        f.close();
    }
}

拷贝图片:

import java.io.*;

/**
 * @author hanhan
 * date 2022/4/13 8:44
 * 努力已经来不及了,你得拼命
 */
public class CopyDemo_ {
    public static void main(String[] args) throws IOException {
        //完成一张图片的拷贝
        InputStream f = new FileInputStream("C:\\one.png");
        OutputStream ff = new FileOutputStream("D:\\two.png");
        File file = new File("C:\\one.png");
        byte[] b=new byte[(int)file.length()];
        int len;
        while((len=f.read(b))!=-1){
            ff.write(b);
        }
        System.out.println("复制成功了");
        ff.close();
    }
}

任何文件的底层都是字节,拷贝是转移字节,只要前后文件格式、编码一致,字节流就可以做一切文件数据的拷贝。综上:字节流适合做拷贝,不适合做中文内容的读取。

3.文件字符输入流:以内存为基准,把磁盘文件中的数据以字符的形式读取到内存中去。

字符流优点:读取中文字符不会出现乱码(前提是代码和文件编码一样)

缺点:性能较差

import java.io.FileReader;
import java.io.Reader;

/**
 * @author hanhan
 * date 2022/4/13 14:40
 * 努力已经来不及了,你得拼命
 */
public class FileReader_Demo {
    public static void main(String[] args) throws Exception {
        //创建一个字符输入流管道与源文件接通
        Reader f = new FileReader("src/Demo_");//内容:智者不如爱河 建设美丽中国
        //每次读取一个字符
        int i;
        while((i=f.read())!=-1){
            System.out.print((char) i);
        }
        //输出结果:智者不如爱河 建设美丽中国
    }
}
import java.io.FileReader;
import java.io.Reader;

/**
 * @author hanhan
 * date 2022/4/13 14:40
 * 努力已经来不及了,你得拼命
 */
public class FileReader_Demo {
    public static void main(String[] args) throws Exception {
        //创建一个字符输入流管道与源文件接通
        Reader f = new FileReader("src/Demo_");//内容:智者不如爱河 建设美丽中国
        //每次读取多个字符
        char[] c=new char[13];
        int l;
        while((l=f.read(c))!=-1){
            System.out.println(new String(c,0,l));
        }
    }
}

4.文件字符输出流(FileWriter类):以内存为基准,把内存中的数据以字符的形式写出到磁盘文件中去的流。

 

import java.io.FileWriter;

/**
 * @author hanhan
 * date 2022/4/13 15:23
 * 努力已经来不及了,你得拼命
 */
public class FileWriter_Demo {
    public static void main(String[] args) throws Exception {
        //创建一个字符输出流管道与目标文件接通
        FileWriter f = new FileWriter("src/FileWriter_Demo.text");
       //直接写一个字符,无论几个字节
        String ss="\r\n";//换行字符串
        f.write(98);
        f.write('b');
        f.write('韩');
        String s="智者不如爱河,建设美丽中国";
        f.write(s);
        f.write(ss);
        f.write(s,7,6);//截取字符串的其中一段
        f.close();//关闭流

    }
}

 三、优化资源释放的方式

1.try-catch-finally方式:无论程序是正常进行还是出现问题都会最后执行finally内容(除非虚拟机退出)。虚拟机退出:System.exit(0)

注意:若在finally语句外出现return语句,也会先执行finally语句,再执行return语句 

2.

注意:try()小括号中只能放资源 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

凌晨四点半sec

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

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

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

打赏作者

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

抵扣说明:

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

余额充值