Java学习2.24————io流

IO流
通过IO可以完成硬盘文件的读和写
往内存中去,叫输入(input),或者叫读
从内存中出来,叫输出(output),或者叫写。

流的分类:
字节流:一次读取一个字节,等同于一次读取八个二进制位。比如读英文字母,一个字母一个字节,一个中文在Java中占两个字节。
java.io.InputStream 字节输入流
java.io.OutputStream 字节输出流
字符流:一次读取一个字符,这种流是为了方便读取普通文本文件而存在的。
java.io.Reader 字符输入流
java.io.Writer 字符输出流

字符流读取数据和字节流读取数据:
相同点:在Java中的操作步骤相似,以及所调用的API相同
不同点:效率不同,字符流效率更高,并且字节流可以读取任意文件(视频,音频,图片),字符流只能读取普通文本。

所有的流都实现了java.io.Closeable接口,都是可关闭的,都有close()方法
所有的输出流都实现了java.io.Flushable接口,都是可刷新的,都有flush()方法。从内存中把数据写到硬盘中是通过管道进行的,管道会刷新,所以输出流都可刷新。

文件专属流:
java.io.FileIntputStream
java.io.FileOutputStream
java.io.FileReader
java.io.FileWriter

java.io.FileReader、java.io.FileWriter与java.io.FileIntputStream、java.io.FileOutputStream的使用方法相同

1、java.io.FileIntputStream
创建对象时其参数可以是File对象。
读取方法为read(),read 如果是空参方法,返回的是ASCII值,如果是有参且传递的是字节数组时,返回的是读取的字节的个数
创建字节数组进行读取时,是将对应字符的ASCII值传入数组,然后通过创建字符串对象,将数组传入字符串对象来转换为字符串。读取时会进行覆盖。
举个例子:
数据为abcdefg,七个字节,用长度为4的字节数组读取,那么第一次读取出来的数据是abcd,第二次读取时还剩3个字母没读,所以第二次读出的数据是efg,这是因为efg将abc覆盖了,如果将读取长度写死为4,那个读出的是efgd。
代码如下:

package com.jy.io;

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

/**
 * FileIntputStream   文件专属流,字节输入流
 */
public class IOTest02 {

    public static void main(String[] args) {

        FileInputStream fileInputStream = null;
        try {
            //创建流对象
            fileInputStream = new FileInputStream("E:\\Temp\\test.txt");

            //创建一个字节数组
            //将ASCII值转换为字符时就是通过字节数组

            byte[] bytes = new byte[4];

            //传入字节数组,读取时会按照字节数组的长度来读取字节
            //read 如果是空参方法,返回的是ASCII值,如果是有参且传递的是字节数组时,返回的是读取的字节的个数
            int read = fileInputStream.read(bytes);
            

            //创建字符串对象,并且传入需要转换的字节数组,会将字节数组的ASCII值转换为对应的字符串
            String s = new String(bytes,0,4);

            System.out.println(s);

            //此时再读,就是读取剩下的字节
            read = fileInputStream.read(bytes);

            //剩下3个,此时read值为3
            System.out.println(new String(bytes,0,read));

        } catch (Exception e) {

            e.printStackTrace();
        }finally {
            try {
                fileInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

此时第二次输出为efg
在这里插入图片描述
将第二次输出字节长度写死为4时:

package com.jy.io;

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

/**
 * FileIntputStream   文件专属流,字节输入流
 */
public class IOTest02 {

    public static void main(String[] args) {

        FileInputStream fileInputStream = null;
        try {
            //创建流对象
            fileInputStream = new FileInputStream("E:\\Temp\\test.txt");

            //创建一个字节数组
            //将ASCII值转换为字符时就是通过字节数组

            byte[] bytes = new byte[4];

            //传入字节数组,读取时会按照字节数组的长度来读取字节
            //read 如果是空参方法,返回的是ASCII值,如果是有参且传递的是字节数组时,返回的是读取的字节的个数
            int read = fileInputStream.read(bytes);


            //创建字符串对象,并且传入需要转换的字节数组,会将字节数组的ASCII值转换为对应的字符串
            String s = new String(bytes,0,4);

            System.out.println(s);

            //此时再读,就是读取剩下的字节
            read = fileInputStream.read(bytes);
            System.out.println(new String(bytes,0,4));



        } catch (Exception e) {

            e.printStackTrace();
        }finally {
            try {
                fileInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

此时第二次输出为efgd
在这里插入图片描述

FileIntputStream的available()方法 返回的是所读取文件剩余的字节个数
可以通过调用这个方法作为字节数组的长度,这样就不用写while循环了。且转换时直接传入数组,不用设定从哪一位开始传,传多长字节。(不适用大文件)

 byte[] bytes = new byte[fileInputStream.available()];

            System.out.println(new String(bytes));

2、java.io.FileOutputStream
输出流得有刷新(flush)

package com.jy.io;

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

/**
 * FileOuttputStream   文件专属流,字节输出流
 */
public class IOTest03 {

    public static void main(String[] args) {


        FileOutputStream fileOutputStream = null;

        try {
            //创建输出流对象
            fileOutputStream = new FileOutputStream("E:\\Temp\\test02.txt");

            //abcd对应的ASCII值
            byte[] bytes = {97,98,99,100};

            fileOutputStream.write(bytes);
            /**
             * 将字符串转换为字节数组进行输出
             */

            //定义一个字符串
            String str = "你好,柿子!";

            //将字符串转换为字节数组
            byte[] bytes1 = str.getBytes();

            fileOutputStream.write(bytes);

            //刷新
            fileOutputStream.flush();
            

        } catch (Exception e) {

            e.printStackTrace();
        }finally {
            if(fileOutputStream != null){
                try {
                    fileOutputStream.close();

                } catch (IOException e) {

                    e.printStackTrace();
                }
            }
        }


    }
}

输出流提供了两种构造,
第一种,只需要传文件路径,输出时会覆盖之前的数据。

fileOutputStream = new FileOutputStream("E:\\Temp\\test02.txt");

第二种,追加,加上true,这时输出时会接着原有数据的后面追加。

fileOutputStream = new FileOutputStream("E:\\Temp\\test02.txt",true);


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值