输入流输出流 读取的写入操作和案例

2023-11-07

1.输入输出流

在Java中,把不同类型的输入输出源抽象为流,其中输入和输出的数据称为数据流。数据流是Java程序发送和接收数据的一个通道,数据流中包括输入流和输出流。通常应用程序中使用输入流读出数据,输出流写入数据。 流式输入、输出的特点是数据的获取和发送均沿数据序列顺序进行。相对于程序来说,输出流是往存储介质或数据通道写入数据,而输入流是从存储介质或数据通道中读取数据

1.先进先出,最先写入输出流的数据最先被输入流读取到。

2.顺序存取,可以一个接一个地往流中写入一串字节,读出时也将按写入顺序读取一串字节,不能随机访问中间的数据。

3.只读或只写,每个流只能是输入流或输出流的一种,不能同时具备两个功能,在一个数据传输通道中,如果既要写入数据,又要读取数据,则要分别提供两个流。

输入流模式

 输出流模式

1. InputStream 类中所有方法遇到错误时都会引发 IOException 异常。所以使用时要抛出异常

2.OutputStream 类是所有字节输出流的超类,用于以二进制的形式将数据写入目标设备,该类是抽象类,不能被实例化。

File f=new file("d:/test.txt");

FileOutputStream out=new fileoutputstream(f);

FileOutputStream in=new FileOutputStream(f);

byte bwrite[]={11,21,3,40};

Java流的分类
① 按流向分类

输出流:OutputStream 和 Writer 为基类。

输入流:InputStream 和 Reader 为基类。

② 根据传输数据单位分类

字节流:OutputStream 和 InputStream 为基类。

字符流:Writer 和 Reader 为基类。

一、输入输出字节流
1.1 概念:
字节输入输出流:每次只操作一个字节(读取或写入),字节操作流,默认每次执行写入操作会直接把数据写入文件.

io流:
输入流:Input;
输出流:Output

流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便进行数据操作;

流是一种有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象,即数组在两台设备间传输为流;

io流的分类:
根据处理数据类型的不同分为:字符流和字节流;
根据数据流向不同分为:输入流和输出流;
字节是数据传输的基本单位,文件内容也是以字节为单位存储的,从文件中把数据读到程序为输入流,从程序把数据写到文件称为输出流,都是相对于程序;

字节输出流:

OutputStream:此为抽象类,所有输出字节流的超类,向文件中输出使用FileOutputStream类;

字节输入流:

InputStream:所有字节输入流的超类,向程序输入使用FileInputStream;

1.2 OutputStream(字节输出流)
java.io.OutputStream 是所有字节输出流的超类。需要该类的子类必须实现向输出流写入一个字节的方法

常用方法
abstract void write(int b)

向输出流中写入一个字节。该方法是一个抽象方法,要求子类必须实现此方法。

 void write(byte b[])

向输出流中写入多个字节。该方法将缓存区 b 中的字节写入到输出流中。

 void write(byte b[], int off, int len)

向输出流中写入多个字节,从缓存区 b 的 off 下标处开始写入 len 个字节。

 void flush()

刷新该输出流,强制将缓存区中的字节写出去。

 void close()

关闭该输出流,并释放与之相关的所有资源。

1.3InputStream(字节输入流)
java.io.InputStream 是所有字节输入流的超类。需要该类的子类必须实现读取下一个字节的方法。

常用方法

abstract int read()

该方法从输入流读取数据的下一个字节。将读取的字节以 int 型返回,如果读取至末尾,则返回值 -1 。另外,该方法是一个抽象方法,要求子类必须实现此方法。

 int read(byte b[])

从输入流中读取多个字节,并将它们存储至缓冲区 b 中。读取的字节数最多等于 b 的长度,也可以读取比 b 长度小的字节数。返回值为实际读取的字节数,如果没有可读取的字节,则返回值 -1。

int read(byte b[], int off, int len)

从输入流中读取 len 个字节,并从缓存区 b 的 off 下标处开始存储(即读取的第一个字节存入缓 b[off] 中,下一个字节存入 b[off + 1] 中…)。同样返回值为实际读取的字节数,如果没有可读取的字节,则返回值 -1。

 int available()

返回该输入流中可读取的有效字节数。

 void close()

关闭该输入流,并释放与之相关的所有系统资源。

例题:假设有一个D:\my\HelloJava.java 文件,下面使用 FileInputStream 类读取并输出该文件的内容。代码如下:

public class Test1 {
public static void main(String[] args) {
File f = new File("D:/my/HelloJava.java");
FileInputStream fis = null;
try {
// 因为File没有读写的能力,所以需要有个InputStream
fis = new FileInputStream(f);
// 定义一个字节数组
byte[] bytes = new byte[1024];
int n = 0; // 得到实际读取到的字节数
System.out.println("D:\\my\\HelloJava.java文件内容如下:");
// 循环读取
while ((n = fis.read(bytes)) != -1) {
String s = new String(bytes, 0, n); // 将数组中从下标0到n的内容给s
System.out.println(s);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}

注意:FileInputStream 类重写了父类 InputStream 中的 read() 方法、skip() 方法、available() 方法和 close() 方法,不支持 mark() 方法和 reset() 方法。
 
2.6复制原理截图

 案例实现
package Java2;
 
import java.io.*;
 
public class CopyFileTest1 {
    public static void main(String[] args) throws IOException {
        //1.定义源文件和目的文件的文件对象
        File f1=new File("D:/a.jpg");
        File newFile=new File("D:/aa/copy.jpg");
 
        //2.创建目的文件
        newFile.createNewFile();
 
        //3.定义输入输出流:使用输入流读取内容 使用输出流写入内容
        InputStream in=new FileInputStream(f1);
        OutputStream out=new FileOutputStream(newFile);

        //练习是容易理解的方式
        byte[] buffe=new byte[10];
        int n=0;
        while (true){
            n=in.read(buffe);//读取文件,内容放入buffer数组中,返回的是实际读取的字节数
            if (n!=-1){
                out.write(buffe,0,n);//把buffer数组从0开始,截取读取到有效字节数n 写入到目的文件中
            }else {
                break;
            }
        }
    }
}

二、 文件的读取和写入
例题:使用字符流完成文件的读写操作
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
 
/**
* 使用字符流完成文件的读写操作
*/
public class WriterAndReader {
 
    public static void main(String[] args) {
        out();
        in();
    }
 
    // 从文件读取数据
    private static void in() {
        File file = new File("F:/test.txt");
        try {
            Reader in = new FileReader(file);
 
            // 因为使用了处理过的字符流,所以缓冲数组cs的大小随意,都不会导致多读
            char[] cs = new char[3];
            int len = -1;
            StringBuilder sb = new StringBuilder();
            while ((len = in.read(cs)) != -1) {
                sb.append(new String(cs, 0, len));
            }
            in.close();
            System.out.println(sb);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
 
    }
 
    // 将数据写入到文件
    private static void out() {
        File file = new File("F:/test.txt");
        try {
            Writer out = new FileWriter(file, true);
            out.write("我爱Java");
            out.flush();
            out.close();
            System.out.println("数据写入成功!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
}
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

输入流输出流 读取的写入操作和案例 的相关文章

随机推荐

  • (CUDA)快速GPU开发------Device函数应用

    Device函数表示的是仅仅在设备 Device 端能够使用的函数 Device函数可以是任何的函数 这样可以通过每一个线程来运行一个Device函数来达到并行的目的 在本文中聚焦软件开发速度 故而不讨论计算性能问题 目录 适用项目 开发方
  • 震惊,竟然能通过表达式计算VO,再也不用手打Getter计算方法了,程序员福利

    我有一个问题 假设我们从给前端返回一个VO 但是VO中的某些属性需要通过计算得来的 如果我们每次都要在实体类中直接计算的话 不利于代码维护性 每次改变计算方法都要重新修改方法 十分麻烦 所以我就想能不能通过一个数学表达式来计算实体类中的属性
  • H20安装

    首先进入一个你自己文件夹 例如 home h2o 1 官网下载 wget c http h2o release s3 amazonaws com h2o rel weierstrass 7 h2o 3 14 0 7 zip 2 解压 安装z
  • 云鲸扫拖一体机器人说明书_活久见,会自己洗拖布的云鲸扫拖机器人

    一 前言 随着科技的发展 从20世纪最重要的发明解放生产力的洗衣机开始 各种自动设备逐渐走入了人们的家庭 但是与西方国家不同家用吸尘器在国内一直不温不火难以成为每一个家庭的必备 中国人日常的清洁工具依旧是扫帚 拖把 抹布 PS 可能是国人不
  • 新手教程04:Gvim快捷键小结

    前言 零基础初学数字IC 学会什么写什么 与大家一起进步 本文主要总结一些Gvim的快捷键 1 H J K L 左 下 右 上 2 w 跳转到下一个单词 b 跳转到上一个单词 3 y 复制 P 粘贴 yy 复制一行 yj 复制当前行和下一行
  • 盘点适合女生的IT方向!谁说女生不能学IT

    IT行业发展趋势越来越好 很多女生也想转行学习IT 但又担心没有合适自己的专业 潜意识觉得IT都是男生学的 今天就来给大家盘点一下 女生在互联网行业的学习方向 女生学IT超酷 的 1 UI设计 UI设计非常注重细节和美感 女性在视觉美感 色
  • 51单片机入门教程(3.2)——数码管的显示实现(0-9)

    连线图 注意 unsigned char code LedChar 10 0xC0 0xF9 0xA4 0xB0 0x99 0x92 0x82 0xF8 0x80 0x90 编写注意辨别LED灯管 共阳数码管 共阴数码管 include
  • fiddler移动端抓包使用教程(详解)

    目录 导读 前言 抓包 什么是抓包 哪些场景下需要抓包 Fiddler Fiddler抓包原理 安装 Fiddler移动端抓包 第一步 允许远程计算机连接 第二步 设置手机网络代理 第三步 允许捕获HTTPS连接 第四步 手机安装证书 写在
  • 嵌入式软件—RK3568开发环境搭建

    一 RK3568 1 1 开发板特点 BSP比较大 对于电脑内存和存储空间要求高 四核CPU 22nm工艺 1 2 BSP BSP Board Support Package 板级支持包 类似于PC系统中BIOS和驱动程序的集合 BSP包含
  • adworld-crypto-equation-2

    参考 大佬的题解 拿到了一张上半部分被遮掉的RSA的私钥照片 以及一份密文 openssl私钥结构 version pad n pad e pad d pad p pad q pad x1 pad x2 pad x3 其中 pad 表示填充
  • 区块链智能合约开发学习

    最近正在肝区块链知识学习 入手学习智能合约的开发 由于网上资料实在是太少了 好不容易东拼西凑完成了智能合约的开发 编译 部署 web3js调用 网页页面 和web3j调用 java调用 赶紧趁热把重点提炼出来 先上图 是我最近学习知识点的一
  • cout和cerr的区别

    问题 c 中输出通常信息的函数为cout 比如 std cout lt lt Hello world 在异常处理机制中则使用cerr来输出错误信息 比如 std cerr lt lt Error too many arguments n 那
  • 美女程序员访谈:IT因你而美丽

    如今的计算机界是个以男性为主的领域 但可不要因为数量对比悬殊就忽视了女性的存在 无论第一位程序员还是第一个Bug捕手都是女性 在3月8日这个特别的日子 程序员 特别邀请了i Free中国分公司总经理王金星 原恒生电子项目主管 现正创业的刀刀
  • echarts图表数据刷新后label文字不变化的问题以及解决方案

    使用select切换数据 得到新的数据后给serise里的data赋值 会发现图表的数据是变了 但是后面的数值不变 数值是用series里的label显示的 图表的数据变成了60多 但是后面的值还是上一次的值381 找了很久的方法 网上有说
  • realityOS 出现在开发者开放源代码中,苹果眼镜要成真

    realityOS 出现在开发者开放源代码中 苹果眼镜要成真 据报道 苹果 公司正在研发一款新的混合现实头戴设备 预计将在今年某个时候发布 我们已经听到了很多关于这个产品的传言 但现在有了来自苹果公司的新证据证明了它的存在 这来自于苹果公司
  • 解决找不到android.support.v7.app.ActionBarActivity的类文件 问题

    遇到提示 android support v7 app ActionBarActivity is deprecated use AppCompatActivity instead 意思是 ActionBarActivity在最新版本的sup
  • 智地平线人工智能(ChatGPT&豆包&讯飞星火)实际使用体验

    引言 AIGC 即 人工智能生成内容 的缩写 代表着由人工智能生成的内容 此征文活动旨在探讨和展示人工智能在学术领域的应用 以及与人类创作者的合作 挑战和我们邀请所有对人工智能 创作和文化交流感兴趣的个人参与 共同探索这个充满创新的领域 近
  • BUG:RuntimeError: CUDA error: invalid device ordinal CUDA kernel errors might be asynchronously repo

    报错分析 当运行以下代码报错 self opt gpu ids 1 torch cuda set device self opt gpu ids 0 报错信息如下 RuntimeError CUDA error invalid device
  • Oracle学习笔记二

    多表查询 笛卡尔积 实际上是两张表的乘积 但是在实际开发中没有太大意义 格式 select from 表1 表2 select from emp select from dept select from emp dept select fr
  • 输入流输出流 读取的写入操作和案例

    1 输入输出流 在Java中 把不同类型的输入输出源抽象为流 其中输入和输出的数据称为数据流 数据流是Java程序发送和接收数据的一个通道 数据流中包括输入流和输出流 通常应用程序中使用输入流读出数据 输出流写入数据 流式输入 输出的特点是