IO流基本流

目录

什么是IO流

IO流的体系

字节流 

FileOutputStream

FileInputStream

字符集

字符流

FileReader

FileWriter

字节流和字符流的使用场景


什么是IO流

内存不能永久化存储,程序停止,数据丢失,所以要添加一个存档功能,存储到硬盘的文件,我们要知道文件在哪里和如何传输,文件的位置也就是File类:路径,而IO流就是解决如何传输的问题,IO流就是一个存储和读取数据的解决方案.因为IO流跟File是息息相关的,所以需要先回顾一下,可以查看这一篇文章Java File类

File 表示系统中的文件或者文件夹的路径

获取文件信息(大小,文件名,修改时间)  (判断文件的类型)  (创建文件/文件夹)  (删除文件/文件夹) ...

但是要注意:File类只能对文件本身进行操作,不能读写文件里面存储的数据.如果我们要读写文件里面存储的数据就要学习本篇文章所学的IO流.

IO流   用于读写文件中的数据(可以读写文件,或网络中的数据)

问:IO流中,谁在读,谁在写?以谁为参照物看读写的方向呢?

答:以程序为参照物读写,回答内存也可以,因为程序就是运行在内存当中的

所以我们要进行分类,先让大家有一个整体的认知,再一种一种地去学习

IO流的体系

 

字节流 

FileOutputStream

操作本地文件的字节输出流,可以把程序中的数据写到本地文件中

书写步骤:

  1. 创建字节输出流
  2. 写数据
  3. 释放资源
public class ByteStreamDemo1 {public static void main(String[] args) throws IOException {/**演示:字节输出流FileOutputStream* 实现需求:写出一段文字到本地文件中.(暂时不写中文)** 实现步骤:*      创建对象*      写出数据*      释放资源*///1.创建对象//写出  输出流 OutputStream//本地文件 FileFileOutputStream fos = new FileOutputStream("Myio\\a.txt");//2.写出数据fos.write(97);//3.释放资源fos.close();}
}

如果不释放资源:

public class ByteStreamDemo1 {public static void main(String[] args) throws IOException {/*void write(int b)   一次写一个字节数据void write(byte[] b)  一次写一个字节数组数据void write(byte[] b,int off,int len)  一次写一个字节数组的部分数据数组      起始索引   个数*///1.创建对象FileOutputStream fos = new FileOutputStream("Myio\\a.txt");//2.写出数据
//        fos.write(97);//a
//        fos.write(98);//bbyte[] bytes = {97,98,99,100,101};
//        fos.write(bytes);fos.write(bytes,1,2);//b c//3.释放数据fos.close();}
}

public class ByteStreamDemo1 {public static void main(String[] args) throws IOException {/*换行写:续写:*///1.创建对象FileOutputStream fos = new FileOutputStream("Myio\\a.txt",true);//2.写出数据String str = "asdfgh";byte[] arr = str.getBytes();
//        System.out.println(Arrays.toString(arr));fos.write(arr);//<h1>换行</h1>//再次写出一个换行符//windows: \r\n 回车换行//Linux:   \n//Mac:     \r/*细节:在windows操作系统当中,java对回车换行进行了优化虽然完整的是\r\n,但是我们写其中一个\r或者\njava也可以实现换行,因为java在底层会补全建议:不要省略,还是写全了.*//*<h1>续写</h1>如果想要续写,打开续写开关即可开关位置:创建对象的第二个参数默认false:表示关闭续写,此时创建对象会清空文件手动传递true:表示打开续写,此时创建对象不会清空文件*/String wrap = "\r\n";byte[] bytes = wrap.getBytes();fos.write(bytes);String str2 = "666";byte[] arr2 = str2.getBytes();fos.write(arr2);//3.释放资源fos.close();}
}

FileInputStream

操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中来.

书写步骤:

  1. 创建字节输入流对象
  2. 读数据
  3. 释放资源
import java.io.FileInputStream;
import java.io.IOException;public class ByteStreamDemo1 {public static void main(String[] args) throws IOException {//1.创建对象FileInputStreamFileInputStream fis = new FileInputStream("Myio\\a.txt");//2.读取数据int b1 = fis.read();// 97System.out.println(b1);//3.释放资源fis.close();}
}

import java.io.FileInputStream;
import java.io.IOException;public class ByteStreamDemo1 {public static void main(String[] args) throws IOException {/*字节输入流循环读取*///1.创建对象FileInputStream fis = new FileInputStream("Myio\\a.txt");//2.循环读取int b;/*** read :表示读取数据,而且是读取一个数据就移动一次指针* 所以一定要定义一个第三方变量 b*/while((b=fis.read())!= -1){System.out.print((char)b);}//3.释放资源fis.close();}
}
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class ByteStreamDemo1 {public static void main(String[] args) throws IOException {/**   练习:*       文件拷贝*       把D:\yjy\movie.mp4拷贝到当前模块下**    注意:*   选择一个比较小的文件,不要太大,大文件拷贝后面会学***///1.创建对象FileInputStream fis = new FileInputStream("D:\\yjy\\movie.mp4");FileOutputStream fos = new FileOutputStream("Myio\\copy.mp4");//2.拷贝//核心思想:边读边写int b;while((b=fis.read())!=-1){fos.write(b);}//3.释放资源//规则:先开的流最后在关闭fos.close();fis.close();//还可以统计一下拷贝时间,单位毫秒 复习System这个类里面的方法}
}

因为FileInputStream一次读写一个字节,所以速度比较慢

 

修改成这样就可以避免啦! 

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class ByteStreamDemo1 {public static void main(String[] args) throws IOException {/**public int read(byte[] buffer)   一次读一个字节数组数据**///1.创建对象FileInputStream fis = new FileInputStream("Myio\\a.txt");//2.读取数据byte[] bytes = new byte[2];//一次读取多个字节数据 具体越多 跟数组的长度有关//返回值 本次读取到多少个字节数据int len1 = fis.read(bytes);System.out.println(len1);String str1 = new String(bytes,0,len1);System.out.println(str1);int len2 = fis.read(bytes);System.out.println(len2);String str2 = new String(bytes,0,len2);System.out.println(str2);//3.释放资源fis.close();}
}

用这个方法改写一下拷贝文件的练习:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class ByteStreamDemo1 {public static void main(String[] args) throws IOException {long start = System.currentTimeMillis();//1.创建对象FileInputStream fis = new FileInputStream("D:\\yjy\\movie.mp4");FileOutputStream fos = new FileOutputStream("Myio\\copy.mp4");//2.拷贝int len;byte[] bytes = new byte[1024*1024*5];while((len=fis.read(bytes))!=-1){fos.write(bytes,0,len);}//3.释放资源fos.close();fis.close();long end = System.currentTimeMillis();System.out.println(end-start);}
}

之前我们所有的异常都是直接抛出处理,但是也要学习一下try...catch异常处理

以后工作中都是抛出处理 会学springboot框架会把我们抛出的异常统一处理,这个代码我们只需要了解即可.

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class ByteStreamDemo1 {public static void main(String[] args) {//1.创建对象FileInputStream fis=null;FileOutputStream fos=null;try {long start = System.currentTimeMillis();fis = new FileInputStream("D:\\yjy\\movie.mp4");fos = new FileOutputStream("Myio\\copy.mp4");//2.拷贝int len;byte[] bytes = new byte[1024*1024*5];while((len=fis.read(bytes))!=-1){fos.write(bytes,0,len);}long end = System.currentTimeMillis();System.out.println(end-start);} catch (IOException e) {throw new RuntimeException(e);} finally {//3.释放资源if(fos!=null){//防止如果文件不存在导致空指针异常try {fos.close();} catch (IOException e) {throw new RuntimeException(e);}}if(fis!=null){try {fis.close();} catch (IOException e) {throw new RuntimeException(e);}}}}
}

还可以简化:

我们在前面说,字节流读取文件的时候,文件中不要有中文

想要知道乱码出现的原因,这就是要知道我们今天要说到的字符集

字符集

原因2:编码和解码的时候用的是不同的码表

如何不产生乱码?

  1. 不要用字节流读取文本文件
  2. 编码解码时使用同一个码表,同一个编码方式

import java.io.UnsupportedEncodingException;
import java.util.Arrays;public class ByteStreamDemo1 {public static void main(String[] args) throws UnsupportedEncodingException {/*Java中编码的方法public byte[] getBytes()    使用默认方法进行编码public byte[] getBytes(String charsetName)  使用指定方法进行编码Java中解码的方法String(byte[] bytes)        使用默认方式进行解码String(byte[] bytes,String,charseName)       使用指定方法进行解码*///1.编码String str = "ai你哟";byte[] byte1 = str.getBytes(); // eclipse 是GBK   Idea是UTF-8System.out.println(Arrays.toString(byte1));byte[] byte2 = str.getBytes("GBK");System.out.println(Arrays.toString(byte2));//解码String str2 = new String(byte1);System.out.println(str2);String str3 = new String(byte1,"GBK");System.out.println(str3);}
}

第二个乱码原因直接都调成utf-8即可

那么我们来解决第一个问题,是否存在一种流,默认也是一次读取一个字节,当遇到中文时,一次读多个字节

字符流

FileReader

public class CharStream {public static void main(String[] args) throws IOException {//1.创建对象并关联本地文件FileReader fr = new FileReader(new File("Myio\\a.txt"));//2.读取数据 read()//字符流的底层也是字节流,默认也是一个字节一个字节读取的//如果遇到中文就会一次读取多个,GBK一次读两个字节,UTF-8一次读取三个字节//read()细节://1.read():默认也是一个字节一个字节的读取的,如果遇到中文就会一次读取多个//最终把这个十进制作为返回值//这个十进制的数据也表示在字符集上的数字//英文:文件里面二进制数据:0110 0001//        read()方法进行读取,解码并转成十进制97//中文:文件里面的二进制数据 11100110 10110001 10001001//        read()方法进行读取,解码并转成十进制27721//我如果想看到中文汉字,就是把这些十进制数据,再进行强转int ch;while((ch=fr.read())!=-1){System.out.print((char)ch);}//3.释放资源fr.close();}
}
import java.io.FileReader;
import java.io.IOException;public class CharStream {public static void main(String[] args) throws IOException {//1.创建对象FileReader fr= new FileReader("Myio\\a.txt");//2.读取数据char[] chars = new char[2];int len;//read(chars):读取数据,解码,强转三步合并了,把强转之后的字符放到数组当中//空参的read+强转类型转换while((len=fr.read(chars))!=-1){//把数组中的数据变成字符串再进行打印System.out.print(new String(chars,0,len));}//3.释放资源fr.close();}
}

FileWriter

public class CharStream {public static void main(String[] args) throws IOException {
//        FileOutputStream fos = new FileOutputStream("Myio\\a.txt");
//
//        fos.write(97);//字节流 每次只能操作一个字符
//
//        fos.close();FileWriter fw = new FileWriter("Myio\\a.txt",true);//fw.write(25105);//根据字符集的编码方式进行编码,把编码之后的数据写到文件中去
//        fw.write("牛逼呀!");//符号也是分中文和英文的 中文3 英文1char[] chars = {'a','b','c','d','我'};fw.write(chars);fw.close();}
}

文本文件内容:ab我

问题一:   如果文件超出8192

问题2:如果在中间加了一个FileWriter

字节流和字符流的使用场景

import java.io.*;public class CharStream {public static void main(String[] args) throws IOException {//拷贝一个文件夹,考虑子文件夹//1.创建对象表示数据源File src = new File("D:\\aaa\\src");//2.创建对象表示目的地File dest = new File("D:\\aaa\\dest");//3.调用方法开始拷贝copydir(src,dest);}/*** 作用:拷贝文件夹* 参数一:数据源* 参数二:目的地* @param src* @param dest*/private static void copydir(File src, File dest) throws IOException {dest.mkdirs();//递归//1.进入数据源File[] files = src.listFiles();//2.遍历数组for (File file : files) {if(file.isFile()){//3.判断文件,拷贝 文件开始 文件结束FileInputStream fis = new FileInputStream(file);//a.txtFileOutputStream fos = new FileOutputStream(new File(dest,file.getName()));//也叫a.txtbyte[] bytes = new byte[1024];int len;while((len=fis.read(bytes))!=-1){fos.write(bytes,0,len);}fos.close();fis.close();}else{//4.判断文件夹,递归copydir(file,new File(dest,file.getName()));}}}
}

加密代码

import java.io.*;public class CharStream {public static void main(String[] args) throws IOException {/***  ^ : 异或*      两边相同:false*      两边不同:true**///100 : 1100100//10:      1010//______________//      1101110//十进制:110
//        System.out.println(100^10);//110
//        System.out.println(110^10);//100//1.创建对象关联原始文件FileInputStream fis = new FileInputStream("Myio\\冰冰.jpg");//2.创建对象关联加密文件FileOutputStream fos = new FileOutputStream("Myio\\ency.jpg");//3.加密处理int b;while((b=fis.read())!=-1){fos.write(b^2);}//释放资源fos.close();fis.close();}
}

解密代码

import java.io.*;public class CharStream {public static void main(String[] args) throws IOException {//1.创建对象关联原始文件FileInputStream fis = new FileInputStream("Myio\\ency.jpg");//2.创建对象关联加密文件FileOutputStream fos = new FileOutputStream("Myio\\redu.jpg");//3.加密处理int b;while((b=fis.read())!=-1){fos.write(b^2);}//释放资源fos.close();fis.close();}
}

import java.io.*;
import java.util.ArrayList;
import java.util.Collections;public class CharStream {public static void main(String[] args) throws IOException {//1.读取数据FileReader fr = new FileReader("Myio\\a.txt");StringBuilder sb = new StringBuilder();int ch;while((ch=fr.read())!=-1){sb.append((char)ch);}fr.close();System.out.println(sb);//2.排序//2-1-9-4-7-8String str = sb.toString();String[] arrStr = str.split("-");ArrayList<Integer> list = new ArrayList<>();for (String s : arrStr) {int i = Integer.parseInt(s);list.add(i);}
//        System.out.println(list);Collections.sort(list);System.out.println(list);//3.写出FileWriter fw = new FileWriter("Myio\\a.txt");for (int i = 0; i < list.size(); i++) {if(i==list.size()){fw.write(list.get(i) + "");}else{fw.write(list.get(i)+"-");}}fw.close();}
}
public class CharStream {public static void main(String[] args) throws IOException {//1.读取数据FileReader fr = new FileReader("Myio\\a.txt");StringBuilder sb = new StringBuilder();int ch;while((ch=fr.read())!=-1){sb.append((char)ch);}fr.close();System.out.println(sb);//2.排序  Stream流Integer[] arr = Arrays.stream(sb.toString().split("-")).map(Integer::parseInt).sorted().toArray(Integer[]::new);
//                .map(new Function<String, Integer>() {
//                    @Override
//                    public Integer apply(String s) {
//                        return Integer.parseInt(s);
//                    }
//                })System.out.println(Arrays.toString(arr));//3.写出FileWriter fw = new FileWriter("Myio\\a.txt");String s = Arrays.toString(arr).replace(", ","-");String result = s.substring(1,s.length()-1);System.out.println(s);fw.write(result);fw.close();}
}

细节一:文件中的数据不要换行 因为会有\r\n

细节二:bom头 也就是在文件前有一个隐藏的字符标记 有隐藏的数据 里面记录了一些文件的信息,比如说字符编码

如果你选择了这个那很可能这个文件的大小会比你预算的要多因为包含bom头

idea中可以设置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/815657.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

async-validator --- 中文文档

目录 async-validator Install Usage API Validate Rules Type 内置类型 Required Pattern Range Length Enumerable Whitespace Deep Rules 深层规则 defaultField 默认字段 Transform 变换 Messages 提示信息 asyncValidator 异步校验函数 validator 校验函…

【web3技术】什么是 WEB3?

Web3 简介 中心化网络已经帮助数十亿人融入了互联网,并在其上创建了稳定、可靠的基础设施。 与此同时,少数中心化巨头几乎垄断了互联网,甚至可以为所欲为。 Web3 是摆脱这一困境的方案。 不同于科技巨头垄断的传统互联网,Web3 采用去中心化,由所有用户构建、运营和拥有。…

day57 判断子序列 不同的子序列 两个字符串的删除操作 编辑距离

题目1 392 判读子序列 题目链接 392 判断子序列 题意 判断字符串s是否为字符串t的子序列 &#xff08;子序列的相对位置在原字符串中不改变&#xff09; 就是求最长公共子序列的长度与字符串s的长度是否相等 动态规划 1&#xff09;确定dp数组及下标i的含义 dp[i][j]…

城市预约挂号统一平台的实现

目录 一、需求分析 二、界面设计 ​ 三、前端开发 四、代码下载 一.需求分析 二、界面设计 三、前端开发 <!DOCTYPE html> <html lang"zh-ch"> <head><meta charset"UTF-8"><title>基本样式页</title><link rel…

Python中的可哈希与不可哈希对象详解

文章目录 1. 前置知识&#xff1a;哈希是什么2. 可哈希和不可哈希对象的定义2.1可哈希2.2 不可哈希 3. 对象的哈希方法3.1 自定义对象的哈希方法3.2 可哈希性与等价性3.3 哈希值的用途 推荐 在复习可变对象和不可变对象时&#xff0c;学到了这个内容 1. 前置知识&#xff1a;哈…

宜搭无权查询该应用信息,唯一排查码:21081d4e17130865292352743e9ed8

这种问题可能是关联表单出现了问题&#xff0c;当前应用中没有这个表单 所以就出现了应用无权访问的问题

【第二十四篇】使用Burpsuite实现反射、储存、DOM型XSS(靶场实战案例)

目录 反射性XSS储存型XSSDOM XSS反射性XSS 搜索1后,审查元素: 猜测<font>标签中没有进行XSS特殊字符转义,而在<font>标签内,可使用<script>标签: <script>alert(1)</script>储存型XSS 该模块对姓名、电子邮件、网站做过滤处理,但评论处…

深度学习| 交叉熵损失函数(包含代码实现)

前言&#xff1a;因为我深度学习主要用于图像分割&#xff0c;所以交叉熵损失函数主要侧重在图像分割。 交叉熵损失函数 介绍公式交叉熵函数存在什么问题带权重的交叉熵函数代码 介绍 交叉熵损失函数&#xff08;Cross-Entropy Loss&#xff09;是深度学习中常用的一种损失函…

基于深度学习的生活垃圾智能分类系统(微信小程序+YOLOv5+训练数据集+开题报告+中期检查+论文)

摘要 本文基于Python技术&#xff0c;搭建了YOLOv5s深度学习模型&#xff0c;并基于该模型研发了微信小程序的垃圾分类应用系统。本项目的主要工作如下&#xff1a; &#xff08;1&#xff09;调研了移动端垃圾分类应用软件动态&#xff0c;并分析其优劣势&#xff1b;分析了深…

【S32K3 MCAL配置】-4.1-CAN Driver:如何解决CAN帧发送丢帧问题

"><--返回「Autosar_MCAL高阶配置」专栏主页--> 案例背景:如何解决:同一时刻,连续调用多次CanIf_Transmit / Can_Write API,同时发送不同CANID帧,出现丢帧问题。 目录(共9页精讲,基于评估板: NXP S32K312EVB-Q172,手把手教你S32K3从入门到精通) 实现的架…

LeetCode-热题100:5. 最长回文子串

题目描述 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串。 示例 1&#xff1a; 输入&#xff1a; s “babad” 输出&#xff1a; “bab” 解释&#xff1a; “aba” 同样是符合题意的答案…

鸿蒙开发学习笔记第一篇--TypeScript基础语法

目录 前言 一、ArkTS 二、基础语法 1.基础类型 1.布尔值 2.数字 3.字符串 4.数组 5.元组 6.枚举 7.unkown 8.void 9.null和undefined 10.联合类型 2.条件语句 1.if语句 1.最简单的if语句 2.if...else语句 3.if...else if....else 语句 2.switch语句 5.函数…

Java 入门教程||Java 关键字

Java 关键字 Java教程 - Java关键字 Java中的关键字完整列表 关键词是其含义由编程语言定义的词。 Java关键字和保留字&#xff1a; abstract class extends implements null strictfp true assert const false import package super try …

二叉排序树的增删改查(java版)

文章目录 1. 基本节点2. 二叉排序树2.1 增加节点2.2 查找&#xff08;就是遍历&#xff09;就一起写了吧2.3 广度优先遍历2.4 删除&#xff08;这个有点意思&#xff09;2.5 测试样例 最后的删除&#xff0c;目前我测试的是正确的 1. 基本节点 TreeNode: class TreeNode{pri…

bugku-web-文件包含2

页面源码 <!-- upload.php --><!doctype html><html><head><meta charset"utf-8"/><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-widt…

Zabbix_Agent一键安装脚本(包含ansible-playbook批量执行脚本)

为了快速安装配置zabbix_agent&#xff0c;特地写了此shell脚本&#xff0c;脚本实现功能如下&#xff1a; 1、自动检测操作系统类型&#xff0c;目前支持Ubuntu/Centos/Redhat 2、自动获取安装agent主机IP地址 3、交互判断主机IP是否可用&#xff0c;用户输入正确IP地址 4、输…

技术周刊的转变:如何平衡热爱与现实?

大家好&#xff0c;我是那个自己打脸自己的猫哥&#xff0c;本来说周刊不做订阅制的&#xff0c;现在却推出了订阅专栏。今天想为自己辩护一下&#xff0c;同时聊聊技术周刊今后的发展计划。 首先回顾一下我过去的想法吧&#xff0c;然后再解释为什么会突然出现转变。 出于对…

2024.4.12力扣每日一题——找到冠军 I

2024.4.12 题目来源我的题解方法一 哈希表方法二 列式遍历统计方法三 列式遍历优化统计 题目来源 力扣每日一题&#xff1b;题序&#xff1a;2923 我的题解 方法一 哈希表 哈希表存储不可能是冠军的队伍&#xff0c;最后没在哈希表中的队伍就是冠军。 时间复杂度&#xff1a…

Python学习之-Pandas详解

前言&#xff1a; Pandas 是一个开源的 Python 数据分析库&#xff0c;它提供了高性能、易于使用的数据结构和数据分析工具。Pandas提供 了方便的类表格和类SQL的操作&#xff0c;同时提供了强大的缺失值处理方法&#xff0c;可以方便的进行数据导入、选取、清洗、处理、合并、…

如何进行宏观经济预测

理性预期经济学提出了理性预期的概念&#xff0c;强调政府在制定各种宏观经济政策时&#xff0c;要考虑到各行为主体预期对政策实施有效性的影响&#xff0c;积极促成公众理性预期的形成&#xff0c;从而更好地实现宏观调控的目标。政府统计要深入开展统计分析预测研究&#xf…