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流的更多相关文章

  1. 基于JavaSE阶段的IO流详解

    1.IO流基本概述 在Java语言中定义了许多针对不同的传输方式,最基本的就是输入输出流(俗称IO流),IO流是属于java.io包下的内容,在JavaSE阶段主要学下图所示的: 其中从图中可知,所有 ...

  2. JAVASE(十六) IO流 :File类、节点流、缓冲流、转换流、编码集、对象流

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.File类型 1.1.File类的理解 File类是在java.io包下 File可以理解成一个文件 ...

  3. JavaSE复习_11 IO流复习

    △FileReader是使用默认码表读取文件, 如果需要使用指定码表读取, 那么可以使用InputStreamReader(字节流,编码表)    FileWriter是使用默认码表写出文件, 如果需 ...

  4. IO流回顾与总结第一篇之字节流与字符流的操作。。。。。

    一.引言 趁着年后的这点时间,抓紧点时间回顾下javase中的IO流,以往都是用到那些常用的IO类,这次来个全点的,有不对的地方还请大神指正一下,做到坚持写博的习惯来...... 回归正题,IO流顾名 ...

  5. JavaSE学习笔记(14)---File类和IO流(字节流和字符流)

    JavaSE学习笔记(14)---File类和IO流(字节流和字符流) File类 概述 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. 构造方 ...

  6. Java进阶 | IO流核心模块与基本原理

    一.IO流与系统 IO技术在JDK中算是极其复杂的模块,其复杂的一个关键原因就是IO操作和系统内核的关联性,另外网络编程,文件管理都依赖IO技术,而且都是编程的难点,想要整体理解IO流,先从Linux ...

  7. JavaSE(一) IO类层次关系和各种IO流的用法总结

    今天把IO流的这一知点进行一下总结,因为在之前使用io流的时候,就只知道几个重点常用的IO类,比如FileInputStream,BufferedInputStream(缓冲流)等等,但是不知道它处于 ...

  8. JavaSE(十二)之IO流的字节流(一)

    前面我们学习的了多线程,今天开始要学习IO流了,java中IO流的知识非常重要.但是其实并不难,因为他们都有固定的套路. 一.流的概念     流是个抽象的概念,是对输入输出设备的抽象,Java程序中 ...

  9. JavaSE | IO流

    java.io.File类(文件和目录路径名的抽象表示形式) 如果希望在程序中操作文件和目录都可以通过File类来完成,File类能新建.删除.重命名文件和目录. File类是文件或目录的路径,而不是 ...

  10. JavaSE学习总结(十七)—— IO流

    一.IO流概要 1.1.概念 开发中经常要进行输入输出操作,掌握Java中的IO流显得非常必要. 流(stream)的概念源于UNIX中管道(pipe)的概念.在UNIX中,管道是一条不间断的字节流, ...

随机推荐

  1. Java 热更新 Groovy 实践及踩坑指南

    Groovy 是什么? Apache的Groovy是Java平台上设计的面向对象编程语言.这门动态语言拥有类似Python.Ruby和Smalltalk中的一些特性,可以作为Java平台的脚本语言使用 ...

  2. 为中小企业打造的数字化采购SaaS平台的特点与必要性

    ​激烈的市场竞争.复杂的国际环境.以及疫情的常态化将企业的供应链推向风口浪尖.供应链管理(SCM, Supply Chain Management).供应商关系管理(SRM,Supplier Rela ...

  3. 《Win10——常用快捷键》

    Win10--常用快捷键       Ctrl+C:复制 Ctrl+V:粘贴 Ctrl+A:全选 Ctrl+X:剪切 Ctrl+D:删除 Ctrl+Z:撤销 Ctrl+Y:反撤销 Ctrl+Shift ...

  4. K8s nginx-ingress 如何配置二级目录转发远程静态服务器基于Vue路由history模式打包的应用程序

    背景 首先这标题有点绕,我先解释下: 首先我们有静态服务器,上面某个目录有Vue路由history模式打包的应用程序(也就是build后的产物): 但是静态服务器一般不做对外域名用的,我们需要在k8s ...

  5. kubernetes1.20 部署 traefik2.3

    一.概述 Traefik 是一个开源的可以使服务发布变得轻松有趣的边缘路由器.它负责接收你系统的请求,然后使用合适的组件来对这些请求进行处理. 除了众多的功能之外,Traefik 的与众不同之处还在于 ...

  6. 记录阿里云安全组设置遇到的奇葩问题--出口ip

    之前公司使用的路由器里使用的是PPPOE拨号的形式上网的,根据拨号后得到的ip地址,配置到阿里云的安全组里,具体来说是配置到22端口里,也就是说只有特定ip才能访问22端口,也即是说只允许公司网络远程 ...

  7. Java之POI导出Excel(二):多个sheet

    相信在大部分的web项目中都会有导出导入Excel的需求,之前我也写过一篇导出单个sheet工作表的文章,没看过的小伙伴可以去看哈,链接也给大家放出来了:导出单个sheet 但是在我们日常的工作中,需 ...

  8. 【nginx】使用 nginx 时,使用 sub_filter 注入 js 代码,例如 google analysis 等

    目录 1. 创建 GA 1 2. 注入代码2 结果 网站 F12 GA 控制台 Reference 在一项工作中,已经将内网的一个网站通过 二级域名 + nginx + frp 的方式映射到公网.网站 ...

  9. 【机器学习】利用 Python 进行数据分析的环境配置 Windows(Jupyter,Matplotlib,Pandas)

    环境配置 安装 python 博主使用的版本是 3.10.6 在 Windows 系统上使用 Virtualenv 搭建虚拟环境 安装 Virtualenv 打开 cmd 输入并执行 pip inst ...

  10. A-卷积网络压缩方法总结

    卷积网络的压缩方法 一,低秩近似 二,剪枝与稀疏约束 三,参数量化 四,二值化网络 五,知识蒸馏 六,浅层网络 我们知道,在一定程度上,网络越深,参数越多,模型越复杂,其最终效果越好.神经网络的压缩算 ...