【Java基础复习】IO流(二)

【Java基础复习】IO流(二)
个人主页https://github.com/zbhgis前言1.之前学过因此本文是个人复习笔记为视频的总结以及个人思考可能不是很详细。2.教程是b站黑马程序员的JAVASE基础课程笔记中的大部分图片来自于视频中的PPT截图。3.Java环境为Java SE 17.0.3.1IntelliJ IDEA版本为2025.2https://www.bilibili.com/video/BV1Cv411372m内容概览1.本文内容主要包括字符集介绍IO流的体系文件字节输入流文件字节输出流以及try语句2.笔记对应视频156-160节更新记录创建时间2025.10 完成初步撰写更新12026.03 补充目录并添加个人github主页链接字符集ASCII字符集使用一个字节存储一个字符首位是0总共可表示128个字符GBK汉字编码字符集一个中文字符使用两个字节存储同时兼容了ASCII字符集首位是1Unicode字符集统一编码容纳世界上所有文字和符号分为UTF-32和UTF-8UTF-8分为四个长度区1个字节2个字节3个字节4个字节。英文字符和数字等只占一个字节Io4.javapackage com.zbhgis.io; import java.io.UnsupportedEncodingException; import java.util.Arrays; public class Io4 { public static void main(String[] args) throws UnsupportedEncodingException { String data 我学Java; byte[] bytes1 data.getBytes(); System.out.println(Arrays.toString(bytes1)); // 这里需要抛出异常 byte[] bytes2 data.getBytes(GBK); System.out.println(Arrays.toString(bytes2)); String s1 new String(bytes1); System.out.println(s1); String s2 new String(bytes2, GBK); System.out.println(s2); } }打印结果[-26, -120, -111, -27, -83, -90, 74, 97, 118, 97] [-50, -46, -47, -89, 74, 97, 118, 97] 我学Java 我学JavaIO流的体系FileInputStream文件字节输入流作用以内存为基准可以把磁盘文件中的数据以字节的形式读入到内存中去。但读取性能较差且不适用于读汉字。aa.txtasdfghjkl;\Io5.javapackage com.zbhgis.io; import java.io.FileInputStream; import java.io.InputStream; public class Io5 { public static void main(String[] args) throws Exception { InputStream is new FileInputStream((E:/AAAfile/gee_bakup/aaa/aa.txt)); // 获取单个字节 int b1 is.read(); System.out.println((char) b1); int b2 is.read(); System.out.println((char) b2); int b3 is.read(); System.out.println((char) b3); // 上述is流未结束 int b; while ((b is.read()) ! -1) { System.out.print((char) b); } System.out.println(); is.close(); // 新的is流 InputStream is2 new FileInputStream((E:/AAAfile/gee_bakup/aaa/aa.txt)); while ((b is2.read()) ! -1) { System.out.print((char) b); } is2.close(); } }打印结果a s d fghjkl;\ asdfghjkl;\一次性读取指定个数或全部字节指定个数字节使用上述api即可全部字节使用下面的方法和apiaa.txtasdfghjkl;\bb.txtasdfghjkl;\ 学java 不想学 Python和Java都学Io6.javapackage com.zbhgis.io; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; public class Io6 { public static void main(String[] args) throws Exception { InputStream is new FileInputStream((E:/AAAfile/gee_bakup/aaa/aa.txt)); // 每次读取多个字节 byte[] buffer new byte[10]; int len is.read(buffer); String rs new String(buffer); System.out.println(rs); System.out.println(当次读取的字节数量 len); int len2 is.read(buffer); // 不做限制 String rs2 new String(buffer); System.out.println(rs2); System.out.println(当次读取的字节数量 len2); // 读取多少就送出多少 String rs3 new String(buffer, 0, len2); System.out.println(rs3); System.out.println(当次读取的字节数量 len2); int lenEnd is.read(buffer); System.out.println(lenEnd); is.close(); System.out.println(); InputStream is2 new FileInputStream((E:/AAAfile/gee_bakup/aaa/aa.txt)); byte[] buf new byte[3]; int size; while ((size is2.read(buf)) ! -1){ String res new String(buf, 0, size); System.out.println(res); } is2.close(); System.out.println(); // 一次性读取文件的全部字节 InputStream is3 new FileInputStream((E:/AAAfile/gee_bakup/aaa/bb.txt)); File f new File(E:/AAAfile/gee_bakup/aaa/bb.txt); long size3 f.length(); byte[] buffer3 new byte[(int) size3]; int len3 is3.read(buffer3); System.out.println(new String(buffer3)); System.out.println(size3); System.out.println(len3); is3.close(); System.out.println(); // 一次性读取文件的全部字节方式二 InputStream is4 new FileInputStream((E:/AAAfile/gee_bakup/aaa/bb.txt)); byte[] buffer4 is4.readAllBytes(); System.out.println(new String(buffer4)); } }打印结果asdfghjkl; 当次读取的字节数量10 \dfghjkl; 当次读取的字节数量2 \ 当次读取的字节数量2 -1 asd fgh jkl ;\ asdfghjkl;\ 学java 不想学 Python和Java都学 53 53 asdfghjkl;\ 学java 不想学 Python和Java都学FileOutputStream文件字节输出流作用以内存为基准把内存中的数据以字节的形式写出到文件中去。Io7.javapackage com.zbhgis.io; import java.io.FileOutputStream; import java.io.OutputStream; public class Io7 { public static void main(String[] args) throws Exception { OutputStream os1 new FileOutputStream(E:/AAAfile/gee_bakup/aaa/cc.txt); OutputStream os2 new FileOutputStream(E:/AAAfile/gee_bakup/aaa/dd.txt, true); os1.write(98); os1.write(b); byte[] bytes China制造.getBytes(); os1.write(bytes); os1.write(bytes,0,11); os1.write(\r\n.getBytes()); os1.close(); os2.write(China制造.getBytes()); os2.write(bytes); os2.write(\r\n.getBytes()); os2.close(); } }结果cc.txtbbChina制造China制造dd.txt运行三次China制造China制造 China制造China制造 China制造China制造文件复制代码实现Io8.javapackage com.zbhgis.io; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; public class Io8 { public static void main(String[] args) throws Exception{ InputStream is new FileInputStream(E:/AAAfile/gee_bakup/aaa/bb.txt); OutputStream os new FileOutputStream(E:/AAAfile/gee_bakup/aaa/ee.txt); byte[] buffer new byte[1024]; int len; while ((len is.read(buffer)) ! -1) { os.write(buffer, 0, len); } os.close(); is.close(); System.out.println(复制完成); } }try-catch/try-withtry-catch-finallytry {​ …​ …} catch (IOException e) {​ e.printStackTrace();} finally {}finally中的代码一定会执行除非JVM终止用于释放资源Io9.javapackage com.zbhgis.io; import java.io.*; public class Io9 { public static void main(String[] args) { InputStream is null; OutputStream os null; try { is new FileInputStream(E:/AAAfile/gee_bakup/aaa/bb.txt); os new FileOutputStream(E:/AAAfile/gee_bakup/aaa/ee.txt); byte[] buffer new byte[1024]; int len; while ((len is.read(buffer)) ! -1) { os.write(buffer, 0, len); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (os ! null) os.close(); } catch (IOException e) { e.printStackTrace(); } try { if (is ! null) is.close(); } catch (IOException e) { e.printStackTrace(); } } } }try-with-resourcetry (资源1, 资源2) {} catch () {}会自动释放try括号中的资源比如流对象自定义资源等实现了AutoCloseable接口的对象MyConnection.javapackage com.zbhgis.io; public class MyConnection implements AutoCloseable{ public void close() throws Exception{ System.out.println(释放资源); } }Io10.javapackage com.zbhgis.io; public class Io10 { public static void main(String[] args) { try ( MyConnection mc new MyConnection(); ) { System.out.println(try); } catch (Exception e) { e.printStackTrace(); } } }打印结果try 释放资源总结1.汉字在不同字符集中所占字节不同2.字节流擅长文件复制其他的交给字符流3.一次性读取全部字节建议使用readAllBytes()4.try释放资源时最好使用try(资源) 的方式减少代码量