JAVA SE: IO流

news2025/7/26 8:29:11

一、Java流式输入输出原理

Java对于输入输出是以流(Stream)的方式进行的,JDK提供各种各样的“流”类,以获取不同类型的数据。

可以理解为将管道插入到文件中,然后从管道获取数据。这个管道外边还可以套管道,外边的管道对数据进行处理,即套了“处理流”。

二、输入输出流分类

按功能:数据流、处理流

按方向:输入流、输出流

按数据单位:字节流、字符流(2个字节)

Java.io内的流类型继承自一下四种:

2种输入输出 * 2中数据单位:(字节) InputStream、OutputStream、(字符)Reader、Writer

Tip:这里的输入输出是站在程序角度来看的

三、字节流和处理流

字节流:从节点读写数据(如文件、内存)

处理流:套在字节流外,对数据进行处理,为程序提供更强大的读写能力

3.1 字节流类型

类型

字节流(1字节)InputStream

OutputStream

字符流(2字节)

Reader

Writer

File

(File)

FileInputStream

FileOutputStream

FileReader

FileWriter

MemoryArray

(ByteArray/CharArray)

ByteArrayInputStream

ByteArrayOutputStream

CharArrayReader

CharArrayWriter

MemoryString

(String)

-

-

StringReader

StringWriter

Pipe

(Piped)

PipedInputStream

PipedOutputStream

PipedReader

PipedWriter

3.2 处理流类型

处理类型

字节

InputStream/Steam

OutputStream

字符

Reader

Writer

Buffering

BufferedInputStream

BufferedOutputStream

BufferedReader

BufferedWriter

Filtering

FilterInputStream

FilterOutputStream

FilterReader

FilterWriter

bytes和chaacter之间转换

InputStreamReader

OutputStreamWriter

Object Serialization

ObjectInputStream

ObjectOutputStream

Data conversion

DataInputStream

DataOutputStream

Counting

LineNumberInputStream

LineNumberReader

Peeking ahead

PushbackInputStream

PushbackReader

Printing

PrintStream

PrintWriter

四、字节流

InputStream

以字节形式向程序输入数据(8bit)

基本步骤:

  • 新建FileInputStream对象in

  • 打开文件

  • try:new一个文件路径的对象,给in;

  • catch:FileNotFoundException

  • 读取文件

  • try:

  • 判断in.read()是不是-1, 是的话就到头了,就不读了、

  • 关闭in

  • catch:IOException

总结:

以字节的形式挨个读取,输出时要用(char)将ASC码转换出来

FileInputStream对象,new、赋值、.read()、close()

两个异常:FileNotFoundException、IOException

    public static void main(String[] args) {
        int b = 0;
        // 新建一个FileInputStream对象
        FileInputStream in = null;
        try {
            // 给FileInputStream赋值
            in = new FileInputStream("D:\\工作\\编程\\after 2022.11\\KuangShengShuo\\src\\com\\baidu\\File\\number.txt");
        }catch (FileNotFoundException e){
            System.out.println("系统找不到指定文件");
            System.exit(-1);// 系统非正常退出

        }

        // 开始读取
        long num = 0;   // 记录读取了多少个数字
        try {
            while ((b = in.read() )!= -1){  // 主要是in.read()
                System.out.println((char)b);
                num++;
            }
            in.close(); // 关闭输入流
            System.out.println();
            System.out.println("总共读了" + num + "个字节");
        }catch(IOException e){
            System.out.println("文件读取错误");
        }
    }

OutputStream

  • 新建:new一个OutputStream对象,=null

  • 读写:

  • 文件名对应一个对象,赋值给上面新建的对象,这里存在找不到文件的可能(FileNotFoundException)

  • 将东西写到对应的OutputStream中,存在复制失败的可能(IOException)

  • 关闭:各种close(), (也要IOException)

    public static void main(String[] args) {
        FileInputStream in = null;
        FileOutputStream out = null;
        try {
            // 新建, 以下需catch FileNotFoundException
            in = new FileInputStream("D:\\工作\\编程\\after 2022.11\\KuangShengShuo\\src\\com\\baidu\\File\\number.txt");
            out = new FileOutputStream("D:\\工作\\编程\\after 2022.11\\KuangShengShuo\\src\\com\\baidu\\File\\number2.txt");

            // 读写。 以下需catch IOException
            int b = 0;
            while ((b = in.read()) != -1){
                out.write((char)b);
            }
            
            // 关闭
            in.close();
            out.close();
        }catch(FileNotFoundException e){
            System.out.println("系统没有找到指定文件");
            System.exit(-1);
        }catch (IOException e){
            System.out.println("读写错误");
        }

Reader/Writer

注意这里的writer,要写成String.valueOf(i)

因为,int是4个字节,API里写入了低16位的2个字节,忽略了高16位的2个字节。

所以,在输入到文件时不妨吧整形转为char 或者字符串

fw.write(String.valueOf(12));
fw.write(Character.valueOf('1'));

    public static void main(String[] args) {
        FileReader fr = null;
        FileWriter fw = null;

        try {
            fr = new FileReader("D:\\工作\\编程\\after 2022.11\\KuangShengShuo\\src\\com\\baidu\\File\\number.txt");
            fw = new FileWriter("D:\\工作\\编程\\after 2022.11\\KuangShengShuo\\src\\com\\baidu\\File\\number3.txt");

            // 读写
            for(int i = 0; i < 30; i++){
                fw.write(String.valueOf(i));
            }

            // 关闭
            fr.close();
            fw.close();
        }catch (FileNotFoundException e){
            System.out.println("找不到指定文件");
        }catch (IOException e){
            System.out.println("文件复制错误");
        }
    }

五、处理流

5.1 Buffer缓冲流

缓冲是内存中的一块区域,数据在内存中缓冲,然后Flush()立刻写出,需要在close()将缓冲区内容强行输出,否则可能没有输出去。

如果没有buffer,是读一个写一个,很慢;如果有缓冲区,先放内存里,读完后统一写出去,底层会快很多。

  • BufferedInputStream

构造函数 BufferedInputStream( InputStream in) 或者 (InputStream in , int size)

不明白这个mark()和reset()是干啥的。。。

    public static void main(String[] args) {
        FileInputStream fis = null;

        try {
           fis = new FileInputStream("D:\\工作\\编程\\after 2022.11\\KuangShengShuo\\src\\com\\baidu\\File\\number.txt");
           BufferedInputStream in  = new BufferedInputStream(fis);

           // mark一下
            in.mark(2);

            // 输出do re mi f
            int c = 0;
            for (int i = 0; i < 10 && (c = in.read() )!= -1; i++){
                System.out.println((char)c);
            }

            // reset  输出do re mi f
            in.reset();
            for (int i = 0; i < 10 && (c = in.read() )!= -1; i++){
                System.out.println((char)c);
            }

            // 关闭
            in.close();
            fis.close();
        }catch (FileNotFoundException e){
            System.out.println("未找到指定文件");
        }catch (IOException e){
            System.out.println("读写错误");
        }
    }
  • BufferedReader/ BuffreedWriter

bw.write() 配合 bw.newLine() 向文件里写,最后写操作要进行.flush(),才能写进去,不然在缓存里

br.readLine() 读取整行

bw = new BufferedWriter(new FileWriter("文件路径")) 真的像是包在字符流外边的管道

br = new BufferedReader(new FileReader("文件路径"))

最后要.close()

以上,要配合IOException()的catch操作

    public static void main(String[] args) {
        BufferedWriter bw = null;
        BufferedReader br = null;
        try {
            bw = new BufferedWriter(new FileWriter("D:\\工作\\编程\\after 2022.11\\KuangShengShuo\\src\\com\\baidu\\File\\numBufferWriter.txt"));
            String s = null;
            for(int i = 0; i < 10; i++){
                s = String.valueOf(Math.random());
                bw.write(s);
                bw.newLine();
            }
            // 重要!!如果不flush,是写不到文件里的
            bw.flush();

            br = new BufferedReader(new FileReader("D:\\工作\\编程\\after 2022.11\\KuangShengShuo\\src\\com\\baidu\\File\\numBufferWriter.txt"));
            while ((s = br.readLine()) != null){    // 这里是null来判断
                System.out.println(s);
            }

            // 关闭两个处理流
            bw.close();
            br.close();
        }catch (IOException e){
            System.out.println("系统错误");
        }
    }

5.2 转换流

InputStreamReader 和 OutputStreamWriter

如果我们用FileOutputStream流往文件里写东西,是一个字节一个字节的写;外面套上OutputStreamWriter,就是一个字符一个字符的写了。

新建:

OutputStreamWriter osw = new OutputStreamWriter(new一个FileOutputStream对象, "编码格式")

在FileOutputStream中,可以选择是否true, 如果true就不会覆盖原来的,直接接着写

osw.write(内容)

osw.close()

    public static void main(String[] args) {
        try {
            // 新建
            OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\工作\\编程\\after 2022.11\\KuangShengShuo\\src\\com\\baidu\\File\\numTransfrom1.txt"));
            // 写入 .write()
            osw.write("hello transform");
            //------编码方式 UTF8
            System.out.println(osw.getEncoding());
            // 关闭 .close()
            osw.close();


            // 指定编码 new OutputStreamWriter(new FileoutputStream("文件路劲", true),编码格式)
            // 加了true,就在原有的文件下面接着写,否则就覆盖了
            // 就用上面的osw就行了
            osw = new OutputStreamWriter(new FileOutputStream("D:\\工作\\编程\\after 2022.11\\KuangShengShuo\\src\\com\\baidu\\File\\numTransfrom2.txt",true),"ISO8859_1");
            osw.write("hello world again!");
            System.out.println(osw.getEncoding());
            osw.close();
        }catch (IOException e){
            System.out.println("系统错误");
        }
    }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Transwarp KunDB 备份恢复工具安装和备份工作自动化

备份恢复工具安装安装包# KunDR压缩包 KUNTOOL-Image-Registry-3.0.0-X86_64-final.tar.gzservice_client └── kuntools-3.0.0-final├── kundr-3.0.tar.gz└── kuntools-3.0.tar.gzkundr-3.0.tar.gz ├── bin │ ├── kunkun.sh │ ├── kuntools │ └──…

软件测试(进阶篇)(1)

一)如何根据需求来设计测试用例&#xff1f; 1)验证功能的正确性&#xff0c;合理性&#xff0c;无二义性&#xff0c;逻辑要正确 2)分析需求&#xff0c;细化需求&#xff0c;从需求中提取出测试项&#xff0c;根据测试项找到测试点&#xff0c;根据测试点具体的来进行设计测试…

C++基础——C++面向对象之类、对象与继承基础总结(类和对象概念、构造函数与析构函数、this指针、继承)

【系列专栏】&#xff1a;博主结合工作实践输出的&#xff0c;解决实际问题的专栏&#xff0c;朋友们看过来&#xff01; 《QT开发实战》 《嵌入式通用开发实战》 《从0到1学习嵌入式Linux开发》 《Android开发实战》 《实用硬件方案设计》 长期持续带来更多案例与技术文章分享…

14_MySQL视图

1. 常见的数据库对象2. 视图概述2.1 使用视图的好处视图一方面可以帮我们使用表的一部分而不是所有的表&#xff0c;另一方面也可以针对不同的用户制定不同的查询视图。比如&#xff0c;针对一个公司的销售人员&#xff0c;我们只想给他看部分数据&#xff0c;而某些特殊的数据…

前瞻洞察|DoH,隐蔽隧道又添利器,强盾在何方?

DoH这个词对于很多安全从业人员并不是个新词&#xff0c;但对其前世今生能洞若观火的却不多。本期前瞻洞察将从DNS的隐私与安全问题出发&#xff0c;讲述DoH为什么诞生&#xff0c;DoH的出现到底利弊几何&#xff0c;对其弊端如何应对。为了便于读者理解&#xff0c;对于“何为…

轴承轮廓测量解决方案

标题滚动轴承组成、分类 滚动轴承一般由内圈、外圈、滚动体和保持架组成。对于密封轴承&#xff0c;再加上润滑剂和密封圈&#xff08;或防尘盖&#xff09;。这就是轴承的全部组成。 标题滚动轴承分类 滚动轴承代号&#xff1a;轴承型号一般有前置代号&#xff0c;基本代号和…

一、webpack基础

webpack基础 一、webpack是什么 webpack 是一个用于现代 JavaScript 应用程序的静态模块打包工具。 说白了webpack就是一个构建和管理静态资源的工具&#xff0c;在我们使用框架开发时&#xff0c;它会在我们内部的一个或者多个入口根据我们引入的各个模块将他们根据一定的规…

ATool软件使用实验(22)

实验目的 1、学习ATool软件监控主机行为的原理&#xff1b; 2、学习利用ATool软件监控可疑进程的行为&#xff1b; 3、学习利用ATool软件实现对本机进行文件、注册表管理&#xff1b; 4、学习利用ATool软件实现对本机进行内核模块信息和HOOK信息查看。 预备知识 ATool是针…

axios请求响应结果的结构,axios的请求对象

axios请求响应结果的结构 config&#xff1a;配置对象&#xff0c;包括很多内容&#xff0c;请求类型&#xff0c;请求url&#xff0c;请求体等等 data:响应体&#xff0c;服务器返回结果&#xff0c;并且将结果进行json解析&#xff0c;转为对象 headers:响应的头信息 requ…

Telink之标准SDK的介绍_1

前提&#xff1a;常见的项目架构&#xff1a;应用层----》驱动层----》硬件层 1、软件组织架构 顶层⽂件夹( 8 个)&#xff1a; algorithm&#xff0c;application&#xff0c;boot&#xff0c;common&#xff0c;drivers&#xff0c;proj_lib&#xff0c;stack&#xff0c;v…

YOLOv5害虫识别项目代码打包完整上传Gitee仓库(已开源)以及git上传速率限制踩坑记录

YOLOv5害虫识别项目代码打包完整上传Gitee仓库&#xff08;已开源&#xff09;以及git上传速率限制踩坑记录 ps: ​ 最近很多小伙伴需要这个害虫识别项目的源码&#xff0c;由于文件过大&#xff0c;所以将代码完整上传至gitee&#xff0c;所有文件、教程、论文、以及代码模型…

Python之metaclass和dataclass

metaclass:MetaClass元类&#xff0c;本质也是一个类&#xff0c;但和普通类的用法不同&#xff0c;它可以对类内部的定义&#xff08;包括类属性和类方法&#xff09;进行动态的修改。可以这么说&#xff0c;使用元类的主要目的就是为了实现在创建类时&#xff0c;能够动态地改…

ProcessExplorer工具使用(24)

实验目的 1、了解Process Explorer的使用方法预备知识 Process Explorer&#xff08;可执行文件名为procexp.exe&#xff09;是一款由Sysinternals开发的Windows系统和应用程序监视工具&#xff0c;目前Sysinternals已经被微软收购&#xff0c;此款不仅结合了文件监视和注册表监…

日报周报月报工作总结生成器【智能文案生成器】

日报周报月报工作总结生成器【智能文案生成器】 天天写日报&#xff0c;我真的快奔溃了&#xff01; 摸了一天鱼&#xff0c;下班还要写日报&#xff1b; 划了一周的水&#xff0c;周末还要写周报&#xff1b; 啊啊啊啊… 在职场上&#xff0c;尤其是互联网公司里&#xff0c…

Python的数据分析相关的框架

Python特别强大&#xff0c;也是一款可以实现可数据分析语言&#xff0c;它有很多开源的库和工具&#xff0c;可以帮助数据科学家处理和分析数据。 以下是一些常用的Python库和工具&#xff1a; NumPy&#xff1a;NumPy是一个Python库&#xff0c;用于处理大型多维数组和矩阵&…

小程序技术如何提升企业的移动研发效率?

随着移动互联网的普及&#xff0c;移动应用程序已成为企业营销和服务的重要途径。随着技术的不断发展和革新&#xff0c;移动应用程序的开发方式也在不断地演变。 一些技术趋势 1、跨平台开发 跨平台开发已成为移动应用程序开发的趋势。根据 Statista 的报告&#xff0c;截至…

洗地机哪家强?洗地机排行榜

随着清洁行业电器的开展&#xff0c;越来越多的新颖工具和电器开端进入消费者的生活之中。众所周知&#xff0c;面对美不胜收的清洁电器产品&#xff0c;选购也是一大头疼事&#xff0c;应该怎样选购洗地机等清洁电器呢&#xff0c;实在的用户体验和清洁效率莫过于消费者最看重…

如何给电脑重装系统

如何给电脑重装系统 UltraISO(软碟通)、Win10镜像下载UltraISO(软碟通)安装启动盘的制作重装系统 UltraISO(软碟通)、镜像下载&#xff1a; UltraISO(软碟通)安装包下载&#xff1a; 英文版下载链接&#xff1a;http://coderyyn.cn/software/uiso9_pe.exe中文版下载链接&am…

35 openEuler搭建repo(yum)服务器-创建、更新本地repo源

文章目录35 openEuler搭建repo&#xff08;yum&#xff09;服务器-创建、更新本地repo源35.1 获取ISO发布包35.2 挂载ISO创建repo源35.3 创建本地repo源35.4 更新repo源35 openEuler搭建repo&#xff08;yum&#xff09;服务器-创建、更新本地repo源 使用mount挂载&#xff0c…

openpnp - 为贴片工程中的PCB上的mark点元件创建openpnp可识别的定位封装

文章目录openpnp - 为贴片工程中的PCB上的mark点元件创建openpnp可识别的定位封装概述做自己PCB视觉识别用的Mark点封装ENDopenpnp - 为贴片工程中的PCB上的mark点元件创建openpnp可识别的定位封装 概述 建立openpnp Job, brd之后, 载入坐标文件, 精确定位3个mark点, 精确定位…