• 2022-08-09 IO流


    目录

    IO流

    1.按照流向分

    2.按照操作单元分:

    3、按照角色划分:

    字节输入流:

    字节输出流 :

    文件的复制:

    字符流:

    字符处理流(用的最多)

    利用缓冲字符流写一个文件的复制:

    写一个工具类用来关闭流:

    缓冲流:处理流:


    IO流

    又称输入输出流

    注:流开启之后一定要关闭,在finally里关闭

    关闭规则:先用后关,后用先关

    1.按照流向分

    输入流:从硬盘上读取数据到内存。 (读)
    输出流:从内存写出数据到硬盘。 (写)
    一个文件在传输过程中经历了多次拷贝,I0性能本身就很低。
    File类不能操作文件的内容

    2.按照操作单元分:

    字节流:是一个字节一个字节的操作。二进制操作。操作任意类型的文件。.
    字符流:是一个字符一个字符的操作。一个字符两个字节,主要用来处理文本文件
    .txt,.java,.py,.xml,.properties,.html,.css,.js...

    3、按照角色划分:

    节点流:直接操作一个特定的I0设备。
    处理流:在节点流的基础上,做进一步的处理。
    java中输入/输出流常用的流:
    字节输入流/输出流                                               字符输入/输出流
    抽象基类 :InputStream      OutPutStream,一般带Input/Output的都是字节流
                                                                                      Reader,Writer是字符流
    访问文件: FileInputStream   FileOutputStream FileReader FileWriter
    (↑是节点流)
    缓冲流 BufferedInputStream BufferedOutputStream    BufferedReader BufferedWriter
    (↑是处理流)
    操作对象  ObjectInputStream ObjectOutputStream

    那么流到底怎么用?

    输入流:就是一点一点的往内存里读数据!!!

    字节输入流:

    1.创建一 个FileInputStream对象
    2.定义一个标记,用来控制输入流的读取
    3.循环读取,如果读取到了-1,说明读取到了文件的末尾,循环结束
    4.关闭资源。
    注意: 我们发现一个流读完了,就没有了,不能再读了
    当一个流读完之后会默认调用mark和reset方法来进行记录和重置,这个流就已经重置到了上次读完的位置
    所以就无法再次读取内容,并不是读完一次就关闭了流

    1. @Test
    2. public void test0() throws IOException {
    3. InputStream inputStream = new FileInputStream("C:\\summerjava\\abc\\a.txt");
    4. //开始读的操作,read方法,返回值是int,当返回值为一1时,说明文件读取到了尾部
    5. // 读取文件是否结束的标记
    6. int read;
    7. // 字节流读数据的时候一个字节一个字节去读
    8. //循环读取
    9. while ((read = inputStream.read()) != -1) {
    10. System.out.print(read + " ");
    11. }
    12. inputStream.close();//关闭资源如果有关闭的操作,就不要抛异常,建议都try/catch

     字节输出流 :

    FileOutputStream构造器:
    boolean append参数:如果传入true,则代表在原有基础上追加,不覆盖
    如果传入false,或者不传,覆盖原有内容
    如果没有文件,他会自己帮你创建,并写入

    1. @Test
    2. public void test01(){
    3. OutputStream outputStream=null;
    4. try {
    5. outputStream = new FileOutputStream("a.txt",true);
    6. outputStream.write("\r\n".getBytes());
    7. outputStream.write("八月正午的阳光都没你耀眼".getBytes());
    8. outputStream.write(97);
    9. } catch (Exception e) {
    10. throw new RuntimeException(e);
    11. } finally {
    12. try {
    13. outputStream.close();
    14. } catch (IOException e) {
    15. throw new RuntimeException(e);
    16. }
    17. }
    18. }

    文件的复制:

    两个流:

    FileInputStream:把对应文件的内容读取出来

    FileOutputStream:把读到的内容写出去

    read(byte[])

    write(byte[])

    1. @Test
    2. public void test01(){
    3. InputStream inputStream = null;
    4. OutputStream outputStream = null;
    5. try {
    6. inputStream = new FileInputStream("E:\\workspace\\vscode\\HTML\\20220709\\img\\lijian.jpeg");
    7. outputStream = new FileOutputStream("e:/lijian.jpeg");
    8. byte [] buf = new byte[3];
    9. int len;
    10. // 循环读进来
    11. while((len = inputStream.read(buf)) != -1){
    12. // 写出去
    13. outputStream.write(buf,0,len);
    14. }
    15. System.out.println("文件复制完毕...");
    16. } catch (FileNotFoundException e) {
    17. throw new RuntimeException(e);
    18. } catch (IOException e) {
    19. throw new RuntimeException(e);
    20. } finally {
    21. // IOUtil.closeIO(inputStream,outputStream);
    22. try {
    23. if(Objects.nonNull(outputStream)){
    24. outputStream.close();
    25. int i = 10 / 0;
    26. }
    27. } catch (Exception e) {
    28. throw new RuntimeException(e);
    29. }
    30. try {
    31. if(Objects.nonNull(inputStream)){
    32. inputStream.close();
    33. }
    34. } catch (Exception e) {
    35. throw new RuntimeException(e);
    36. }
    37. }
    38. }

    字符流:

    字符输入流:Writer wirter = new FileWriter("c:/a.txt");

    字符输出流:Reader reader = new FileReader("c:/a.txt"); 

    1. //输入流
    2. @Test
    3. public void test02() {
    4. Writer writer = null;
    5. try {
    6. writer = new FileWriter("e:/bbb.txt");
    7. writer.write("阿里巴巴规约手册...");
    8. System.out.println("数据写出成功...");
    9. } catch (IOException e) {
    10. throw new RuntimeException(e);
    11. }finally {
    12. IOUtil.closeIO(null,writer);
    13. }
    14. }
    15. //输出流
    16. @Test
    17. public void test01() {
    18. Reader reader = null;
    19. try {
    20. reader = new FileReader("e:/aaa.txt");
    21. int len;
    22. char [] buf = new char[10];
    23. while((len = reader.read(buf)) != -1){
    24. System.out.println(new String(buf,0,len));
    25. }
    26. } catch (FileNotFoundException e) {
    27. throw new RuntimeException(e);
    28. } catch (IOException e) {
    29. throw new RuntimeException(e);
    30. } finally {
    31. IOUtil.closeIO(reader,null);
    32. }
    33. }

    字符处理流(用的最多)

    缓冲流,只能处理纯文本文件:

    利用缓冲字符流写一个文件的复制:

    1. @Test
    2. public void test02() {
    3. BufferedWriter bufferedWriter = null;
    4. try {
    5. bufferedWriter = new BufferedWriter(new FileWriter("c:/a.txt"));
    6. bufferedWriter.write("今天是星期二,天气凉爽!");
    7. System.out.println("数据写出成功!");
    8. } catch (IOException e) {
    9. throw new RuntimeException(e);
    10. } finally {
    11. IOUtil.closeIO(null,bufferedWriter);
    12. }
    13. }
    14. @Test
    15. public void test01() {
    16. BufferedReader bufferedReader = null;
    17. try {
    18. bufferedReader = new BufferedReader(new FileReader("c:/aaa.txt"));
    19. String str;
    20. while((str = bufferedReader.readLine()) != null) {
    21. System.out.println(str);
    22. }
    23. } catch (FileNotFoundException e) {
    24. throw new RuntimeException(e);
    25. } catch (IOException e) {
    26. throw new RuntimeException(e);
    27. } finally {
    28. IOUtil.closeIO(bufferedReader,null);
    29. }
    30. }

    写一个工具类用来关闭流:

    传入输入输出流,进行判断是否为空并关闭。

    1. import java.io.*;
    2. import java.util.Objects;
    3. public class IOUtil {
    4. public static void closeIO(Reader reader, Writer writer){
    5. if(Objects.nonNull(reader)) {
    6. try {
    7. reader.close();
    8. } catch (Exception e) {
    9. e.printStackTrace();
    10. }
    11. }
    12. if(Objects.nonNull(writer)){
    13. try {
    14. writer.close();
    15. } catch (Exception e) {
    16. e.printStackTrace();
    17. }
    18. }
    19. }
    20. public static void closeIO(InputStream inputStream, OutputStream outputStream) {
    21. if(Objects.nonNull(inputStream)) {
    22. try {
    23. inputStream.close();
    24. } catch (Exception e) {
    25. throw new RuntimeException(e);
    26. }
    27. }
    28. if(Objects.nonNull(outputStream)){
    29. try {
    30. outputStream.close();
    31. } catch (Exception e) {
    32. throw new RuntimeException(e);
    33. }
    34. }
    35. }
    36. }

    缓冲流:处理流:

    Reader reader = new FileReader("e:/aaa.txt")
    bufferedReader = new BufferedReader(reader);

    1. BufferedReader bufferedReader = null;
    2. BufferedWriter bufferedWriter = null;
    3. try {
    4. bufferedReader = new BufferedReader(new FileReader("e:/aaa.txt"));
    5. bufferedWriter = new BufferedWriter(new FileWriter("e:/bbb.txt"));
    6. String str;
    7. while((str = bufferedReader.readLine()) != null){
    8. bufferedWriter.write(str);//写入
    9. bufferedWriter.newLine();//换行
    10. }
    11. System.out.println("文件复制成功!!!");
    12. } catch (FileNotFoundException e) {
    13. e.printStackTrace();
    14. } catch (IOException e) {
    15. e.printStackTrace();
    16. } finally {
    17. IOUtil.closeIO(bufferedReader,bufferedWriter);
    18. }
  • 相关阅读:
    微信公众号搜题接口
    微信小程序与webview H5交互(内嵌H5跳转原生页面)
    专业综合课程设计 - 优阅书城项目(第一版)
    pytorch lightning最简上手
    spring boot3.x集成swagger出现Type javax.servlet.http.HttpServletRequest not present
    【Spring Authorization Server 系列】(二)令牌的配置(有效期 & 格式)
    【数据结构】队列
    Flutter:构建跨平台应用的未来选择
    微服务架构最佳实践:故障恢复和容错策略
    2059authentication plugin
  • 原文地址:https://blog.csdn.net/weixin_49627122/article/details/126254301