2026/4/18 19:19:09
网站建设
项目流程
网站建站公,济南网站建设托管,做律师百度推广的网站,深圳新闻最新事件Java进阶10 IO流
IO流就是数据传输。I为input的缩写#xff0c;表示输入读取#xff1b;O为out的缩写#xff0c;表示输出写出。
一、IO流体系结构巧记区分tips#xff1a;以Stream结尾的是字节流#xff1b;以Reader、Writer结尾的都是字符流
二、字节输出流FileOutputSt…Java进阶10 IO流IO流就是数据传输。I为input的缩写表示输入读取O为out的缩写表示输出写出。一、IO流体系结构巧记区分tips以Stream结尾的是字节流以Reader、Writer结尾的都是字符流二、字节输出流FileOutputStream创建对象的时候和文件建立关联1、构造方法方法说明FileOutputStream(String name)输入流关联文件文件路径以字符串形式给出FileOutputStream(String name,boolean append)第二个参数是追加写入的开关FileOutputStream(File file)输出流关联文件文件路径以File对象形式给出FileOutputStream(File file,boolean append)第二个参数是追加写入的开关**注意事项**关联的文件如果不存在就自动创建若存在会清空现有的内容再开始写入2、成员方法方法说明void write(int b)写出单个字节void write(byte[] b)写出一个字节数组void write(byte[] b,int off,int len)写出字节数组的一部分public class FileOutputStreamDemo1 { ? ?public static void main(String[] args) throws IOException { ? ? ? ?//创建字节输出流对象关联要操作的文件追加写入 ? ? ? ?FileOutputStream fos new FileOutputStream(day10\A.txt,true); ? ? ? ? ?//写入数据 ? ? ? ?fos.write(大家好 .getBytes()); ? ? ? ? ?byte[] bys {97,98,99,100,101}; ? ? ? ?//写入字节数组的一部分 ? ? ? ?fos.write(bys,0,3); ? } }3、关流流对象使用完毕后记得调用close方法关流及时释放资源3.1 关流格式7版本以后//注意try()中的对象需要实现过AutoCloseable接口 try(需要调用close方法的对象){ ? ?逻辑代码 }catch(异常类名 对象名){ ? ?异常的处理方式 } public class FileOutputStreamDemo1 { ? ?/* ? ? ? ? IO流异常标准处理方式JDK7 ? ?*/ ? ?public static void main(String[] args) { ? ? ? ?try( FileOutputStream fos new FileOutputStream(day10\A.txt);){ ? ? ? ? ? ?fos.write(大家好 .getBytes()); ? ? ? }catch (IOException e){ ? ? ? ? ? ?e.printStackTrace(); ? ? ? } ? } }3.2 关流格式7版本以前需要抛异常且需要手动调用close关流public class FileOutputStreamDemo2 { ? ?//抛异常 ? ?public static void main(String[] args) throws IOException { ? ? ? ?//创建字节输出流对象关联要操作的文件追加写入 ? ? ? ?FileOutputStream fos new FileOutputStream(day10\A.txt,true); ? ? ? ? ?//写入数据 ? ? ? ?fos.write(大家好 .getBytes()); ? ? ? ? ? ? ? ?//关流 ? ? ? ?fos.close(); ? } }三、字节输入流FileInputStream创建对象的时候关联文件文件不存在会抛异常1、构造方法方法说明FileInputStream(String name)输入流关联文件文件路径以字符串形式给出FileInputStream(File file)输入流关联文件文件路径以File对象形式给出public String(byte[] bytes,int offset,int length)将字节数组转换为字符串参数1 字节数组参数2 起始索引参数3 转换的个数**注意事项**关联的文件不存在会抛出FileNotFoundException异常文件夹的话会拒绝访问2、成员方法方法说明int read()读取一个字节并返回如果到达文件结尾则返回-1int read(byte[] b)将读取到字节放到传入的数组返回读取到的有效字节个数。如果到达文件结尾则返回-1public class FileInputStreamDemo1 { ? ?public static void main(String[] args) { ? ? ? ?try(FileInputStream fis new FileInputStream(day10\A.txt);){ ? ? ? ? ? ?//提升变量i的作用域 ? ? ? ? ? ?int i; ? ? ? ? ? ?//判断是否到达文件的末尾 ? ? ? ? ? ?while((ifis.read())!-1){ ? ? ? ? ? ? ? ?System.out.print((char)i); ? ? ? ? ? } ? ? ? }catch(IOException e){ ? ? ? ? ? ?e.printStackTrace(); ? ? ? } ? } }四、字节缓冲流字节缓冲流在源代码中内置了字节数组可以提高读写效率构造方法说明BufferedInputStream(InputStream in)对传入的字节输入流进行包装BufferedOutputStream(OutputStream out)对传入的字节输出流进行包装**注意**缓冲流不具备读写功能它们只是对普通的流对象进行包装正真和文件建立关联的还是普通的流对象字节缓冲流读写过程文件拷贝效率分析结论推荐使用普通流自定义数组拷贝五、字符输入流FileReader用于读取纯文本文件解决中文乱码问题1、构造方法方法说明FileReader(String fileName)字符输入流关联文件路径以字符串形式给出FileReader(File file)字符输入流关联文件路径以File对象形式给出2、成员方法方法说明public intread()读取单个字符public intread(char[] cbuf)读取一个字符数组返回读取到的有效字符个数3、字符集字符编码3.1 字符集多个字符的集合GB2312字符集1981年5月1日实施的简体中文汉字编码国家标准收录7445个图形字符其中包括6763个简体汉字BIG5字符集台湾地区繁体中文标准字符集共收录13053个中文字1984年实施GBK字符集2000年3月17日发布收录21003个汉字包含国家标准GB13000-1中的全部中日韩汉字和BIG5编码中的所有汉字Windows系统默认使用的就是GBK,在系统里显示为ANSIUnicode字符集国际标准字符集它将世界各种语言的每个字符定义一个唯一的编码以满足跨语言、跨平台的文本信息转换3.2 字符编码字符编码是一种映射规则根据这个规则可以将某个字符映射成其他形式的数据以便在计算机中存储和传输。GBK的字符编码英文字符占用1个字节中文字符占用2个字节Unicode(Unicode Transfer Format)UTF-16编码规则用2~4个字节保存UTF-32编码规则固定使用4个字节保存UTF-8编码规则用1~4个字节保存ASCII码表中的都用1个字节存简体中文都用3个字节存细节中文字节都是负数FileReader字符输入流读取纯文本文件时解决中文乱码问题就是因为其底层还是有字节数组如果读取到负数表示的字节数系统就知道遇到了中文会一次性拿出三个进行解码。4、编码和解码4.1 编码字符转字节成员方法说明public btye[] getBytes()使用平台默认字符编码方式对字符串编码public byte[] getBytes(String charsetName)使用指定字符编码方式对字符串编码4.2 解码字节转字符构造方法说明public String(byte[] bytes)使用平台默认字符编码方式对字符串解码public String(byte[] bytes,String charsetName)使用指定字符编码方式对字符串解码4.3 文件加密和解密Demopublic class ImageTest { ? ?/* ? ? ? ?需求对图片加密、解密 ? ? ? ? ? ? 加密(改变原始文件中的字节就无法打开了); ? ? ? ? ? ? ? 解密(将文件中的字节还原成原始字节即可); ? ?*/ ? ?public static void main(String[] args) throws IOException { ? ? ? ?//1、创建一个字节输入流读取要加密的图片 ? ? ? ?FileInputStream fis new FileInputStream(D:\itheima\src.png); ? ? ? ?//2、准备集合用于存储读取到的字节(备份) ? ? ? ?ArrayListInteger list new ArrayList(); ? ? ? ?//3、循环读取图片中的字节 ? ? ? ?int i; ? ? ? ?while((ifis.read())!-1){ ? ? ? ? ? ?//4、将读取到的字节存入集合 ? ? ? ? ? ?list.add(i); ? ? ? } ? ? ? ?//5、关闭输入流 ? ? ? ?fis.close(); ? ? ? ?//6、创建一个字节输出流准备写出数据因为是加密所以写出路径与读取路径相同 ? ? ? ?FileOutputStream fos new FileOutputStream(D:\itheima\src.png); ? ? ? ?//7、遍历集合取出字节 ? ? ? ?for (Integer pngByte : list) { ? ? ? ? ? ?//8、改变字节写出数据(加密) ? ? ? ? ? ?fos.write(pngByte^2); ? ? ? } ? ? ? ?//9、关闭输出流 ? ? ? ?fos.close(); ? } }注意**因为对某个数做两次异或操作还是等于它本身。**所以上述代码运行一次异或即加密再运行一次字节数变回原值即解密。六、字符输出流FileWriter1、构造方法方法说明FileWirter(String fileName)字符输出流关联文件路径以字符串形式给出FileWriter(String fileName,boolean append)参数2追加写入的开关FileWriter(File file)字符输出流关联文件路径以File对象形式给出FileWriter(File file,boolean append)参数2追加写入的开关2、成员方法方法说明public void write(int c)写出单个字符public void write(char[] cbuf)写出一个字符数组public write(char[] cbuf,int off,int len)写出字符数组的一部分public void write(String str)写出字符串public void write(String str,int off,int len)写出字符串的一部分注意字符输出流写出数据需要调用flush或close方法数据才会写出。flush后可以继续写出close后不能继续写出