• JavaIO流: IO流原理即流的分类


    目录

    IO流原理

    流的分类 :

    四个抽象类:

    (1)字节流:

     FileInputStream:字节输入流

     FileOutputStream:字节输出流:

    FileInputStream 和 FileOutputStream小案例:copy文件

     (2)字符流

    FileReader:

    FileWriter:


    IO流原理

    1. I/O是Input/Output的缩写, I/O技术是非常实用的技术, 用于处理数据传输。如读/写文件,网络通讯等。

    2. Java程序中,对于数据的输入/输出操作以”流(stream)"的方式进行

    3. java.io包下提供了各种 "流”类和接口,用以获取不同种类的数据,并通过方法输入或输出数据。

    4.输入input: 读取外部数据(磁盘、 光盘等存储设备的数据)到程序(内存)中。

    5.输出output:将程序(内存)数据输出到磁盘、光盘等存储设备中

    流的分类 :

    按操作数据单位不同分为:字节流(8 bit),字符流(按字符)

    按数据流的流向不同分为:输入流,输出流

    按流的角色的不同分为:节点流,处理流/包装流

     1) Java的IO流共涉及40多个类,实际上非常规则,都是从如上4个抽象基类派生的

     2)由这四个类派生出来的子类名称都是以其父类名作为子类名后缀。   

    四个抽象类

    (1)字节流:

    InputStream抽象类是所有类字节输入流的超类

    InputStream 常用的子类:

    1. FilelnputStream:文件输入流

    2. BufferedInputStream:缓冲字节输入流

    3. ObjectlnputStream:对象字节输入流

     FileInputStream:字节输入流

    输入流读取hello.txt文件内容:

    直接看代码: 

    1. package com.io.inputSteam;
    2. import org.junit.jupiter.api.Test;
    3. import java.io.FileInputStream;
    4. import java.io.IOException;
    5. public class Demo01 {
    6. public static void main(String[] args) {
    7. }
    8. /**
    9. * 单个字节的读取
    10. * 字节流
    11. */
    12. @Test
    13. public void readFile01(){
    14. // 获取文件路径
    15. String filePath = "e:\\hello.txt";
    16. // readData 存放数据
    17. int readData = 0;
    18. // 扩大fileInputStream作用域,用于关闭资源
    19. FileInputStream fileInputStream =null;
    20. try {
    21. fileInputStream = new FileInputStream(filePath);
    22. // 从该输入流读取一个字节的数据,如果没有输入可用,此方法停止
    23. // 结果返回-1,表示读取完毕
    24. while ((readData=fileInputStream.read())!=-1){
    25. System.out.print((char)readData);
    26. }
    27. System.out.println("读取成功");
    28. } catch (IOException e) {
    29. System.out.println("读取失败");
    30. }
    31. // finally关闭资源
    32. finally {
    33. try {
    34. fileInputStream.close();
    35. } catch (IOException e) {
    36. System.out.println("关闭成功");
    37. }
    38. }
    39. }
    40. /**
    41. * 使用read(byte[] b),多字节读取
    42. */
    43. @Test
    44. public void readFile02(){
    45. // 获取文件路径
    46. String filePath = "e:\\hello.txt";
    47. // readData 存放数据
    48. int readData = 0;
    49. byte [] buf = new byte[8];//一次读取8个字节
    50. int readLen = 0;
    51. // 扩大fileInputStream作用域,用于关闭资源
    52. FileInputStream fileInputStream =null;
    53. try {
    54. fileInputStream = new FileInputStream(filePath);
    55. while((readLen=fileInputStream.read(buf))!=-1){
    56. System.out.print(new String(buf,0,readLen));
    57. }
    58. System.out.println("读取成功");
    59. } catch (IOException e) {
    60. System.out.println("读取失败");
    61. }
    62. // finally关闭资源
    63. finally {
    64. try {
    65. fileInputStream.close();
    66. } catch (IOException e) {
    67. System.out.println("关闭成功");
    68. }
    69. }
    70. }
    71. }

    两种方法:一种是单字节读取,一个一个读,第二种是一次多个读取。

    运行结果:

     注意 new FileInputStream是会有异常,记得抛出异常。

     FileOutputStream:字节输出流:

    主要方法:写入数据

    案例:在E盘中创建a.txt文件并写入数据。

    1. package com.io.outputstream_;
    2. import org.junit.jupiter.api.Test;
    3. import java.io.FileOutputStream;
    4. import java.io.IOException;
    5. import java.io.OutputStream;
    6. /**
    7. * 在E盘中创建a.txt文件并写入数据
    8. */
    9. public class Demo01 {
    10. public static void main(String[] args) {
    11. }
    12. @Test
    13. public void writerFile(){
    14. String filePath = "e:\\a.txt";
    15. OutputStream outputStream = null;
    16. try {
    17. // 获取outputStream对象 new FileOutputStream(filePath);(这种创建方式会覆盖原来文件的内容)
    18. // new FileOutputStream(filePath,true);则进行追加
    19. outputStream = new FileOutputStream(filePath);
    20. // 写入一个数据
    21. // outputStream.write('a');
    22. // 写入字符创
    23. outputStream.write(new String("Hello,World!").getBytes());
    24. System.out.println("写入成功");
    25. } catch (IOException e) {
    26. System.out.println("写入失败");
    27. } finally {
    28. try {
    29. outputStream.close();
    30. } catch (IOException e) {
    31. System.out.println("资源关闭成功");
    32. }
    33. }
    34. }
    35. }

    运行结果:

    注意:写入内容时,默认时覆盖掉原有的内容,可以在使用new  FileOutputStream(filePath,true)实现写入数据追加。

    FileInputStream 和 FileOutputStream小案例:copy文件

    把e盘中的图片文件拷贝到c盘

    主要实现过程:
     1.定义一个输入流,读取bg.jpg的信息
     2.定义一个输出流,将输入流读取到的信息写入到e盘中

    看代码:

    1. package com.io.outputstream_;
    2. import java.io.FileInputStream;
    3. import java.io.FileOutputStream;
    4. import java.io.IOException;
    5. /**
    6. * @author 华子
    7. * 使用输入输出流完成文件拷贝
    8. * 把bg.jpg 从e盘拷贝到d盘
    9. * 1.定义一个输入流,读取bg.jpg的信息
    10. * 2.定义一个输出流,将输入流读取到的信息写入到e盘中
    11. */
    12. public class FileCopy {
    13. public static void main(String[] args) {
    14. String filePath1 = "e:\\bg.jpg";
    15. String filePath2 = "d:\\bg.jpg";
    16. byte[] buf = new byte[1024];
    17. int readLen = 0;
    18. FileInputStream fileInputStream = null;
    19. FileOutputStream fileOutputStream = null;
    20. try {
    21. fileInputStream = new FileInputStream(filePath1);
    22. fileOutputStream = new FileOutputStream(filePath2);
    23. while ((readLen = fileInputStream.read(buf))!=-1){
    24. fileOutputStream.write(buf,0,readLen);
    25. }
    26. System.out.println("copy成功");
    27. } catch (IOException e) {
    28. System.out.println("copy失败");
    29. } finally {
    30. try {
    31. if (fileInputStream!=null){
    32. fileInputStream.close();
    33. }
    34. if (fileOutputStream!=null){
    35. fileOutputStream.close();
    36. }
    37. System.out.println("关闭成功");
    38. } catch (IOException e) {
    39. System.out.println("关闭失败");
    40. }
    41. }
    42. }
    43. }

     (2)字符流

    FileReader和FileWriter是字符流,即按照字符来操作io

    FileReader:

    相关方法:

    1) new FileReader(File/String)

    2) read:每次读取单个字符,返回该字符,如果到文件末尾返回-1

    3) read(char[):批量读取多个字符到数组,返回读取到的字符数,如果到文件末尾返回-1

    相关API:

    1) new String(char[]):将char[]转换成String

    2) new String(harljofflen):将char[]的指定部分转换成String

    FileReader案例:

    从story.txt中读取内容,并显示:

    story里放的是上面复制图片程序的代码。 

    看代码:

    1. package com.io.reader;
    2. import org.junit.jupiter.api.Test;
    3. import java.io.FileReader;
    4. import java.io.IOException;
    5. /**
    6. * fileReader的使用,读取e盘中story.txt文件
    7. */
    8. public class Demo01 {
    9. public static void main(String[] args) {
    10. }
    11. // 单个字符读取
    12. @Test
    13. public void readFile01(){
    14. String filePath = "e:\\story.txt";
    15. FileReader fileReader = null;
    16. int readData = 0;
    17. try {
    18. fileReader = new FileReader(filePath);
    19. // 循环读取,单个字符读取
    20. while ((readData = fileReader.read())!=-1){
    21. System.out.print((char)readData);
    22. }
    23. } catch (IOException e) {
    24. e.printStackTrace();
    25. } finally {
    26. try {
    27. fileReader.close();
    28. } catch (IOException e) {
    29. e.printStackTrace();
    30. }
    31. }
    32. }
    33. // 使用字符数组读取文件
    34. @Test
    35. public void fileReader02(){
    36. String filePath = "e:\\story.txt";
    37. FileReader fileReader = null;
    38. int readLen = 0;
    39. char[] chars = new char[8];
    40. try {
    41. fileReader = new FileReader(filePath);
    42. // 循环读取,单个字符读取
    43. while ((readLen = fileReader.read(chars))!=-1){
    44. System.out.print(new String(chars,0,readLen));
    45. }
    46. } catch (IOException e) {
    47. e.printStackTrace();
    48. } finally {
    49. try {
    50. fileReader.close();
    51. } catch (IOException e) {
    52. e.printStackTrace();
    53. }
    54. }
    55. }
    56. }

     两种读取方式:

    第一种单个字符读取,第二种使用字符数组读取文件。

    运行结果:

    FileWriter:

    1) new FileWriter(File/String):覆盖模式,相当于流的指针在首端

    2) new FileWriter(File/String,true):追加模式,相当于流的指针在尾端

    ●3) write(int):写入单个字符

    4) write(char[):写入指定数组

    5) write(charDjoff,len):写入指定数组的指定部分

    6) write (string) ;写入整个字符串

    7) write(string,off,len):写入字符串的指定部分

    相关API: String类: toCharArray:将String转换成char[]

    注意:FileWriter使用后,必须要关闭(close)或刷新(flush), 否则写入不到指定的文件!

     FileWriter案例:

    上代码:

    创建note.txt文件,并写入内容。

    5种写入方法:

    1. package com.io.writer;
    2. import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;
    3. import java.io.FileWriter;
    4. import java.io.IOException;
    5. /**
    6. * FileWriter的使用:将"风雨之后,必有彩虹"写入note.txt文件中
    7. * 1.write(int):写入单个字符
    8. * 2.write(char[]):写入指定数组
    9. * 3.write(char[],off,Len):写入指定数组的指定部分
    10. * 4.write(string):写入整个字符串
    11. * 5.write(string, off, Len):写入字符串的指定部分
    12. */
    13. public class Demo01 {
    14. public static void main(String[] args) {
    15. String filePath = "e:\\note.txt";
    16. char[] chars = {'a', 'b', 'c'};
    17. String str = "你好北京";
    18. FileWriter fileWriter = null;
    19. try {
    20. fileWriter = new FileWriter(filePath, true);
    21. // 1.write(int):写入单个字符
    22. fileWriter.write('H');
    23. // 2.write(char[]):写入指定数组
    24. fileWriter.write(chars);
    25. // 3.write(char[],off,Len):写入指定数组的指定部分
    26. fileWriter.write(chars,0,3);
    27. // 4.write(string):写入整个字符串
    28. fileWriter.write(str);
    29. // 5.write(string, off, Len):写入字符串的指定部分
    30. fileWriter.write(str, 0, 2);
    31. } catch (IOException e) {
    32. e.printStackTrace();
    33. } finally {
    34. try {
    35. fileWriter.close();
    36. } catch (IOException e) {
    37. e.printStackTrace();
    38. }
    39. }
    40. System.out.println("程序运行完成...");
    41. }
    42. }

    运行结果:

    这里采用了追加的写入方式。

     

  • 相关阅读:
    我的创作纪念日
    Unity之手游UI的点击和方向移动
    Android学习笔记 75. 单元测试
    运维知识点-Windows操作系统cmd/Dos批处理命令与脚本手册bat
    【无标题】
    java毕业设计企业售后服务管理系统mybatis+源码+调试部署+系统+数据库+lw
    显著性目标检测(一)——与图像分割、目标检测的区别
    经过物联网技术的设备改造有“大脑”,更智能
    uniapp使用多列布局显示图片,一行两列
    【C++】STL容器适配器入门:【堆】【栈】【队列】(16)
  • 原文地址:https://blog.csdn.net/qq_59212867/article/details/125464445