javaSE--核心之一:IO流
Java IO流框架结构:
IO的主要内容包括输入、输出两种IO流,这两种流中又分为字节流和字符流,字节流是以字节为单位来处理输入、输出流,而字符流是以字符为单位来处理输入、输出流。
InputStream 类:
public abstract int read() 读取数据
public int read(byte b[]) 将读取到的数据放在 byte 数组中,该方法实际上是根据下面的方法实现的,off 为 0,len 为数组的长度
public int read(byte b[], int off, int len) 从第 off 位置读取 len 长度字节的数据放到 byte 数组中,流是以 -1 来判断是否读取结束的(注意这里读取的虽然是一个字节,但是返回的却是 int 类型 4 个字节,这里当然是有原因,这里就不再细说了,推荐这篇文章,链接)
public long skip(long n) 跳过指定个数的字节不读取,想想看电影跳过片头片尾
public int available() 返回可读的字节数量
public void close() 读取完,关闭流,释放资源
public synchronized void mark(int readlimit) 标记读取位置,下次还可以从这里开始读取,使用前要看当前流是否支持,可以使用 markSupport() 方法判断
public synchronized void reset() 重置读取位置为上次 mark 标记的位置
public boolean markSupported() 判断当前流是否支持标记流,和上面两个方法配套使用
OutputStream 类:
1 public abstract void write(int b) 写入一个字节,可以看到这里的参数是一个 int 类型,对应上面的读方法,int 类型的 32 位,只有低 8 位才写入,高 24 位将舍弃。
2 public void write(byte b[]) 将数组中的所有字节写入,和上面对应的 read() 方法类似,实际调用的也是下面的方法。
3 public void write(byte b[], int off, int len) 将 byte 数组从 off 位置开始,len 长度的字节写入
4 public void flush() 强制刷新,将缓冲中的数据写入
5 public void close() 关闭输出流,流被关闭后就不能再输出数据了
Reader 类:
1 public int read(java.nio.CharBuffer target) 读取字节到字符缓存中
2 public int read() 读取单个字符
3 public int read(char cbuf[]) 读取字符到指定的 char 数组中
4 abstract public int read(char cbuf[], int off, int len) 从 off 位置读取 len 长度的字符到 char 数组中
5 public long skip(long n) 跳过指定长度的字符数量
6 public boolean ready() 和上面的 available() 方法类似
7 public boolean markSupported() 判断当前流是否支持标记流
8 public void mark(int readAheadLimit) 标记读取位置,下次还可以从这里开始读取,使用前要看当前流是否支持,可以使用 markSupport() 方法判断
9 public void reset() 重置读取位置为上次 mark 标记的位置
10 abstract public void close() 关闭流释放相关资源
Writer 类:
1 public void write(int c) 写入一个字符
2 public void write(char cbuf[]) 写入一个字符数组
3 abstract public void write(char cbuf[], int off, int len) 从字符数组的 off 位置写入 len 数量的字符
4 public void write(String str) 写入一个字符串
5 public void write(String str, int off, int len) 从字符串的 off 位置写入 len 数量的字符
6 public Writer append(CharSequence csq) 追加吸入一个字符序列
7 public Writer append(CharSequence csq, int start, int end) 追加写入一个字符序列的一部分,从 start 位置开始,end 位置结束
8 public Writer append(char c) 追加写入一个 16 位的字符
9 abstract public void flush() 强制刷新,将缓冲中的数据写入
10 abstract public void close() 关闭输出流,流被关闭后就不能再输出数据了
字节流:文件读写:
字节流:一次读取一个字节
// 测试文件大小:2087KB
// 普通字节流,一次读取一个字节
public static void ioOption() throws IOException { // 获取文件 字节输入流,如果文件不存在抛出异常
FileInputStream fis = new FileInputStream(new File("D:/demo.txt"));
// 获取文件 字节输出流,如果文件不存在自动创建文件
FileOutputStream fos = new FileOutputStream(new File("D:/copy.txt")); int len;
// 一次读取一个字节
// len 表示读取到的字节数,如果没有数据则返回 -1
while ((len = fis.read())!= -1){
fos.write(len);
} fis.close();
fos.close();
}
// 测试文件大小:2087KB
// 缓冲字节流,一次读取一个字节
public static void ioOption() throws IOException { // 获取文件 字节输入流,如果文件不存在抛出异常
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File("D:/demo.txt")));
// 获取文件 字节输出流,如果文件不存在自动创建文件
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File("D:/copy.txt"))); int len;
// 一次读取一个字节
// len 表示读取到的字节数,如果没有数据则返回 -1
while ((len = bis.read())!= -1){
bos.write(len);
} bis.close();
bos.close(); }
一次读一个不实用:读写全部的::
1 // 测试文件大小:2087KB
2 public static void ioOption() throws IOException {
3
4 // 获取文件 字节输入流,如果文件不存在抛出异常
5 FileInputStream fis = new FileInputStream(new File("D:/demo.txt"));
6 // 获取文件 字节输出流,如果文件不存在自动创建文件
7 FileOutputStream fos = new FileOutputStream(new File("D:/copy.txt"));
8 // 字节数组
9 byte[] bytes = new byte[fis.available()];
10
11 int len = 0;
12 // 一次读取一个 bytes 大小的数据
13 // len 表示读取到的字节数,如果没有数据则返回 -1
14 while ((len = fis.read(bytes))!= -1){
15 fos.write(bytes,0,len);
16 }
17
18 fis.close();
19 fos.close();
20
21 }
图片写入:
//字节流方法
public static void copyFile()throws IOException { //1.获取目标路径
//(1)可以通过字符串
// String srcPath = "C:\\Users\\bg\\Desktop\\截图笔记\\11.jpg";
// String destPath = "C:\\Users\\bg\\Desktop\\图片备份\\11.jpg"; //(2)通过文件类
File srcPath = new File("C:\\Users\\bg\\Desktop\\截图笔记\\22.PNG");
File destPath = new File("C:\\Users\\bg\\Desktop\\图片备份\\22.PNG"); //2.创建通道,依次 打开输入流,输出流
FileInputStream fis = new FileInputStream(srcPath);
FileOutputStream fos = new FileOutputStream(destPath); byte[] bt = new byte[1024]; //3.读取和写入信息(边读取边写入)
while (fis.read(bt) != -1) {//读取
fos.write(bt);//写入
} //4.依次 关闭流(先开后关,后开先关)
fos.close();
fis.close();
}
更加全的图片复制:
//以复制图片为例,实现try{ }cater{ }finally{ } 的使用
public static void test(){
//1.获取目标路径
File srcPath = new File("C:\\Users\\bg\\Desktop\\截图笔记\\55.PNG");
File destPath = new File("C:\\Users\\bg\\Desktop\\图片备份\\55.PNG");
//2.创建通道,先赋空值
FileInputStream fis = null;
FileOutputStream fos = null;
//3.创建通道时需要抛出异常
try {
fis = new FileInputStream(srcPath);
fos = new FileOutputStream(destPath); byte[] bt = new byte[1024];
//4.读取和写入数据时需要抛出异常
try {
while(fis.read(bt) != -1){
fos.write(bt);
}
} catch (Exception e) {
System.out.println("储存盘异常,请修理");
throw new RuntimeException(e);
} } catch (FileNotFoundException e) {
System.out.println("资源文件不存在");
throw new RuntimeException(e);
}finally{ //5.无论有无异常,需要关闭资源(分别抛出异常)
try {
fos.close();
} catch (Exception e) {
System.out.println("资源文件或目标文件关闭失败!");
throw new RuntimeException(e);
} try {
fis.close();
} catch (IOException e) {
System.out.println("资源文件或目标文件关闭失败!");
throw new RuntimeException(e);
} }
}
javaSE--核心之一:IO流的更多相关文章
- 基于JavaSE阶段的IO流详解
1.IO流基本概述 在Java语言中定义了许多针对不同的传输方式,最基本的就是输入输出流(俗称IO流),IO流是属于java.io包下的内容,在JavaSE阶段主要学下图所示的: 其中从图中可知,所有 ...
- JAVASE(十六) IO流 :File类、节点流、缓冲流、转换流、编码集、对象流
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 1.File类型 1.1.File类的理解 File类是在java.io包下 File可以理解成一个文件 ...
- JavaSE复习_11 IO流复习
△FileReader是使用默认码表读取文件, 如果需要使用指定码表读取, 那么可以使用InputStreamReader(字节流,编码表) FileWriter是使用默认码表写出文件, 如果需 ...
- IO流回顾与总结第一篇之字节流与字符流的操作。。。。。
一.引言 趁着年后的这点时间,抓紧点时间回顾下javase中的IO流,以往都是用到那些常用的IO类,这次来个全点的,有不对的地方还请大神指正一下,做到坚持写博的习惯来...... 回归正题,IO流顾名 ...
- JavaSE学习笔记(14)---File类和IO流(字节流和字符流)
JavaSE学习笔记(14)---File类和IO流(字节流和字符流) File类 概述 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. 构造方 ...
- Java进阶 | IO流核心模块与基本原理
一.IO流与系统 IO技术在JDK中算是极其复杂的模块,其复杂的一个关键原因就是IO操作和系统内核的关联性,另外网络编程,文件管理都依赖IO技术,而且都是编程的难点,想要整体理解IO流,先从Linux ...
- JavaSE(一) IO类层次关系和各种IO流的用法总结
今天把IO流的这一知点进行一下总结,因为在之前使用io流的时候,就只知道几个重点常用的IO类,比如FileInputStream,BufferedInputStream(缓冲流)等等,但是不知道它处于 ...
- JavaSE(十二)之IO流的字节流(一)
前面我们学习的了多线程,今天开始要学习IO流了,java中IO流的知识非常重要.但是其实并不难,因为他们都有固定的套路. 一.流的概念 流是个抽象的概念,是对输入输出设备的抽象,Java程序中 ...
- JavaSE | IO流
java.io.File类(文件和目录路径名的抽象表示形式) 如果希望在程序中操作文件和目录都可以通过File类来完成,File类能新建.删除.重命名文件和目录. File类是文件或目录的路径,而不是 ...
- JavaSE学习总结(十七)—— IO流
一.IO流概要 1.1.概念 开发中经常要进行输入输出操作,掌握Java中的IO流显得非常必要. 流(stream)的概念源于UNIX中管道(pipe)的概念.在UNIX中,管道是一条不间断的字节流, ...
随机推荐
- Gitea 与 Jenkins 的集成实践,打造你的专属 CI/CD 系统
前言 Gitea 是一个用于代码托管的轻量级单体程序,它能与现有的经典应用集成,诸如代码分析工具 SonarQube.持续集成工具 Drone.Jenkins 以及用于工单管理的客户端插件(VSCod ...
- typora收费了,最后一个免费版提供下载
typora收费了,在这里,博主提供最后一个免费版下载,地址如下,顺便把typora导入和导出word时需要的工具也一同提供.最看不惯免费用着别人的软件,还搞引流的垃圾网站和公众号.地址如下 http ...
- ProxySQL(9):ProxySQL的查询缓存功能
文章转载自: https://www.cnblogs.com/f-ck-need-u/p/9314459.html ProxySQL支持查询缓存的功能,可以将后端返回的结果集缓存在自己的内存中,在某查 ...
- kubeadm join 命令执行流程
- 从Kubernetes Event中提取有效信息
- 使用docker-compose部署Django项目
先从最基本的功能开始 在一切工作开始前,需要先编辑好三个必要的文件. 第一步,因为应用将要运行在一个满足所有环境依赖的 Docker 容器里面,那么我们可以通过编辑 Dockerfile 文件来指定 ...
- 24_Java8
Java8 一. Java8概述 Java8(又称JDK1.8)是Java语言开发的一个主要版本. Oracle公司于2014年3月18日发布Java8 支持Lambda表达式 函数式接口 新的Str ...
- DeepHyperX代码理解-HamidaEtAl
代码复现自论文<3-D Deep Learning Approach for Remote Sensing Image Classification> 先对部分基础知识做一些整理: 一.局 ...
- 工厂数字化转型离不开 MES 的原因是什么?
工厂数字化转型是离不开 MES,首先得弄清楚什么是工厂数字化转型.什么是MES,它们的关系是怎样的. 数字化的主要含义是构建"业务数字化.数字资产化.资产服务化.服务业务化"闭环, ...
- vite vue3 规范化与Git Hooks
在 <JS 模块化>系列开篇中,曾提到前端技术的发展不断融入很多后端思想,形成前端的"四个现代化":工程化.模块化.规范化.流程化.在该系列文章中已详细介绍了模块化的发 ...