• Java 字节流


    一、输入输出流

            输入输出 ------- 读写文件

            输入 ------- 从文件中获取数据到自己的程序中,接收处理【读】

            输出 ------- 将自己程序中处理好的数据保存到文件中【写】

            流 ------- 数据移动的轨迹

    二、流的分类

            按照数据的移动轨迹分为:输入流   输出流

            按照每一次读写/数据量的大小将流分成:字节流    字符流

            字节流:每一次可读写一个字节的数据量,一个字节就是8位2进制,可处理任何类型的文

                          件【文本、图片、视频........】

            字符流:每一次可读写一个字符的数据量,一个字符就是16位2进制,只能处理文本类型的

                           文件

    三、字节流相关类的使用

            字节输出流 --------- OutPutStream ------- 抽象类 ---------- 不能new --------- 需要找子类

            1.FileOutputStream类

            构造方法:

            FileOutputStream (File file) 通过File 对象创建一个不可追加的字节输出流

            FileOutoutStream (File file,boolean append) 通过File 对象创建一个可追加的字节输出流

            FileOutoutStream (String name) 通过字符串创建一个不可追加的字节输出流

            FileOutoutStream (String name,boolean append) 通过字符串创建一个可追加的字节输出流

    1. public class FileOutputStreamDemo1 {
    2. public static void main(String[] args)throws Exception {
    3. String path="F:"+File.separator+"test"+File.separator+"student.txt";
    4. //字节输出流--OutputStream--抽象类--FileOutputStream
    5. //FileOutputStream类的构造方法
    6. //FileOutputStream(String name) 通过String对象创建一个不可追加的字节输出流。
    7. //参数String name--表示文件路劲【目标位置】
    8. OutputStream out1=new FileOutputStream(path);
    9. FileOutputStream out11=new FileOutputStream(path);
    10. //FileOutputStream(String name, boolean append)通过String对象创建一个是否追加的字节输出流。
    11. //参数1String name--表示文件路劲【目标位置】
    12. //参数2boolean append--是否允许追加【true-追加,false-不追加】
    13. OutputStream out2=new FileOutputStream(path,true);
    14. FileOutputStream out22=new FileOutputStream(path,true);
    15. //推荐使用
    16. File file=new File(path);
    17. //FileOutputStream(File file) 通过File对象创建一个不可追加的字节输出流。
    18. //参数File file--表示文件路劲【目标位置】
    19. OutputStream out3=new FileOutputStream(file);
    20. FileOutputStream out33=new FileOutputStream(file);
    21. //FileOutputStream(File file, boolean append) 通过File对象创建一个是否追加的字节输出流。
    22. //参数1File file--表示文件路劲【目标位置】
    23. //参数2boolean append--是否允许追加【true-追加,false-不追加】
    24. OutputStream out4=new FileOutputStream(file,true);
    25. FileOutputStream out44=new FileOutputStream(file,true);
    26. }
    27. }

            实例方法:

            void write (byte[ ]  b) 将b.length个字节从字节数组写入此文件输出流

            void write (byte[ ] b,int off , int len) 将 len字节从位于偏移量 off的指定字节数组写入

            void write (int b) 将指定的字节写入此文件输出流

            void close( ) 关闭文件输出流并释放与此相关的任何系统资源

    1. public class TestFileOutputStream {
    2. public static void main(String[] args) throws Exception{
    3. String filepath = "F:"+ File.separator+"wangxinghomework"+File.separator+"20230902"+File.separator+"test.txt";
    4. File file = new File(filepath);
    5. FileOutputStream fileOutputStream = new FileOutputStream(file,true);
    6. String data = "hello,zhaomin";
    7. byte bytearray[] = data.getBytes();
    8. fileOutputStream.write(bytearray);
    9. fileOutputStream.close();
    10. //
    11. fileOutputStream.write(bytearray,5,8);
    12. fileOutputStream.write(97);
    13. fileOutputStream.close();
    14. }
    15. }

           2. 字节输入流 ------ InputStream ------ 抽象类 ------- 不能new ------- 找子类

            FileInputStream 构造方法:

            FileInputStream(File file) 通过File对象创建一个字节输入流

            FileInputStream(String name) 通过String对象创建一个字节输入流

    1. public class TestFileInputStream {
    2. public static void main(String[] args) throws Exception{
    3. // FileInputStream类构造方法:
    4. // FileInputStream(File file) 通过File对象创建一个字节输入流
    5. // FileInputStream(String name) 通过String对象创建一个字节输入流
    6. String filepath = "F:"+ File.separator+"wangxinghomework"+File.separator+"20230902"+File.separator+"test.txt";
    7. File file = new File(filepath);
    8. FileInputStream fileInputStream = new FileInputStream(file);
    9. FileInputStream fileInputStream1 = new FileInputStream(filepath);
    10. }
    11. }

           FileInputStream 实例方法:

           int read () 从该输入流读取一个字节的数据  ,返回值:读取到的具体字节数据的int型,如果到达文件末尾返回-1

            int read (byte[ ]  b) 从该输入流读取最多 b.length个字节的数据为字节数组 ,返回值:读取的总字节数, 如果到达文件末尾返回-1

            void    close() 关闭此文件输入流并释放与流相关联的任何系统资源

    1. public class TestFileInputStream {
    2. public static void main(String[] args) throws Exception{
    3. String filepath = "F:"+ File.separator+"wangxinghomework"+File.separator+"20230902"+File.separator+"test.txt";
    4. File file = new File(filepath);
    5. FileInputStream fileInputStream = new FileInputStream(file);
    6. //读取一个字节read()
    7. int value = fileInputStream.read();
    8. String str1 = String.valueOf(value);//转成字符串String类型
    9. fileInputStream.close();
    10. System.out.println(str1+"ok");
    11. // int read(byte[] b) 从该输入流读取最多 b.length个字节的数据为字节数组
    12. //定义一个字节型数组,用来保存读出的数据
    13. byte bytearray[] = new byte[(int) file.length()];
    14. //定义一个临时保存读取来的数据
    15. int temp = 0;
    16. //定义一个数组下标
    17. int index = 0;
    18. while ((temp=fileInputStream.read()) != -1){
    19. bytearray[index] = (byte)temp;
    20. index++;
    21. }
    22. String str = new String(bytearray);
    23. System.out.println(str);
    24. fileInputStream.close();
    25. }
    26. }

         3.DataOutputStream

            DataOutputStream 构造方法:

            DataInputStream(InputStream  in) 创建使用指定的底层InputStream的DataInputStream

            DataOutputStream 实例方法:

    void    writeBoolean(boolean v)将 boolean写入底层输出流作为1字节值
    void    writeByte(int v)将 byte作为1字节值写入底层输出流
    void    writeChar(int v)将 char写入底层输出流作为2字节值,高字节优先
    void    writeDouble(double v)双参数传递给转换 long使用 doubleToLongBits方法在类 Double,然后写入该 long值基础输出流作为8字节的数量,高字节
    void    writeFloat(float v)浮子参数的转换 int使用 floatToIntBits方法在类 Float ,然后写入 该 int值基础输出流作为一个4字节的数量,高字节。 
    void    writeInt(int v)将底层输出流写入 int作为四字节,高位字节
    void    writeLong(long v)将 long写入底层输出流,为8字节,高字节为首
    void    writeShort(int v)将 short写入底层输出流作为两个字节,高字节优先
    void    writeUTF(String str)使用 modified UTF-8编码以机器无关的方式将字符串写入基础输出流
    void    flush()刷新此数据输出流
    void    close()关闭此输出流并释放与此流相关联的任何系统资源
    1. package com.homework.inouttest;
    2. import java.io.DataOutputStream;
    3. import java.io.File;
    4. import java.io.FileOutputStream;
    5. public class TestDataOutputStream {
    6. public static void main(String[] args) throws Exception{
    7. //构造方法
    8. //DataOutputStream(OutputStream out) 创建一个新的数据输出流,以将数据写入指定的底层输出流。
    9. String filepath = "F:"+ File.separator+"wangxinghomework"+File.separator+"20230902"+File.separator+"test1.txt";
    10. File file = new File(filepath);
    11. FileOutputStream out = new FileOutputStream(file,true);
    12. DataOutputStream dataOutputStream = new DataOutputStream(out);
    13. //DataOutputStream类的实例方法
    14. // void writeBoolean(boolean v) 将 boolean写入底层输出流作为1字节值。
    15. dataOutputStream.writeBoolean(true);
    16. // void writeByte(int v) 将 byte作为1字节值写入底层输出流。
    17. dataOutputStream.writeByte(97);
    18. // void writeChar(int v) 将 char写入底层输出流作为2字节值,高字节优先。
    19. dataOutputStream.writeChar('b');
    20. // void writeDouble(double v) 双参数传递给转换 long使用 doubleToLongBits方法在类 Double , 然后写入该 long值基础输出流作为8字节的数量,高字节。
    21. dataOutputStream.writeDouble(16.2);
    22. // void writeFloat(float v) 浮子参数的转换 int使用 floatToIntBits方法在类 Float ,然后写入 该 int值基础输出流作为一个4字节的数量,高字节。
    23. dataOutputStream.writeFloat(17.2f);
    24. // void writeInt(int v) 将底层输出流写入 int作为四字节,高位字节。
    25. dataOutputStream.writeInt(23);
    26. // void writeLong(long v) 将 long写入底层输出流,为8字节,高字节为首。
    27. // void writeShort(int v) 将 short写入底层输出流作为两个字节,高字节优先。
    28. // void writeUTF(String str) 使用 modified UTF-8编码以机器无关的方式将字符串写入基础输出流
    29. dataOutputStream.writeUTF("wo ai ni");
    30. // void flush() 刷新此数据输出流。
    31. dataOutputStream.flush();
    32. // void close() 关闭此输出流并释放与此流相关联的任何系统资源。
    33. dataOutputStream.close();
    34. }
    35. }

             4.DataInputStream类

                DataInputStream类构造方法

                DataInputStream(InputStream  in)创建使用指定的底层InputStream的DataInputStream。

                DataInputStream类实例方法

    boolean    readBoolean() 
    byte    readByte()
    char    readChar()
    double    readDouble() 
    float    readFloat()
    int    readInt()
    long    readLong()
    short    readShort()
    String    readUTF()
    void    close()
    1. package com.homework.inouttest1;
    2. import java.io.DataInputStream;
    3. import java.io.File;
    4. import java.io.FileInputStream;
    5. public class TestDataInputStream {
    6. public static void main(String[] args) throws Exception{
    7. //构造方法
    8. //DataInuptStream(InputStream in)
    9. String filepath = "F:"+ File.separator+"wangxinghomework"+File.separator+"20230902"+File.separator+"test1.txt";
    10. File file = new File(filepath);
    11. FileInputStream inputStream = new FileInputStream(file);
    12. DataInputStream dataInputStream = new DataInputStream(inputStream);
    13. //实例方法
    14. //boolean readBoolean()
    15. boolean flag = dataInputStream.readBoolean();
    16. //byte readByte()
    17. byte byt = dataInputStream.readByte();
    18. // char readChar()
    19. char cha = dataInputStream.readChar();
    20. // double readDouble()
    21. double dou = dataInputStream.readDouble();
    22. // float readFloat()
    23. float flo = dataInputStream.readFloat();
    24. // int readInt()
    25. int in = dataInputStream.readInt();
    26. // long readLong()
    27. // short readShort()
    28. // String readUTF()
    29. String str = dataInputStream.readUTF();
    30. // void close()
    31. dataInputStream.close();
    32. System.out.println(flag+","+byt+","+cha+","+dou+","+flo+","+in+","+str);
    33. }
    34. }

            优点:可以直接写出基本数据类型的数据和String,且不需要转换成字节数组
            缺点:保存到文件中的数据是乱码

          5.序列化

            将一个java对象转换成2进制流数据过程,因为我们做操作的java对象可能需要在多台计算机之间传递

            如何实现序列化?

            (1).为被序列化的java对象的生成类实现一个序列化接口【Serializable】
                public interface Serializable特殊----该接口中一个方法都没有,类的序列化由实现java.io.Serializable接口的类启用。不实现此接口的类将不会使任何状态序列化或反序列化。
    可序列化类的所有子类型都是可序列化的。

            (2).通过java提供ObjectOutputStream类的writeObject(Object obj)

                 ObjectOutputStream的构造方法
                 ObjectOutputStream(OutputStream out) 创建一个写入指定的OutputStream的ObjectOutputStream。 
                 实例方法
                  void    writeObject(Object obj) 将指定的对象写入ObjectOutputStream。

            6.反序列化

               将2进制流数据转换成java对象的过程,需要ObjectInputStream类的Object  readObject()方法读取对象

               ObjectInputStream类的构造方法
                        ObjectInputStream(InputStream  in)
                ObjectInputStream类的实例方法
                        Object    readObject() 从ObjectInputStream读取一个对象

    1. package com.homework.inouttest1;
    2. import java.io.Serializable;
    3. public class Student implements Serializable {
    4. //实例方法,测试用
    5. public void learn(){
    6. System.out.println("Student类的实例方法");
    7. }
    8. }
    1. package com.homework.inouttest;
    2. import com.homework.inouttest1.Student;
    3. import java.io.File;
    4. import java.io.FileOutputStream;
    5. import java.io.ObjectOutputStream;
    6. //ObjectOutputStream(Object obj)
    7. public class ObjectOutTest {
    8. public static void main(String[] args) throws Exception{
    9. String filepath = "F:"+ File.separator+"student.txt";
    10. File file = new File(filepath);
    11. FileOutputStream outputStream = new FileOutputStream(file);
    12. ObjectOutputStream out = new ObjectOutputStream(outputStream);
    13. Student student = new Student();
    14. out.writeObject(student);
    15. out.close();
    16. outputStream.close();
    17. }
    18. }
    1. package com.homework.inouttest1;
    2. import java.io.File;
    3. import java.io.FileInputStream;
    4. import java.io.ObjectInputStream;
    5. public class ObjectInputTest {
    6. public static void main(String[] args) throws Exception{
    7. String filepath = "F:"+ File.separator+"student.txt";
    8. File file = new File(filepath);
    9. FileInputStream fileInputStream = new FileInputStream(file);
    10. ObjectInputStream in = new ObjectInputStream(fileInputStream);
    11. Object objstudent=in.readObject();
    12. Student studentst = (Student)objstudent;
    13. in.close();
    14. fileInputStream.close();
    15. studentst.learn();
    16. }
    17. }

    从D盘复制jpg类型文件到H盘

    1. package com.homework.inouttest;
    2. import java.io.File;
    3. import java.io.FileInputStream;
    4. import java.io.FileOutputStream;
    5. public class CopyTest {
    6. public static void main(String[] args)throws Exception {
    7. //定义D盘路径
    8. String filepath = "D:"+ File.separator;
    9. //创建文件对象
    10. File file = new File(filepath);
    11. //获取D盘所有文件名称
    12. File myfilelist[] = file.listFiles();
    13. for (File d_file:myfilelist) {
    14. String filename = d_file.getName();
    15. int houzhui = filename.lastIndexOf(".");
    16. if (houzhui != -1){
    17. String houzhuiname = filename.substring(houzhui);
    18. if (houzhuiname.equals(".jpg")) {
    19. //拼接文件路径
    20. String jpgpath = filepath + filename;
    21. FileInputStream fileInputStream = new FileInputStream(jpgpath);
    22. //定义H盘路径
    23. String newpath = "H:"+filename;
    24. File newfile = new File(newpath);
    25. FileOutputStream fileOutputStream = new FileOutputStream(newfile);
    26. int temp = 0;
    27. while ((temp = fileInputStream.read()) != -1) {
    28. fileOutputStream.write(temp);
    29. }
    30. fileInputStream.close();
    31. fileOutputStream.close();
    32. }
    33. }
    34. }
    35. }
    36. }

  • 相关阅读:
    python 读取文件 下载文件
    vue jsx 封装Table 表格+Tree 树形控件 jsx自定义el-table-column
    第一个ABAP ALV报表程序构建流程
    c++多线程(一)线程管理
    QML控件类型:TabBar
    ajax 接口上传
    Win10下使用WinSCP+PuTTY实现远程文件操作和终端访问
    虚拟摄像头之八: 从 Camera api2 角度看摄像头框架
    不同架构的详细分析VIP架构
    微信小程序会议OA系统其他页面
  • 原文地址:https://blog.csdn.net/zqm_1994/article/details/133123170