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. 04-MyBatisPlus条件构造器

    一.wapper介绍 Wrapper : 条件构造抽象类,最顶端父类 AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件 QueryWrapper : Entit ...

  2. java script 日常学习 正则表达式

    <!DOCTYPE html><html><head> <title>函数的运用</title> <meta charset=&quo ...

  3. python基础__十大经典排序算法

    用Python实现十大经典排序算法! 排序算法是<数据结构与算法>中最基本的算法之一.排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大, ...

  4. 通过 Traefik 使用 Kubernetes Service APIs 进行流量路由 (http,https,金丝雀发布)

    文章转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247490229&idx=1&sn=ca817054 ...

  5. 迁移阿里云上的ECS操作说明

    背景: 1.公司测试服务器快要到期了,但是续费太贵,就想用另一个阿里云账号下的服务器作为测试服务器. 2.测试服务器原在阿里云账号A下,要迁移到阿里云账号B下 3.该测试服务器有一个系统盘和俩数据盘 ...

  6. vivo 公司 Kubernetes 集群 Ingress 网关实践

    文章转载自:https://mp.weixin.qq.com/s/qPqrJ3un1peeWgG9xO2m-Q 背景 vivo 人工智能计算平台小组从 2018 年底开始建设 AI 计算平台至今,已经 ...

  7. Docker安装部署Rancher

    # 一.Rancher简介 [Rancher](https://www.cnrancher.com/rancher/)是一个开源的企业级容器管理平台.通过Rancher,企业再也不必自己使用一系列的开 ...

  8. 内网横向渗透 之 ATT&CK系列一 之 拿下域控制器

    信息收集 信息收集 域控制器的相关信息: 通过arp扫描发现域控制器的ip地址为:192.168.52.138,尝试使用msf的smb_login模块登录smb是否成功 1 search smb_lo ...

  9. Spring让人眼前一亮的11个小技巧

    前言 我们一说到spring,可能第一个想到的是 IOC(控制反转) 和 AOP(面向切面编程). 没错,它们是spring的基石,得益于它们的优秀设计,使得spring能够从众多优秀框架中脱颖而出. ...

  10. Vue 中为什么要有nextTick?

    摘要:本文将浅析nextTick的作用.使用场景和背后的原理实现,希望对大家有所帮助. 本文分享自华为云社区<Vue 中的 nextTick 有什么作用?>,作者:CoderBin. 一. ...