学习大数据,所必需的java基础(7)-字节流

时间:2024-03-04 15:46:55

IO流介绍以及输入输出以及流向的介绍

  1. I:Input 输入
    O:Output 输出
  2. IO流:将一个数据从一个设备上传输的到另一个设备上的技术
  3. 为啥要学IO流?
    之前我们学过数组和集合,用于存储数据,但是数组和集合都是临时存储的,后面我们要用数据的话,就没了
    所以我们就想,将数据永久保存起来,可以保存到硬盘的文件中
    而我们学的IO流可以将数据保存到硬盘上的文件中,后续使用的话可以从文件中读出来使用

IO流的流向

1.输出:将数据从内存中写到硬盘上 ----- write
2.输入:将数据从硬盘上读到内存中 ----- read

IO流分类

1.字节流:一切皆字节,万能流
字节输出流:OutputStream 父类
字节输入流:InputStream 父类
2.字符流: 专门操作文本文档的
a.文本文档:用记事本打开,人能够看懂的文档
字符输出流:Writer 父类
字节输入流:Reader 父类
3.我们将要学以下几个流:
FileOutputStream//字节输出流
FileInputStream//字节输入流
FileWriter//字符输出流
FileReader//字符输入流
BufferedOutputStream//字节缓冲输出
BufferedInputStream//字节缓冲输入
BufferedWriter//字符缓冲输出
BufferedReader//字符缓冲输入
OutputStreamWriter
InputStreamReader
PrintStream
ObjectOutputStream
ObjectInputStream
扩展:Commons-IO

IO流分类 OutputStream中的子类FileOutoutStream的介绍以及方法的简单介绍

1.概述:OutputStream(抽象类)
2.子类:FileOutputStream输出流对象
3.作用:将数据从内存中写到硬盘上
4.构造:
FileOutputStream(File path)
FileOutput(String path)
5.方法
void write(int b) 一次写一个字节
void write(byte[] b) 一次写一个字节数组
void write(byte[] b, int off, int len)一次写一个字节数组一部分
b:要操作的数组
off:从数组的哪个索引位置开始写
len:写多少个
void close()->关流
6.注意:如果指定的文件不存在,输出流会自动创建

public class test10 {
    public static void main(String[] args) throws IOException {
        final File file = new File("D:\\Ajava\\output.txt");
        final FileOutputStream fileOutputStream = new FileOutputStream(file);
        //一次写一个字节
        fileOutputStream.write(98);
        //fileOutputStream.close();
        //一次写一个字节数组
        byte[] bytes = {97,98,99,100};
        fileOutputStream.write(bytes);
        //fileOutputStream.close();
        //一次写一个数组的一部分,从哪一个开始写,写多长
        fileOutputStream.write(bytes,2,2);
        //fileOutputStream.close();
        //写中文
        fileOutputStream.write("李云龙".getBytes(StandardCharsets.UTF_8));
        fileOutputStream.close();
    }
}

1.注意:FileOutputStream默认情况下,每次运行都会创建一个新的文件
覆盖老文件,然后将在写入的内容放到新文件中
2.续写追加
FileOutputStream(String name, boolean append) append:true 则不会副高老文件,会继续直接续写追加的内容
3.换行
\r \n window系统换行符

public class test01 {
    public static void main(String[] args) throws IOException {
        final File file = new File("D:\\Ajava\\output1.txt");
        final FileOutputStream fileOutputStream = new FileOutputStream(file);
        fileOutputStream.write("古藤老树昏鸦,\r\n".getBytes(StandardCharsets.UTF_8));
        fileOutputStream.write("小桥流水人家,\r\n".getBytes(StandardCharsets.UTF_8));
        fileOutputStream.write("古道西风瘦马,\r\n".getBytes(StandardCharsets.UTF_8));
        fileOutputStream.write("夕阳西下,断肠人在天涯!\r\n".getBytes(StandardCharsets.UTF_8));
        fileOutputStream.close();
    }
}

InputStream子类[fileInputStream]的介绍以及方法的使用

1.概述 InputStream 抽象类
2.子类 FileInputStream
3.作用 将数据从硬盘上读到内存中
4.构造:
FileInputStream(File file)
FileInputStream(String path)
5.方法:
int read() ----- 一次读取一个字节,返回的是读取的那个字节
int read(byte[] b) 一次读取一个字节数组,返回的是读取的个数
int read(byte[] b, int off, int len) 一次读取一个字节数组一部分,返回的是读取的个数
b:要读取的数组
off 从数组数组的哪个字节开始读
len:读多少个
void close() 关流

一次读取一个字节

public class test02 {
    public static void main(String[] args) throws IOException {
        final File file = new File("D:\\Ajava\\output.txt");
        final FileInputStream fileInputStream = new FileInputStream(file);
        int read01 = fileInputStream.read();
        System.out.println("read01 = " + read01);
        int read02 = fileInputStream.read();
        System.out.println("read01 = " + read02);
        int read03 = fileInputStream.read();
        System.out.println("read01 = " + read03);
        int read04 = fileInputStream.read();
        System.out.println("read01 = " + read04);
        int a ;
        while ((a = fileInputStream.read())!=-1){
            System.out.println(a);
        }
        fileInputStream.close();
    }
}

注意:
1.不要判断的时候read一次,输出的时候再read一次,否则输出结果会跳着输出
2.不要读完之后,再重新读了,因为读不出来了
3.如果流被关闭了,流就不能再使用了

一次读取一个字节数组

int read(byte[] b)一次读取一个字节数组,返回的是读取的个数
首先定义一个数组,此数组是一个临时存储空间,读取的内容先保存到数组中,从数组中获取
将来我们不知道文件中存储了多少内容,所以byte数组长度无法定义
所以我们一般长度都指定1024或者其倍数

public class test03 {
    public static void main(String[] args) throws IOException {
        final File file = new File("D:\\Ajava\\output.txt");
        final FileInputStream fileInputStream = new FileInputStream(file);
        //注意数组长度为几,就读取几个
        byte[] bytes =new byte[4];
        //System.out.println("fileInputStream.read() = " + fileInputStream.read());
        //int read() 返回的是读取的个数
        int num = fileInputStream.read(bytes);
        System.out.println(num);
        //读取数组中的内容
        System.out.println(new String(bytes,0,num));
        int len;
        while ((len = fileInputStream.read(bytes))!=-1){
            System.out.println(new String(bytes,0,len));
        }
        fileInputStream.close();
    }
}

字节流实现图片复制代码实现

public class test04 {
    public static void main(String[] args) throws IOException {
        final File file = new File("C:\\Users\\94863\\Pictures\\Saved Pictures\\huahua.jpg");
        final File file1 = new File("C:\\Users\\94863\\Pictures\\Saved Pictures\\xiaohua.jpg");
        final FileInputStream fileInputStream = new FileInputStream(file);
        final FileOutputStream fileOutputStream = new FileOutputStream(file1);
        final byte[] bytes = new byte[1024];
        //final int read = fileInputStream.read(bytes);
        int read;
        //边读边写
        while ((read = fileInputStream.read(bytes))!=-1){
            fileOutputStream.write(bytes,0,read);
        }
        //关流
        fileInputStream.close();
        fileOutputStream.close();
    }
}