IO流体系

一.分类

1.字节流

(1).InputStream(字节输入流)

定义:操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中

书写步骤:1.创建字节输入流对象,2.读数据,3.释放资源

import java.io.FileInputStream;
import java.io.IOException;public class IO {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("C:\\Users\\21566\\IdeaProjects\\untitled6\\c.txt");//只读取第一个数据int i = fis.read();System.out.println(i);fis.close();}
}

循环读取数据:

import java.io.FileInputStream;
import java.io.IOException;public class IO {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("C:\\Users\\21566\\IdeaProjects\\untitled6\\c.txt");int i;//循环读取其中的所有数据while ((i = fis.read()) != -1) {System.out.print((char) i);}fis.close();}
}

注意点:

1.在使用read方法读取数据时,它会一个一个往后读取,当读不到时会返回-1

2.在创建对象时,如果文件不存在则直接报错(读取一个根本不存在的文件这样的操作本身是完全没有意义的,所以直接杜绝了这样的操作)

3.在读取数据时一次读取一个字节,并且读取出来的数据是在ASCII表上所对应的数字

4.在我们每次使用完流之后都必须要释放资源

在FileInputStream中一次读多个字节

public int read()一次读一个字节的数据

public int read(byte[] b)一次读一个字节数组的数据(在一次读取一个字节数组的数据时,每次读取都会保证会尽可能把数组装满)

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;public class IO {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("C:\\Users\\21566\\IdeaProjects\\untitled6\\c.txt");FileOutputStream fos = new FileOutputStream("C:\\Users\\21566\\IdeaProjects\\untitled6\\bbb\\copy.txt");//创建了一个长度为2的byte数组,那么一次就会读取两个字节的数据byte[] bytes = new byte[2];int len = fis.read(bytes);System.out.println(len);System.out.println(Arrays.toString(bytes));//注意点:先开的流后关闭fos.close();fis.close();}
}

注意点:在读取数据时,每一次都将数据读入了byte数组当中,在第二次读入数据时则是将原本存入byte数组中的数据一次覆盖掉,那么如果最后一次读取的数据不足以覆盖掉全部的上一次数据,会出现什么情况呢?答案是:仍有未被覆盖的数据保存在byte数组中

比如:我存入了abcde五个数据,byte数组的大小为2,那么最后一次读取的byte数组的长度应该为1(只读取了e一个数据),但是输出这时的byte数组中的数据则会输出ed两个数据,这是因为后面的d没有被新的数据覆盖,仍被保存在byte数组中

(2).OutputStream(字节输出流)

书写步骤:1.创建字节输出流对象,2.写入数据,3.释放资源

例:文件的字节输出流

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class IO {public static void main(String[] args) throws IOException {FileOutputStream fos = new FileOutputStream("C:\\Users\\21566\\IdeaProjects\\untitled6\\c.txt");fos.write(97);fos.close();}
}

原理:

在我们书写FileOutputStream fos = new FileOutputStream("");这一行代码时与FIle对象创建了一个数据传输的通道,然后再调用write方法使用该条通道将数据传输到File对象当中,最后使用的close方法则是用于释放资源(毁坏了这条通道)

字节输出流的一些注意点:

1.在创建对象时使用的参数不管是File对象还是字符串表示的路径都可以

2.在创建对象时如果当前要输出的文件对象不存在,那么会创建这样一个文件并将数据输入进去,但是前提是保证父级路径是存在的

3.在创建对象时如果对象已经存在,那么字节输出流会先清空文件,然后再将数据写入文件中

4.在写入数据时使用的是write方法,虽然在write方法中传入的参数是整数,但是实际上写到对象中的数据是该整数在ASCII码表上所对应的字符

5.释放资源(close方法)的作用是解除对资源的占用,否则在字节输出流使用该对象期间任何程序都不得对该对象进行修改,所以每次我们在使用完流之后都要释放资源

FileOutputStream写数据的三种方式:

void write(int i)一次写一个字节的数据

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class IO {public static void main(String[] args) throws IOException {FileOutputStream fos = new FileOutputStream("C:\\Users\\21566\\IdeaProjects\\untitled6\\c.txt");byte[] b = {97, 98, 99, 100, 101, 102, 103, 104, 105};fos.write(b);fos.close();}
}

void write(byte[] b)一次写一个字节数组中的所有数据

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class IO {public static void main(String[] args) throws IOException {FileOutputStream fos = new FileOutputStream("C:\\Users\\21566\\IdeaProjects\\untitled6\\c.txt");byte[] b = {97, 98, 99, 100, 101, 102, 103, 104, 105};fos.write(b, 1, 4);fos.close();}
}

void write(byte[] b, int off, int len)一次写一个字节数组中的部分数据(b:byte类型的数组,off:起始索引,len:从起始索引开始写入的数据个数)

FileOutputStream写数据的两个问题

换行输出数据:

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class IO {public static void main(String[] args) throws IOException {FileOutputStream fos = new FileOutputStream("C:\\Users\\21566\\IdeaProjects\\untitled6\\c.txt");String str1 = "abcdefghijk";byte[] bytes1 = str1.getBytes();fos.write(bytes1);//把第二组数据再次输入File对象当中,但是单纯的再次输入数据并不会换行,而是需要我们手动输入一个代表换行的byte数组String line = "\r\n";//windows系统中的为\r\n,Linux操作系统中的则是\n,需要大家注意的是在不同系统中的换行符并不相同byte[] change = line.getBytes();fos.write(change);String str2 = "lmnop";byte[] bytes2 = str2.getBytes();fos.write(bytes2);fos.close();}
}

续写数据:

如果想要续写数据则需要打开续写开关,而续写开关位于创建对象的第二个参数位置,默认为false

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class IO {public static void main(String[] args) throws IOException {FileOutputStream fos = new FileOutputStream("C:\\Users\\21566\\IdeaProjects\\untitled6\\c.txt",true);String str = "abcdefghijk";byte[] bytes = str.getBytes();fos.write(bytes);fos.close();}
}

2.字符流

字符流=字节流+字符集

特点:

输入流:一次读一个字节,遇到中文时一次读多个字节

输出流:在底层把数据按照指定的编码方式编码,变成字节之后再写到文件中

使用场景:

对于纯文本文件进行读写操作

(1).Reader(字符输入流)

FileReader的书写步骤:

1.创建字符输入流对象

public FileReader(File file)

public FileReader(String pathname)

两者都是创建字符输入流与本地文件建立连接,但不管是传递一个File对象还是一个String类型的数据来表示文件路径都是可以的

注意点:如果文件不存在则直接报错

2.读取数据

public int read()一次读取一个数据,到末尾返回-1

import java.io.FileReader;
import java.io.IOException;public class IO {public static void main(String[] args) throws IOException {FileReader fr = new FileReader("C:\\Users\\21566\\IdeaProjects\\untitled6\\c.txt");int c;while ((c = fr.read()) != -1) {System.out.print((char) c);}fr.close();}
}

public int read(char[] c)一次读取多个数据,到末尾返回-1

import java.io.FileReader;
import java.io.IOException;public class IO {public static void main(String[] args) throws IOException {FileReader fr = new FileReader("C:\\Users\\21566\\IdeaProjects\\untitled6\\c.txt");char[] c = new char[2];int len;while ((len = fr.read(c)) != -1) {System.out.print((new String(c, 0, len)));}fr.close();}
}

注意点:

1.按字节进行读取,遇到中文时会一次读取多个字节,之后解码,返回该中文所对应的整数

2.只要读取到了末尾就会返回-1

3.释放资源

public int close()

(2).Writer(字符输出流)

构造方法:

第一类:

创建字符输出流与本地文件建立连接(不续写)

public FileWriter(File file)

public FileWriter(String pathname)

第二类:

(要续写)

public FileWriter(File file, boolean append)

public FileWriter(String pathname, boolean append)

成员方法:

void write(int i)写出一个字符

import java.io.FileWriter;
import java.io.IOException;public class IO {public static void main(String[] args) throws IOException {FileWriter fw = new FileWriter("C:\\Users\\21566\\IdeaProjects\\untitled6\\c.txt");fw.write(23781);//先按照当前字符集的编码方式进行编码,编码之后找到对应的数据写出fw.close();}
}

void write(String str)写出一个字符串

import java.io.FileWriter;
import java.io.IOException;public class IO {public static void main(String[] args) throws IOException {FileWriter fw = new FileWriter("C:\\Users\\21566\\IdeaProjects\\untitled6\\c.txt");fw.write("爱自己是终生浪漫的开始");//先按照当前字符集的编码方式进行编码,编码之后找到对应的数据写出fw.close();}
}

void write(String str, int off, int len)写出一个字符串的一部分(从off位置开始的len长度的那一部分)

import java.io.FileWriter;
import java.io.IOException;public class IO {public static void main(String[] args) throws IOException {FileWriter fw = new FileWriter("C:\\Users\\21566\\IdeaProjects\\untitled6\\c.txt");fw.write("爱自己是终生浪漫的开始",4,7);//先按照当前字符集的编码方式进行编码,编码之后找到对应的数据写出fw.close();}
}

void write(char[] c)写出一个字符数组

import java.io.FileWriter;
import java.io.IOException;public class IO {public static void main(String[] args) throws IOException {FileWriter fw = new FileWriter("C:\\Users\\21566\\IdeaProjects\\untitled6\\c.txt");char[] c = {'爱', '自', '己', '是', '终', '生', '浪', '漫', '的', '开', '始'};fw.write(c);//先按照当前字符集的编码方式进行编码,编码之后找到对应的数据写出fw.close();}
}

void write(char[] c,int off, int len)写出一个字符数组的一部分

import java.io.FileWriter;
import java.io.IOException;public class IO {public static void main(String[] args) throws IOException {FileWriter fw = new FileWriter("C:\\Users\\21566\\IdeaProjects\\untitled6\\c.txt");char[] c = {'爱', '自', '己', '是', '终', '生', '浪', '漫', '的', '开', '始'};fw.write(c,4,7);//先按照当前字符集的编码方式进行编码,编码之后找到对应的数据写出fw.close();}
}

FileWriter的书写步骤:

1.创建字符输出流对象

注意点:

1.参数是字符串表示的路径或者File对象都可以

2.如果文件不存在则会创建一个新的文件,但是要保证父级路径是存在的

3.如果文件已经存在,则会在清空文件内的内容之后再写入数据(构造方法中的第二个默认为false的参数是是否续写的选项)

2.写入数据

注意点:虽然write方法的参数是整数,但是实际上写到本地文件中的是整数在字符集上所对应的字符

3.释放资源

注意点:使用完流之后记得释放资源

二.文件拷贝

1.小文件的拷贝

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class IO {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("C:\\Users\\21566\\IdeaProjects\\untitled6\\c.txt");FileOutputStream fos = new FileOutputStream("C:\\Users\\21566\\IdeaProjects\\untitled6\\bbb\\copy.txt");int i;while ((i = fis.read()) != -1) {fos.write(i);}//注意点:先开的流后关闭fos.close();fis.close();}
}

2.大文件的拷贝

在大文件的拷贝中不能使用上面的方式,因为在上面的方式中是一次读取一个字节,速度相当慢,所以我们在大文件的拷贝中需要使用到FileInputStream中一次读取多个字节的方法

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class IO {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("");FileOutputStream fos = new FileOutputStream("");int len;byte[] bytes = new byte[1024 * 1024 * 5];//五兆字节while ((len = fis.read(bytes)) != -1) {//如果不使用len对最后一次的拷贝进行限制,那么就很可能会出现额外拷贝了未被覆盖的数据的情况fos.write(bytes, 0, len);}//注意点:先开的流后关闭fos.close();fis.close();}
}

三.IO流中不同JDK版本捕获异常的方式

注意点:在try...catch异常处理中我们需要在这里使用finally的特性(除非虚拟机停止运行,则finally中的代码一定会被执行),防止字节输出流和字节输入流最终没有关闭,即,将fos.close();和fis.close();写到finally中

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class IO {public static void main(String[] args) {//如果在try中定义则会变为局部变量,导致在之后使用fos和fis时报错,所以放到上面来//并且在初始定义时一定要定义为null,否则会导致在最后关闭fos和fis时报错为:fos和fis可能未定义FileInputStream fis = null;FileOutputStream fos = null;try {fis = new FileInputStream("C:\\Users\\21566\\IdeaProjects\\untitled6\\c.txt");fos = new FileOutputStream("C:\\Users\\21566\\IdeaProjects\\untitled6\\bbb\\copy.txt");int len;byte[] bytes = new byte[2];while ((len = fis.read(bytes)) != -1) {fos.write(bytes, 0, len);}} catch (IOException e) {e.printStackTrace();} finally {if (fos != null) {try {fos.close();} catch (IOException e) {e.printStackTrace();}}if (fis != null) {try {fis.close();} catch (IOException e) {e.printStackTrace();}}}}
}

简化:

我们在简化时需要使用AutoCloseable接口,它的特点是在特定的情况下可以自动释放资源

JDK7的写法:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class IO {public static void main(String[] args) {try (FileInputStream fis = new FileInputStream("C:\\Users\\21566\\IdeaProjects\\untitled6\\c.txt"); FileOutputStream fos = new FileOutputStream("C:\\Users\\21566\\IdeaProjects\\untitled6\\bbb\\copy.txt")) {int len;byte[] bytes = new byte[2];while ((len = fis.read(bytes)) != -1) {fos.write(bytes, 0, len);}} catch (IOException e) {e.printStackTrace();}}
}

JDK9的写法:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class IO {public static void main(String[] args) throws FileNotFoundException {FileInputStream fis = new FileInputStream("C:\\Users\\21566\\IdeaProjects\\untitled6\\c.txt");FileOutputStream fos = new FileOutputStream("C:\\Users\\21566\\IdeaProjects\\untitled6\\bbb\\copy.txt");try (fis; fos) {int len;byte[] bytes = new byte[2];while ((len = fis.read(bytes)) != -1) {fos.write(bytes, 0, len);}} catch (IOException e) {e.printStackTrace();}}
}

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

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

相关文章

聊聊Flink:Docker搭建Flink

一、准备工作 查看下Docker和Docker Compose版本,确保你安装了这些软件。 在 Flink 官网上下载 Flink 的 Docker 镜像。您可以使用以下命令从 Docker Hub 中下载: docker pull flink:1.18.0-scala_2.12 此命令将下载 Flink 1.18.0 版本的 Docker 镜像…

Java23种设计模式-创建型模式之单例模式

单例模式(Singleton Pattern):通过单例模式的方法创建的类在当前进程中只有一个实例(根据需要,也有可能一个线程中属于单例,如:仅线程上下文内使用同一个实例),该类负责创…

电商架构:系统设计+表设计

如有不对,请指正 欢迎评论区交流 需要哪些系统 商品系统、订单系统、权限系统、审核系统等。 商品系统 订单系统 审核系统 权限系统 参考 基于电商中台架构-商品系统设计(一) 附件

2024年【流动式起重机司机】报名考试及流动式起重机司机复审模拟考试

题库来源:安全生产模拟考试一点通公众号小程序 2024年【流动式起重机司机】报名考试及流动式起重机司机复审模拟考试,包含流动式起重机司机报名考试答案和解析及流动式起重机司机复审模拟考试练习。安全生产模拟考试一点通结合国家流动式起重机司机考试…

电脑已经有了一个Windows10,再多装一个Windows10组成双系统

前言 前段时间已经讲过一次双Windows系统的安装教程,但是小白重新去看了一下,发现写的内容太多,怕小伙伴看了之后一脸萌。 所以今天咱们就重新再来讲讲:在同一台机器上安装Windows10双系统的教程。 注意哦!这里的Wi…

Android优化RecyclerView图片展示:Glide成堆加载批量Bitmap在RecyclerView成片绘制Canvas,Kotlin(b)

Android优化RecyclerView图片展示:Glide成堆加载批量Bitmap在RecyclerView成片绘制Canvas,Kotlin(b) 对 Android GridLayoutManager Glide批量加载Bitmap绘制Canvas画在RecyclerView,Kotlin(a)-…

2024人工智能/机器学习/machine learning/CV/NLP重点公式汇总(算法面试考试论文)

### CV # Diffusion Model 扩散模型http://deepnlp.org/equation/diffusion-model-forward-processhttp://deepnlp.org/equation/diffusion-model-forward-process-reparameterizationhttp://deepnlp.org/equation/diffusion-model-reverse-processhttp://deepnlp.org/equation…

【GitHub】主页简历优化

【github主页】优化简历 写在最前面一、新建秘密仓库二、插件卡片配置1、仓库状态统计2、Most used languages(GitHub 常用语言统计)使用细则 3、Visitor Badge(GitHub 访客徽章)4、社交统计5、打字特效6、省略展示小猫 &#x1f…

求解约瑟夫问题

思路: 我们要创建两个指针 有一个指针pcur指向头结点,该pcur作为报数的指针,还有一个指针ptail指向尾结点,作为记录pcur的地址 每报数为m时,pcur指向下一个元素的地址,ptail销毁报数为m的地址&#xff0…

制糖工业智能工厂数字孪生可视化平台,推进制糖产业数字化转型

制糖工业智能工厂数字孪生可视化平台,推进制糖产业数字化转型。随着信息技术的快速发展,数字化转型已成为各行各业的重要趋势。在糖果加工制造领域,智能工厂数字孪生可视化平台的出现,为行业数字化转型注入了新的活力。 糖果加工制…

Java创建对象的最佳方式:单例模式(Singleton)

前言 单例模式是java中最简单的设计模式之一,属于创建式模式,提供了一种创建对象的最佳方式。 具体而言,单例模式涉及到一个具体的类,这个类可以确保只有单个对象被创建。它包含一个访问其唯一对象的方法,供外部直接…

算法训练营day25

零、回溯算法理论 参考链接13.1 回溯算法 - Hello 算法 (hello-algo.com) 1.尝试与回退 之所以称之为回溯算法,是因为该算法在搜索解空间时会采用“尝试”与“回退”的策略。当算法在搜索过程中遇到某个状态无法继续前进或无法得到满足条件的解时,它会…

python应用-socket网络编程(1)

目录 1 先简单回顾下客户端和服务端通信的知识 2 服务端常用函数 3 客户端常用函数 4 服务端和客户端都用的函数 5 示例介绍客户端和服务端通信过程 6 建立服务端套接制 7 创建服务端函数socket.create_server() 8 创建客户端套接字 9 客户端连接函数socket.create_co…

【.net core】【sqlsugar】条件查询时使用Contains的注意问题

在使用sqlsugar条件查询时,条件中如果使用Contains,如果需要自定义条件,需保证类型一致 目标需求:生成 WHERE ([1],[2],[3] like concat(%, concat( concat( [, CAST(orderState AS CHAR)) , ]) ,%)) 为条件的查询语句 //…

在docker中安装paddle serving @FreeBSD(待续)

因为FreeBSD本身不能装paddle serving,所以我们要在docker里面装。 Paddle Serving官网:GitHub - PaddlePaddle/Serving: A flexible, high-performance carrier for machine learning models(『飞桨』服务化部署框架) wheel包下…

JS-事件和日期对象

1.事件流: 1.事件捕获(同类型事件时):从外层到内层;从最顶级的父元素一级一级往下找子元素触发同名事件,直到触发事件的元素为止 事件捕获,只能通过addEventListener并且参数写true才是事件捕获…

基于Springboot的甘肃旅游服务平台(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的甘肃旅游服务平台(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构…

学习周报:文献阅读+Fluent案例+有限体积法理论学习

目录 摘要 Abstract 文献阅读:基于物理信息神经网络的稀疏数据油藏模拟 文献摘要 文章讨论|结论 各方程和原理简介 PINN简介 域分解 实验设置 单相油藏问题 油水两相问题 Fluent实例:Y型弯管中的流体混合分析 几何建模部分 网格划分 求解器设…

获取boss直聘城市地区josn数据

获取boss直聘城市地区josn数据 当我需要爬取多个城市的地区的时候,只能手动点击,然后一个一个看 结果: 能看到所有区域所有子地区的地区代码 解析该JSON数据 import pandas as pd import requests code[] area[] 城市代码101210100 res…

VForm3的文件上传后的一种文件回显方式

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: h…