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

相关文章

Java利用Spire.XLS for Java自动化设置Excel的文档属性

《Java利用Spire.XLSforJava自动化设置Excel的文档属性》一个专业的Excel文件,其文档属性往往能大大提升文件的可管理性和可检索性,下面我们就来看看Java如何使用Spire... 目录Spire.XLS for Java 库介绍与安装Java 设置内置的 Excel 文档属性Java

Java中的CompletableFuture核心用法和常见场景

《Java中的CompletableFuture核心用法和常见场景》CompletableFuture是Java8引入的强大的异步编程工具,支持链式异步编程、组合、异常处理和回调,介绍其核心用法,通过... 目录1、引言2. 基本概念3. 创建 CompletableFuture3.1. 手动创建3.2.

java中4种API参数传递方式统一说明

《java中4种API参数传递方式统一说明》在Java中,我们可以使用不同的方式来传递参数给方法或函数,:本文主要介绍java中4种API参数传递方式的相关资料,文中通过代码介绍的非常详细,需要的... 目录1. 概述2. 参数传递方式分类2.1 Query Parameters(查询参数)2.2 Path

SpringBoot整合 Quartz实现定时推送实战指南

《SpringBoot整合Quartz实现定时推送实战指南》文章介绍了SpringBoot中使用Quartz动态定时任务和任务持久化实现多条不确定结束时间并提前N分钟推送的方案,本文结合实例代码给大... 目录前言一、Quartz 是什么?1、核心定位:解决什么问题?2、Quartz 核心组件二、使用步骤1

Java线程池核心参数原理及使用指南

《Java线程池核心参数原理及使用指南》本文详细介绍了Java线程池的基本概念、核心类、核心参数、工作原理、常见类型以及最佳实践,通过理解每个参数的含义和工作原理,可以更好地配置线程池,提高系统性能,... 目录一、线程池概述1.1 什么是线程池1.2 线程池的优势二、线程池核心类三、ThreadPoolE

Springboot请求和响应相关注解及使用场景分析

《Springboot请求和响应相关注解及使用场景分析》本文介绍了SpringBoot中用于处理HTTP请求和构建HTTP响应的常用注解,包括@RequestMapping、@RequestParam... 目录1. 请求处理注解@RequestMapping@GetMapping, @PostMappin

Java调用DeepSeek API的8个高频坑与解决方法

《Java调用DeepSeekAPI的8个高频坑与解决方法》现在大模型开发特别火,DeepSeek因为中文理解好、反应快、还便宜,不少Java开发者都用它,本文整理了最常踩的8个坑,希望对... 目录引言一、坑 1:Token 过期未处理,鉴权异常引发服务中断问题本质典型错误代码解决方案:实现 Token

SpringBoot整合AOP及使用案例实战

《SpringBoot整合AOP及使用案例实战》本文详细介绍了SpringAOP中的切入点表达式,重点讲解了execution表达式的语法和用法,通过案例实战,展示了AOP的基本使用、结合自定义注解以... 目录一、 引入依赖二、切入点表达式详解三、案例实战1. AOP基本使用2. AOP结合自定义注解3.

Java实现字符串大小写转换的常用方法

《Java实现字符串大小写转换的常用方法》在Java中,字符串大小写转换是文本处理的核心操作之一,Java提供了多种灵活的方式来实现大小写转换,适用于不同场景和需求,本文将全面解析大小写转换的各种方法... 目录前言核心转换方法1.String类的基础方法2. 考虑区域设置的转换3. 字符级别的转换高级转换

SpringBoot简单整合ElasticSearch实践

《SpringBoot简单整合ElasticSearch实践》Elasticsearch支持结构化和非结构化数据检索,通过索引创建和倒排索引文档,提高搜索效率,它基于Lucene封装,分为索引库、类型... 目录一:ElasticSearch支持对结构化和非结构化的数据进行检索二:ES的核心概念Index: