InputStream和OutputStream

文章目录

    • 💡FileInputStream 构造方法
    • 💡InputStream 常用方法
    • 💡OutputStream 概述
    • 💡OutputStream 常用方法
    • 💡PrintWriter
    • 💡小程序练习

使用字节流进行读/写操作时,是以字节为单位的;

InputStream 只是一个抽象类,在实例化时,需要使用具体的实现类,而InputStream 的实现类有很多,可以认为不同的输入设备都对应着一个InputStream 类,而针对于文件读写时,主要使用 FileInputStream

💡FileInputStream 构造方法

构造方法说明
FileInputStream(File file)使用 File 对象构造输入流
FileInputStream(String name)使用文件路径构造输入流

💡InputStream 常用方法

返回值方法说明
intread()读取一个字节的数据,返回-1代表已经读完
intread(byte[] b)最多读取b.length长度字节的数据到b中,返回实际读到的数量,-1表示读完
intread(byte[] b, int off, int len)最多读取off-len长度字节的数据到数组中,从off位置开始放数据
voidclose()关闭字节流

代码演示:

第一种读取方式:

    public static void main(String[] args) {
        try(InputStream is = new FileInputStream("d:/新建文件夹/text.txt")) {
            while(true) {
                byte[] b = new byte[1024];
                int n = is.read(b);//返回读到的字节个数
                System.out.println(n);
                if(n == -1) {
                    //表示数据已经读完了
                    break;
                }
                for(int i = 0; i < n; i++) {
                    System.out.printf("%x\n",b[i]);//用十六进制显示
                }
            }

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

在这里插入图片描述

第二种读取方式:使用Scanner进行读取

Scanner(InputStream is, String charset)使用charset字符集对流对象进行读取
    public static void main(String[] args) {
        try(InputStream is = new FileInputStream("d:/新建文件夹/text.txt");
            Scanner scanner = new Scanner(is, "UTF-8")) {
            //使用Scanner包装一下流对象,将读的内容转换为字符
            while(scanner.hasNext()) {
                String s = scanner.next();
                System.out.println(s);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

在这里插入图片描述

💡OutputStream 概述

与InputStream一样,OutputStream也是一个抽象类,需要具体类进行实现,例如:FileOutputStream ,构造方法的参数与InpuStream也是一样的;

💡OutputStream 常用方法

返回值方法说明
voidwrite()写入一个字节的数据
voidwrite(byte[] b)将b这个数组中的数据全都写入文件中
voidwrite(byte[] b, int off, int len)将b这个字节数组中,从off这个位置开始的数据写入文件中,一直写len个长度
voidclose()关闭字节流
voidflush()下面讲解

flush作用:

举一个例子,平时嗑瓜子时,难道我们嗑一个瓜子就跑出去扔一个瓜子皮吗?并不是的,而是嗑了许多瓜子之后,瓜子皮一块扔,这样就很省力气,OutputStream 也就是这样的,因为写向硬盘中写入数据时是很慢的,所以,会将写入的数据先存放在缓冲中,等缓冲区满了,再写入到硬盘中,但是这样就会有一个缺陷就是,如果还没来得及写入硬盘中时,进程就结束了,那么数据就遗留到了缓冲区中,所以为了防止这种情况,就可以在合适的位置使用 flush() 来刷新缓冲区,这样才真正的将数据写入到了硬盘中

示例一:

import java.io.*;
	public static void main(String[] args) {
        //参数中指定一个true表示,写入数据时,不会将文件中原有的数据覆盖掉
        try(OutputStream os = new FileOutputStream("d:/新建文件夹/text.txt", true)) {
            os.write('a');
            os.write('b');
            os.write('c');
            os.flush();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

示例二:

import java.io.*;
	public static void main(String[] args) {
        //参数中指定一个true表示,写入数据时,不会将文件中原有的数据覆盖掉
        try(OutputStream os = new FileOutputStream("d:/新建文件夹/text.txt", true)) {
            byte[] b = new byte[]{(byte)'Q',(byte)'E',(byte)'R',(byte)'T'};
            os.write(b);//将数组中的数据全都写入到文件中
            os.flush();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

示例三:

import java.io.*; 
	public static void main(String[] args) {
        //参数中指定一个true表示,写入数据时,不会将文件中原有的数据覆盖掉
        try(OutputStream os = new FileOutputStream("d:/新建文件夹/text.txt", true)) {
            byte[] b = new byte[]{(byte)'Q',(byte)'E',(byte)'R',(byte)'T'};
            os.write(b, 0, 3);//将数组中的数据从0位置开始写入到文件中,写入3个字节的数据
            os.flush();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

示例四:

import java.io.*; 
	public static void main(String[] args) {
        //参数中指定一个true表示,写入数据时,不会将文件中原有的数据覆盖掉
        try(OutputStream os = new FileOutputStream("d:/新建文件夹/text.txt", true)) {
            String s = "你好中国";
            byte[] b = s.getBytes();
            //s.getBytes("UTF-8");指定一个字符集
            os.write(b);
            os.flush();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

💡PrintWriter

在上述的流对象中,写入数据时,都必须先转化成字节然后再写入,这对于这一点,可以使用PrintWriter 这个类对输出流进行包装,这样就不用我们自己手动的转化了;

PrintWriter 类中,也提供 Print()、printf()、println() 这样的方法进行写入

演示:

public static void main(String[] args) {
        try(OutputStream os = new FileOutputStream("d:/新建文件夹/text.txt")) {
            try(OutputStreamWriter osw = new OutputStreamWriter(os, "UTF-8");
                //也可以省略上一行直接写PrintWriter pw = new PrintWriter(os),只不过这里没有指定字符集
                PrintWriter pw = new PrintWriter(osw)) {//告诉它我们使用的字符集时UTF-8

                pw.println("我是第一行");//println写入时,会自动写入一个字符串
                pw.print("我是第二行\n");
                pw.printf("%s\n", "我是第三行");
                pw.flush();
            }

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

在这里插入图片描述

💡小程序练习

示例1:

扫描指定路径,并找到名称中包含指定字符的所有普通文件,并且后续询问用户是否要删除该文件

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        //1.输入文件路径
        Scanner in = new Scanner(System.in);
        while(true) {
            System.out.println("请输入要扫描的路径");
            String path = in.nextLine();
            //2.判断路径是否正确
            File path_file = new File(path);
            while(true) {
                if(!path_file.exists()) {
                    System.out.println("您输入的路径不存在,请重新输入");
                }else if(!path_file.isDirectory()) {
                    System.out.println("您输入的路径不是一个目录,请重新输入");
                }else{
                    break;
                }
                path = in.nextLine();
                path_file = new File(path);
            }
            //3.递归扫描目录,将目标文件加入到集合中
            System.out.println("请输入指定字符");
            String aim_char = in.nextLine();
            List<File> result = new ArrayList<>();
            search_comment(path_file, aim_char, result);
            //4.遍历这个集合,判断是否要删除该文件
            for(File f : result) {
                //打印该文件名称
                System.out.println("是否要删除该文件"+f.getName()+"(Yes/No):");
                while(true) {
                    String input = in.nextLine().toLowerCase();
                    if(input.equals("yes")) {
                        //5.删除操作
                        f.delete();
                        System.out.println("删除成功");
                        break;
                    }else if(input.equals("no")){
                        System.out.println("取消删除");
                        break;
                    }else {
                        System.out.println("输入有误,请重新输入");
                    }
                }
            }
        }

    }
    private static void search_comment(File path, String aim, List<File> result) {
        //将path这个目录中的所有文件全部拿出来进行遍历
        File[] all_file = path.listFiles();
        if(all_file == null || all_file.length == 0) {
            return;
        }
        for(File f : all_file) {
            if(f.isDirectory()) {
                //如果f是一个目录,那么就继续递归这个目录
                search_comment(f, aim, result);
            }else {
                //判断该文件是否是目标文件
                if(f.getName().contains(aim)) {
                    //该文件是目标文件,加入到result中
                    result.add(f);
                }
            }
        }
    }
}

示例2:

进行 普通文件的复制

import java.io.*;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        //1.输入源文件路径
        Scanner scan = new Scanner(System.in);
        while (true) {
            System.out.println("请输入文件路径:>");
            String srcPath = scan.nextLine();
            //2.构建file对象
            File srcFile = new File(srcPath);
            //3.检查指定的源文件
            while(true) {
                if(!srcFile.exists()) {
                    //判断指定的文件是否存在
                    System.out.println("你输入的路径不存在,请重新输入!!!");
                }else if(!srcFile.isFile()) {
                    //如果是目录,则重新输入
                    System.out.println("您输入的路径不是一个普通文件,请重新输入!!!");
                }else {
                    break;
                }
                srcPath = scan.nextLine();
                srcFile = new File(srcPath);
            }
            //4.输入目标路径
            System.out.println("请输入目标文件路径:>");
            String destPath = scan.nextLine();
            File destFile = new File(destPath);
            //判断要复制的文件在该路径下是否已经存在
            while(true) {
                if(!destFile.exists()) {
                    //如果文件不存在,则创建一个文件
                    try {
                        destFile.createNewFile();
                        break;
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                }else if(destFile.isDirectory()) {
                    System.out.println("您输入的路径是一个目录,请重新输入");
                }else if(destFile.isFile()){
                    //表示目标文件已经存在,是否进行覆盖
                    System.out.println("目标文件已经存在,是否进行覆盖(Yes/No)");
                    String input = scan.nextLine().toLowerCase();
                    if(!input.equals("no")) {
                        break;
                    }else {
                        System.out.println("停止复制");
                        return;
                    }
                }else {
                    break;
                }
                destPath = scan.nextLine();
                destFile = new File(destPath);
            }
            //复制文件
            try(InputStream is = new FileInputStream(srcFile);
                OutputStream os = new FileOutputStream(destFile)) {
                //定义一个数组,用来存储读出的内容
                byte[] arr = new byte[1024];
                //定义一个标记,用来记录是否读到最后的位置
                int len;
                while(true) {
                    //定义循环是为了防止内容不能一次读完
                    len = is.read(arr);
                    if(len == -1) {
                        break;
                    }
                    os.write(arr, 0, len);
                }
                os.flush();

            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            System.out.println("复制完毕!!!");
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/147520.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

常用网络命令(实习报告)

南京信息工程大学 实验&#xff08;实习&#xff09;报告 实验&#xff08;实习&#xff09;名称 常用网络命令 实验&#xff08;实习&#xff09;日期 2017/5/25 得分 指导教师 *** 专业 网络工程 年级 2015 班次 1 姓名 *** …

java排序算法之桶排序

图解 桶排序&#xff08;Bucket sort&#xff09;是一个排序算法&#xff0c;它的主要思想是将需要排序的数据分到有限数量的桶里。每个桶里的数据再进行单独的排序&#xff0c;最后按照顺序将每个桶里的数据依次取出&#xff0c;即可完成排序。 桶排序的具体实现可以分为以下几…

【2021集创赛】 RISC-V杯三等奖:基于E203 处理器的SM4算法硬件加速

杯赛题目&#xff1a;基于蜂鸟E203 RISC-V处理器内核的SoC设计 参赛要求&#xff1a;研究生组/本科生组 赛题内容&#xff1a; 基于芯来科技的开源蜂鸟E203 Demo SoC进行扩展&#xff0c;在限定的可编程逻辑平台上构建面向专用应用领域&#xff08;譬如人工智能、信息安全、工业…

动手学深度学习——语言模型和数据集(代码详解)

文章目录 语言模型与数据集1. 学习语言模型2. 马尔可夫模型与n元语法3. 自然语言统计4. 读取长序列数据4.1 随机采样4.2 顺序分区 语言模型与数据集 了解到如何将文本数据映射到词元&#xff0c;以及将这些词元视作一系列的离散观测&#xff0c;例如单词或字符。 给定一个文本…

《洛谷深入浅出进阶篇》P3397 地毯————二维差分

上链接&#xff1a;P3397 地毯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P3397 上题干&#xff1a; 题目描述 在 nn 的格子上有 m 个地毯。 给出这些地毯的信息&#xff0c;问每个点被多少个地毯覆盖。 输入格式 第一行&#xff0c;两个…

配置sonarQube

1.新版本需要安装JDK11以上版本 2.修改解压&#xff08;解压在一个路径不包含特殊符号、中文、空格的位置里&#xff09;出来的sonar文件夹中conf下面的配置文件(sonar.properties) sonar.jdbc.usernameXXX sonar.jdbc.passwordXXXsonar.jdbc.urljdbc:sqlserver://172.168.1.…

小学生写作业用什么台灯好?专业的学生台灯推荐

说到台灯相信大家都不陌生&#xff0c;不管是办公族还是学生基本都会备上一台。而且现在的孩子很多都是存在视力问题的&#xff0c;主要的原因就是学习压力太大了&#xff0c;用眼时间过长导致的。所以很多家长选择给孩子使用更为专业的护眼台灯。 不过目前市面上的灯具也是良莠…

Qt Jom Parallel Builds 并行构造

1.Qt官网下载 Jom - Qt Wiki 下载jom源码 git clone git://code.qt.io/qt-labs/jom.git 2.生成makefile qmake -r 进入jom源码目录 执行qmake -r 3.编译 nmake jom编译成功 4.复制到qmake所在目录并运行

基于JAVA SpringBoot和HTML美食网站博客程序设计

摘要 美食网站是一个提供各种美食信息和食谱的网站&#xff0c;旨在帮助用户发现、学习和分享美食。旨在探讨美食网站在现代社会中的重要性和影响。随着互联网的普及&#xff0c;越来越多的人开始使用美食网站来获取各种美食信息和食谱。这些网站不仅提供了方便快捷的搜索功能&…

SAP删除自建、系统表数据的方法

1、输入前台事务码 SE16N 进入 常规表显示 2、输入自建表名称后&#xff0c;回车展示字段 在事务栏中输入 /H 启用编辑 敲击回车 &#xff08;消息显示调试被激活&#xff09; 然后点击执行 3、在右下角栏目中输入 GD-SAPEDIT 和 GD-EDIT 点击 小笔 启用编辑&#xff0c;将两…

哔哩哔哩自动引流软件的运行分享,以及涉及到技术与核心代码分享

先来看实操成果&#xff0c;↑↑需要的同学可看我名字↖↖↖↖↖&#xff0c;或评论888无偿分享 大家好&#xff0c;我是一名专注于自动引流软件研发的技术专家。今天&#xff0c;我将与大家分享自动引流软件涉及到的技术与核心代码&#xff0c;希望能为大家提供一些有价值的参…

【每日一题】2656. k个元素的最大和-2023.11.15

题目&#xff1a; 2656. K 个元素的最大和 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。你需要执行以下操作 恰好 k 次&#xff0c;最大化你的得分&#xff1a; 从 nums 中选择一个元素 m 。将选中的元素 m 从数组中删除。将新元素 m 1 添加到数组中。你的得分增…

冰点还原精灵Deep Freeze for mac:Mac用户的最佳系统保护选择

你是否曾在Mac上安装软件后&#xff0c;发现系统性能下降&#xff0c;或者某些应用程序无法正常运行&#xff1f;这些问题可能让你感到困扰&#xff0c;但幸运的是&#xff0c;有一个解决方案可以帮你解决这些问题——Faronics Deep Freeze for mac。 Deep Freeze for mac是一…

3.1 Linux 前置知识

1、硬件 我们知道&#xff0c;组成计算机的硬件主要有“主机”和“输入/输出设备”。 主机包括机箱、电源、主板、CPU&#xff08;Central Processing Unit&#xff0c;中央处理器&#xff09;、内存、显卡、声卡、网卡、 硬盘、光驱等。输入/输出设备包括显示器、键盘、鼠标…

dubbo服务超时导致的异常

今天服务器启动项目时&#xff0c;页面刷新报错&#xff1a; 查看日志时报错信息为&#xff1a; 解决&#xff1a; 在对应服务的配置文件中配置dubbo超时时间&#xff1a; 随后问题得到解决&#xff0c;特此记录

JimuReport积木报表 v1.6.5 版本发布—免费报表工具

项目介绍 一款免费的数据可视化报表&#xff0c;含报表和大屏设计&#xff0c;像搭建积木一样在线设计报表&#xff01;功能涵盖&#xff0c;数据报表、打印设计、图表报表、大屏设计等&#xff01; Web 版报表设计器&#xff0c;类似于excel操作风格&#xff0c;通过拖拽完成报…

虹科示波器 | 汽车免拆检修 | 2021款广汽丰田威兰达PHEV车发动机故障灯异常点亮

一、故障现象 一辆2021款广汽丰田威兰达PHEV车&#xff0c;搭载A25D-FXS发动机和动力蓄电池系统&#xff08;额定电压为355.2V&#xff0c;额定容量为45.0Ah&#xff09;&#xff0c;累计行驶里程约为1万km。车主反映&#xff0c;高速行驶时发动机突然抖动&#xff0c;且发动机…

软件项目验收测试计划

验收测试计划 1.基本信息 2.项目成果及验收要求 2.1项目成果 2.2验收要求 1、满足业务风险控制法律法规要求。 3.验收组织 4.产品交付 5.产品安装 5.1环境要求 5.2数据库配置 5.3程序配置 6.验收测试方案 6.1测试 依据 6.2测试要求 6.3测试方法 6.4测试工作流程 6.5测试通过准则…

去掉 webstorm 白线

webstorm 编辑界面出现一条白线 ctrlshifta 打开设置窗口, 输入 “显示右边距” 英文版输入 “show right margin” 点击关闭即可

操作系统实验四 死锁问题

一、问题描述 看上图&#xff0c;有五位哲学家&#xff0c;面前都有一个盘子&#xff0c;盘子左边和右边都有一根筷子&#xff0c;他们在吃面之前需要先拿起左边的筷子再拿起右边的筷子&#xff0c;有了一双筷子就可以吃面了。 二、流程 先拿起左手的筷子然后拿起右手的筷子…