Day13-Java进阶-IO字节流及其练习题

2024-04-24 01:20

本文主要是介绍Day13-Java进阶-IO字节流及其练习题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. IO流介绍

2. IO 流体系结构

字节流读取纯文本文件会出现乱码问题

2.1 FileOutputStream 字节输出流

package com.itheima.stream.output;import java.io.FileOutputStream;
import java.io.IOException;public class FileOutputStreamDemo3 {/*IO流的异常处理方式: jdk7版本之前*/public static void main(String[] args) {FileOutputStream fos = null;try {fos = new FileOutputStream("D:\\B.txt");fos.write("abc".getBytes());} catch (IOException e) {e.printStackTrace();} finally {if(fos != null){try {fos.close();} catch (IOException e) {e.printStackTrace();}}}}
}

2.2 FileInputStream 字节输入流

package com.itheima.stream.input;import java.io.FileInputStream;
import java.io.IOException;public class FileInputStreamDemo1 {/*字节流读取数据public int read() : 读取单个字节*/public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("D:\\A.txt");int i;while ((i = fis.read()) != -1) {System.out.println((char) i);}fis.close();}
}

package com.itheima.stream.input;import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;public class FileInputStreamDemo2 {/*字节流读取数据public int read(byte[] bys) : 读取一个字节数组- 将读取到的字节, 存入数组容器, 返回读取到的有效字节个数*/public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("D:\\A.txt");// 准备菜篮子, 用于装(字节)byte[] bys = new byte[2];int len;while( (len = fis.read(bys)) != -1 ){String s = new String(bys, 0, len);System.out.print(s);}fis.close();}
}

2.3 综合案例

package com.itheima.stream;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class CopyTest1 {/*将 D:\嘿嘿.png,拷贝到 E:\ 根目录下分析:1. 创建输入流对象读取文件2. 创建输出流对象关联数据目的3. 读写操作4. 关流释放资源*/public static void main(String[] args) throws IOException {
/*        // 1. 创建输入流对象读取文件FileInputStream fis = new FileInputStream("D:\\猫咪.jpg");// 2. 创建输出流对象关联数据目的FileOutputStream fos = new FileOutputStream("E:\\猫咪.jpg");// 3. 读写操作byte[] bys = new byte[1024];int len;while( (len = fis.read(bys)) != -1){fos.write(bys, 0, len);}// 4. 关流释放资源fis.close();fos.close();*/// 1. 创建输入流对象读取文件FileInputStream fis = new FileInputStream("D:\\猫咪.jpg");// 2. 创建输出流对象关联数据目的FileOutputStream fos = new FileOutputStream("D:\\test\\猫咪.jpg");// 3. 读写操作byte[] bytes = new byte[1024];int len;while((len = fis.read(bytes))!=-1){fos.write(bytes,0,len);}// 4. 关流释放资源fis.close();fos.close();}
}

3. 字节缓冲流-(时间问题~暂时省略~)

4. 字符流介绍

4.1 FileReader 字符输入流

package com.itheima.stream.character.reader;import java.io.FileReader;
import java.io.IOException;public class FileReaderDemo1 {/*FileReader: 用于读取纯文本文件,解决中文乱码问题构造方法:1. public FileReader(String fileName) 字符输入流关联文件,路径以字符串形式给出2. public FileReader(File file) 字符输入流关联文件,路径以File对象形式给出成员方法:public int read() : 读取单个字符public int read(char[] cbuf) : 读取一个字符数组, 返回读取到的有效字符个数*/public static void main(String[] args) throws IOException {FileReader fr = new FileReader("D:\\A.txt");char[] chs = new char[1024];int len;// 读取多个字符while( (len = fr.read(chs)) != -1 ){String s = new String(chs, 0, len);System.out.println(s);}fr.close();}/*** 读取单个字符*/private static void method() throws IOException {FileReader fr = new FileReader("D:\\A.txt");int i;while ((i = fr.read()) != -1) {System.out.print((char)i);}fr.close();}
}

4.2 字符集与字符编码

package com.itheima.stream.character;import java.io.IOException;
import java.util.Arrays;public class StringDemo {/*平台默认字符编码 : Unicode - UTF-8的形式重点记忆: 中文字符, 通常都是由负数的字节进行组成的.特殊情况: 可能会出现正数, 但是就算有正数, 第一个字节肯定是负数注意事项: 今后如果出现乱码问题, 大概率是因为编解码方式不一致所导致的.编码: 字符转字节public byte[] getBytes() : 使用平台默认字符编码方式, 对字符串编码public byte[] getBytes(String charsetName) : 使用使用字符编码方式, 对字符串编码解码: 字节转字符public String(byte[] bytes) : 使用平台默认字符编码方式, 对字符串解码public String(byte[] bytes, String charsetName) : 使用使用字符编码方式, 对字符串解码*/public static void main(String[] args) throws IOException {String s = "你好,你好";byte[] bytes = s.getBytes();System.out.println(Arrays.toString(bytes));byte[] gbks = s.getBytes("gbk");System.out.println(Arrays.toString(gbks));System.out.println("----------------------------");byte[] utf8Bytes = {-28, -67, -96, -27, -91, -67, 44, -28, -67, -96, -27, -91, -67};byte[] gbkBytes = {-60, -29, -70, -61, 44, -60, -29, -70, -61};String s1 = new String(gbkBytes, "GBK");System.out.println(s1);}
}

4.3 FileWriter 字符输出流

package com.itheima.stream.character.writer;import java.io.FileWriter;
import java.io.IOException;public class FileWriterDemo1 {/*FileWriter字符输出流写出数据 :构造方法:FileWriter(String fileName):                         字符输出流关联文件,路径以字符串形式给出FileWriter(String fileName, boolean append):         参数2: 追加写入的开关FileWriter(File file):                               字符输出流关联文件,路径以File对象形式给出FileWriter(File file, boolean append):               参数2: 追加写入的开关成员方法:public void write(int c)                             写出单个字符public void write(char[] cbuf)                       写出一个字符数组public void write(char[] cbuf, int off, int len)     写出字符数组的一部分public void write(String str)                        写出字符串public void write(String str, int off, int len)      写出字符串的一部分*/public static void main(String[] args) throws IOException {FileWriter fw = new FileWriter("D:\\C.txt");char[] chs = {'a','b','c'};fw.write('a');fw.write(chs);fw.write(chs, 0, 2);fw.write("你好你好~");fw.write("哈哈哈哈哈", 0, 2);fw.close();}
}

package com.itheima.stream.character.writer;import java.io.FileWriter;
import java.io.IOException;public class FileWriterDemo2 {/*注意事项: 字符输出流写出数据, 需要调用flush或close方法, 数据才会写出flush() : 刷出数据, 刷出后可以继续写出close() : 关闭流释放资源, 顺便刷出数据, 关闭后不可以继续写出*/public static void main(String[] args) throws IOException {FileWriter fw = new FileWriter("D:\\D.txt");fw.write("人活一世, 草木一秋");fw.write("\r\n");fw.write("今晚不减肥, 我要吃肉!");fw.close();}
}

5. IO 流-练习题

5.1 案例1-图片文件加解密

package com.itheima.stream;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;public class ImageTest {/*图片文件加密解密加密思路:改变原始文件中的字节,就无法打开了字节 ^ 2解密思路:将文件中的字节还原成原始字节即可字节 ^ 2*/public static void main(String[] args) throws IOException {// 1. 创建字节输入流对象, 关联要加密的图片FileInputStream fis = new FileInputStream("D:\\A.jpg");// 2. 创建一个集合容器, 用于存取读到的字节(为便于不用考虑容器长度大小, 使用集合)ArrayList<Integer> list = new ArrayList<>();// 3. 循环读取文件的字节, 并存入集合int i;while((i = fis.read()) != -1){list.add(i);}// 4. 关闭输入流fis.close();// 5. 创建字节输出流对象, 关联图片文件FileOutputStream fos = new FileOutputStream("D:\\A.jpg");// 6. 遍历集合, 从集合中取出字节, 并写入for (Integer myByte : list) {fos.write(myByte ^ 2);}// 7. 关闭输出流fos.close();}
}

5.2 案例2-统计字符次数

package com.itheima.stream;import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.function.BiConsumer;public class CharacterTest {/*统计文件中每一个字符出现的次数,随后展示在控制台效果:A(1)B(2)C(3)*/public static void main(String[] args) throws IOException {// 1. 准备map集合, 用于统计每个字符出现的次数HashMap<Character, Integer> hm = new HashMap<>();// 2. 创建字符输入流读取纯文本文件FileReader fr = new FileReader("D:\\info.txt");// 3. 将每个字符存入集合int i;while ((i = fr.read()) != -1){char c = (char) i;// 4. 统计每个字符出现的个数if (!hm.containsKey(c)){hm.put(c, 1);} else {hm.put(c, hm.get(c) + 1);}}// 5. 关闭输入流fr.close();// 6. 准备StringBuild对字符进行拼接操作StringBuilder sb = new StringBuilder();hm.forEach(new BiConsumer<Character, Integer>() {@Overridepublic void accept(Character key, Integer value) {sb.append(key).append("(").append(value).append(")");}});System.out.println(sb);}
}

5.3-案例3-文件夹拷贝

package com.itheima.stream;import java.io.*;public class CopyDirTest {/*拷贝一个文件夹, 考虑子文件夹将D:\\test文件夹, 拷贝到E:\\*/public static void main(String[] args) throws IOException {File src = new File("D:\\test");File dest = new File("E:\\");if (src.equals(dest)) {System.out.println("目标文件夹是源文件夹的子文件夹");} else {copyDir(src, dest);}}public static void copyDir(File src, File dest) throws IOException {File newDir = new File(dest, src.getName());newDir.mkdirs();// 从数据源中获取数据(File对象)File[] files = src.listFiles();// 遍历数组, 获取每一个文件或文件夹对象for (File file : files) {// 判断当前对象是否是文件if (file.isFile()) {// 是的话直接拷贝FileInputStream fis = new FileInputStream(file);FileOutputStream fos = new FileOutputStream(new File(newDir, file.getName()));int len;byte[] bys = new byte[1024];while ((len = fis.read(bys)) != -1) {fos.write(bys, 0, len);}fis.close();fos.close();} else {// 如果是文件夹, 递归调用方法copyDir(file, newDir);}}}
}

这篇关于Day13-Java进阶-IO字节流及其练习题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/930409

相关文章

Spring boot整合dubbo+zookeeper的详细过程

《Springboot整合dubbo+zookeeper的详细过程》本文讲解SpringBoot整合Dubbo与Zookeeper实现API、Provider、Consumer模式,包含依赖配置、... 目录Spring boot整合dubbo+zookeeper1.创建父工程2.父工程引入依赖3.创建ap

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

Spring Boot spring-boot-maven-plugin 参数配置详解(最新推荐)

《SpringBootspring-boot-maven-plugin参数配置详解(最新推荐)》文章介绍了SpringBootMaven插件的5个核心目标(repackage、run、start... 目录一 spring-boot-maven-plugin 插件的5个Goals二 应用场景1 重新打包应用

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

创建Java keystore文件的完整指南及详细步骤

《创建Javakeystore文件的完整指南及详细步骤》本文详解Java中keystore的创建与配置,涵盖私钥管理、自签名与CA证书生成、SSL/TLS应用,强调安全存储及验证机制,确保通信加密和... 目录1. 秘密键(私钥)的理解与管理私钥的定义与重要性私钥的管理策略私钥的生成与存储2. 证书的创建与

浅析Spring如何控制Bean的加载顺序

《浅析Spring如何控制Bean的加载顺序》在大多数情况下,我们不需要手动控制Bean的加载顺序,因为Spring的IoC容器足够智能,但在某些特殊场景下,这种隐式的依赖关系可能不存在,下面我们就来... 目录核心原则:依赖驱动加载手动控制 Bean 加载顺序的方法方法 1:使用@DependsOn(最直

SpringBoot中如何使用Assert进行断言校验

《SpringBoot中如何使用Assert进行断言校验》Java提供了内置的assert机制,而Spring框架也提供了更强大的Assert工具类来帮助开发者进行参数校验和状态检查,下... 目录前言一、Java 原生assert简介1.1 使用方式1.2 示例代码1.3 优缺点分析二、Spring Fr

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件