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,一经查实,立即删除!

相关文章

【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…

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

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

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

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

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

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

鸿蒙开发学习笔记第一篇--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 …

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…

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

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

如何进行宏观经济预测

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

poi-tl的使用(通俗易懂,全面,内含动态表格实现 包会!!)

最近在做项目时候有一个关于解析Html文件&#xff0c;然后将解析的数据转化成word的需求&#xff0c;经过调研&#xff0c;使用poi-tl来实现这个需求&#xff0c;自己学习花费了一些时间&#xff0c;现在将这期间的经验总结起来&#xff0c;让大家可以快速入门 poi-tl的介绍 …

979: 输出利用先序遍历创建的二叉树的后序遍历序列

解法&#xff1a; #include<iostream> using namespace std; struct TreeNode {char val;TreeNode* left;TreeNode* right;TreeNode(char c) :val(c), left(NULL), right(NULL) {}; }; TreeNode* buildTree() {char c;cin >> c;if (c #) {return NULL;}TreeNode*…

Android图形显示架构概览

图形显示系统作为Android系统核心的子系统&#xff0c;掌握它对于理解Android系统很有帮助&#xff0c;下面从整体上简单介绍图形显示系统的架构&#xff0c;如下图所示。 这个框架只包含了用户空间的图形组件&#xff0c;不涉及底层的显示驱动。框架主要包括以下4个图形组件。…

内网通如何去除广告,内网通免广告生成器

公司使用内网通内部传输确实方便&#xff01;但是会有广告弹窗推送&#xff01;这个很烦恼&#xff01;那么如何去除广告呢&#xff01; 下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1CVVdWexliF3tBaFgN1W9aw?pwdhk7m 提取码&#xff1a;hk7m ID&#xff1a;…

mysql dll文件的缺失和Can‘t connect to MySQL server on ‘localhost‘ (10061)

个人笔记&#xff08;整理不易&#xff0c;有帮助&#xff0c;收藏点赞评论&#xff0c;爱你们&#xff01;&#xff01;&#xff01;你的支持是我写作的动力&#xff09; 笔记目录&#xff1a;学习笔记目录_pytest和unittest、airtest_weixin_42717928的博客-CSDN博客 个人随笔…

InternlM2

第一次作业 基础作业 进阶作业 1. hugging face下载 2. 部署 首先&#xff0c;从github上git clone仓库 https://github.com/InternLM/InternLM-XComposer.git然后里面的指引安装环境

【自研网关系列】请求服务模块和客户端模块实现

&#x1f308;Yu-Gateway&#xff1a;&#xff1a;基于 Netty 构建的自研 API 网关&#xff0c;采用 Java 原生实现&#xff0c;整合 Nacos 作为注册配置中心。其设计目标是为微服务架构提供高性能、可扩展的统一入口和基础设施&#xff0c;承载请求路由、安全控制、流量治理等…

【机器学习】数学基础详解

线性代数&#xff1a;构建数据的骨架 数学对象 标量&#xff08;Scalar&#xff09; 标量是最基本的数学对象&#xff0c;代表了单个的数值&#xff0c;无论是整数还是实数。在机器学习中&#xff0c;标量可以用来表示一个模型的单个参数&#xff0c;如偏差&#xff08;bias&…

如何更好地理解 Vue 3 watch 侦听器的用法

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…