IO流及字符集

IO流

作用:

        用于读写文件中的数据

分类:

                图来自黑马程序员网课 

        纯文本文件:Windows自带的记事本打开能读懂的文件,word excel不是纯文本文件

        图来自黑马程序员网课 

 FileOutputStream:

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

        书写步骤:

        1)创建字节输出流对象

                参数是字符串表示的路径或者File对象都是可以的

                如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的

                如果文件已经存在,则会清空文件

        2)写数据

                write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII码上对应的字符

                97--》a

        3)释放资源

                每次使用完流之后都要释放资源

package com.lazyGirl.iodemo;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class ByteStreamDemo {public static void main(String[] args) throws IOException {File file = new File("a.txt");FileOutputStream fos = new FileOutputStream("a.txt");fos.write(97);fos.close();}
}

输出:

写数据的3种方式:

        图来自黑马程序员网课 

        

package com.lazyGirl.iodemo;import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class ByteStreamDemo2 {public static void main(String[] args) throws IOException {FileOutputStream fos = new FileOutputStream("a.txt");byte[] bytes = {98,99,100,101,102,103,104,105};fos.write(bytes,1,2);}
}

        输出:

写数据的两个小问题:

换行写和续写

package com.lazyGirl.iodemo;import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;public class ByteStreamDemo2 {public static void main(String[] args) throws IOException {FileOutputStream fos = new FileOutputStream("a.txt",true);//        byte[] bytes = {98,99,100,101,102,103,104,105};String str = "hhhhhhhhhhh";byte[] bytes = str.getBytes();
//        System.out.println(Arrays.toString(bytes));fos.write(bytes);//换行 windows: \r\n Linux : \r mac: \rString wrap = "\r\n";byte[] wrapBytes = wrap.getBytes();fos.write(wrapBytes);String str2 = "6666666666666666";byte[] bytes2 = str2.getBytes();fos.write(bytes2);fos.close();}
}

输出:

FileInputStream:

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

书写步骤:

        1)创建字节输入流对象

        细节一:如果文件不存在,就直接报错

        2)读数据

        细节一:一次读一个字节,读出来的数数据在ASCII上对应的数据

        细节二:读到文件末尾,read方法返回-1 空格对应的是32

        3)释放资源

package com.lazyGirl.iodemo;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;public class InputStreamDemo1 {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("a.txt");//按字符读,读不到返回-1int b1 = fis.read();System.out.println((char)b1);fis.close();}
}

输出:

循环读取:

package com.lazyGirl.iodemo;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;public class InputStreamDemo1 {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("a.txt");//按字符读,读不到返回-1
//        while (fis.read() != -1){System.out.print((char)fis.read());
//        }
//        System.out.println();int b;while ((b = fis.read()) != -1){System.out.print((char)b);}fis.close();}
}

输出:

 

 文件拷贝:

package com.lazyGirl.iodemo;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class InputDemo2 {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("a.txt");FileOutputStream fos = new FileOutputStream("copy.txt");int b;while ((b = fis.read()) != -1)fos.write(b);fos.close();fis.close();}}

        输出:

         

文件读取的问题:

        弊端:FileInputStream一次读写一个字节,速度太慢了

                        

                                图来自黑马程序员网课

                注意:一次读一个字节数组的数据,每次读取会尽可能把数组装满

        

                图来自黑马程序员网课

         文件拷贝:

        

package com.lazyGirl.iodemo;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class InputStreamDemo2 {public static void main(String[] args) throws IOException {long start = System.currentTimeMillis();FileInputStream fis = new FileInputStream("a.txt");FileOutputStream fos = new FileOutputStream("copy.txt");byte[] buf = new byte[1024 * 1024 * 5];int len = fis.read(buf);while ((len = fis.read(buf)) != -1) {fos.write(buf, 0, len);}fos.close();fis.close();long end = System.currentTimeMillis();System.out.println(end - start);}
}

        提升速度 

        输出:

try...catch异常处理:

         try ...catch...finally 特点:finally里面的代码一定会执行,除非虚拟机停止

        接口:AutuCloseable 在特定的情况下,可以自动释放资源

package com.lazyGirl.iodemo;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class InputStreamDemo2 {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("a.txt");FileOutputStream fos = new FileOutputStream("copy.txt");try(fis;fos) {long start = System.currentTimeMillis();byte[] buf = new byte[1024 * 1024 * 5];int len;while ((len = fis.read(buf)) != -1) {fos.write(buf, 0, len);}long end = System.currentTimeMillis();System.out.println(end - start);} catch (IOException e) {e.printStackTrace();}}
}

        字节流读取文件的时候,文件中不要有中文        

计算机的存储规则:

字符集:

ASCII 字符集:存储英文,一个字节就足以 128个字符 0~127

        图来自黑马程序员网课

GB2312字符集:

 

                图来自黑马程序员网课 

        1980年发布,1981年5月1日起实施简体中文汉字编码国家标准,收录7445个图形字符,其中包括6763个简体汉字

BIG5字符集:

        台湾地区繁体中文标准字符集,共收录13053个中文字,1984年实施

GBK字符集:

        2000年发布,收录21003个汉字,包括国家标准GB13000-1中的全部中日韩汉字和BIG5编码中的所有汉字

        windows系统默认使用的是GBK,系统显示ANSI

        一个汉字使用两个字节存储

        

                图来自黑马程序员网课 

Unicode字符集:

        国际标准字符集,它将世界各种语言的每个字符定义一个唯一的编码,以满足跨语言,跨平台的文本信息转换。

        

 

 

                        以上3个图来自黑马程序员网课 

乱码:

         原因1:读取数据时未读完整个汉字

        

                图来自黑马程序员网课

         原因2:编码和解码不统一

   

  避免乱码:

        1. 不要用字节流读取文本文件

        2. 编码解码时使用同一个码表,同一个编码方式

扩展:字节流读取中文会乱码,但是拷贝不会乱码(信息不会丢失)

package com.lazyGirl.iodemo;import java.io.UnsupportedEncodingException;
import java.util.Arrays;public class CharSetDemo1 {public static void main(String[] args) throws UnsupportedEncodingException {String str = "爱你ai";byte[] bytes = str.getBytes();System.out.println(Arrays.toString(bytes));byte[] bytes2 = str.getBytes("GBK");System.out.println(Arrays.toString(bytes2));//解码String str2 = new String(bytes, "GBK");String str3 = new String(bytes);System.out.println(str2);}
}

输出:

 字符流:

        字符流的底层就是字节流

        字符流 = 字节流 + 字符集

 特点:

        输入流:一次读一个字节,遇到中文时,一次读多个字节

        输出流:底层会把数据按照指定的编码方式进行编码,变成字节再写到文件中

使用场景:

        对于纯文本文件进行读写操作

        

         以上2张图来自黑马程序员网课

FileReader:

         书写步骤:

          1)创建字符输入流对象

   

                图来自黑马程序员网课

         2)读取数据

        

        图来自黑马程序员网课 

        3)释放资源

        空参read方法:

        

package com.lazyGirl.iodemo;import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;public class CharStreamDemo1 {public static void main(String[] args) throws IOException {FileReader fr = new FileReader("a.txt");int ch;while ((ch = fr.read()) != -1) {System.out.print(ch + " ");}fr.close();}
}

 有参read方法:

 有参的read方法:读取数据,解码,强制转换三步合并

package com.lazyGirl.iodemo;import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;public class CharStreamDemo1 {public static void main(String[] args) throws IOException {FileReader fr = new FileReader("a.txt");
//        int ch;
//        while ((ch = fr.read()) != -1) {
//            System.out.print(ch + " ");
//        }
//        fr.close();
//char[] chars = new char[2];int len;while ((len = fr.read(chars)) != -1) {System.out.print(new String(chars, 0, len) + " ");}}
}

        输出: 

 FileWriter构造方法:

        

    成员方法:

        

书写步骤: 

         1)创建字符输出流对象

                细节一:参数是字符串表示的路径或者File对象都是可以的

                细节二:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的

                细节三:如果文件已经存在,则会清空文件,如果不想清空可以打开续写开关

          2)写数据

                如果write方法的参数是整数,但是实际上写到本地文件中的是整数在字符集上对应的字符

          3)释放资源

原理解析:

                图来自黑马程序员网课 

        

                        图来自黑马程序员网课 

总结:

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

字节流:拷贝任意类型的文件

字符流:读取纯文本文件中的数据 往纯文本文件中写出数据

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

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

相关文章

板凳------56.Linux/Unix 系统编程手册(下) -- SOCKET 介绍

56.1.概述 socket 是一种IPC方法,允许位于同一主机或使用网络连接起来的不同主机上的应用程序之间交换数据。 UNIX 允许位于同一主机系统上的应用程序之间通信 Internet domain IPv4 and IPV6 // socket 通信方式 1.各个应用程序创建一个socket,socket是…

vue3:实现图片放大浏览功能组件

两种实现方式&#xff1a; 1.将原本的盒子与img标签放大至全屏浏览。 2.新建一个div和img标签进行全屏浏览。这样不会改变布局。 第一种&#xff1a; 效果&#xff1a; 组件代码&#xff1a; <template><div :class"isScreen ? fullImg : norImg">…

Confluence是否免费?你需要知道的都在这里!

根据Atlassian官方信息&#xff0c;可以确定的是 Confluence 并不免费&#xff0c;但为10人以下团队提供了免费版本。免费版可以使用不限量的页面、空间&#xff0c;但只有2GB的存储空间和3个活动白板。但国内有不少公司通过使用破解版的方式来免费使用Cofluence。下面本文将详…

【什么!Grok记录被打破了】坏消息不是Meta的 llama3 400,好消息是Nvidia发布的Nemotron-4 340B且支持开源

Nvidia 发布了开创性的开放模型系列 “Nemotron-4 340B”&#xff0c;再次巩固了其作为人工智能创新领域无可争议的领导者的地位。这一发展标志着人工智能行业的一个重要里程碑&#xff0c;因为它使各行各业的企业能够创建功能强大的特定领域 LLM&#xff0c;而无需大量昂贵的真…

深入分析 Android BroadcastReceiver (三)

文章目录 深入分析 Android BroadcastReceiver (三)1. 广播消息的优缺点及使用场景1.1 优点1.2 缺点 2. 广播的使用场景及代码示例2.1. 系统广播示例&#xff1a;监听网络状态变化 2.2. 自定义广播示例&#xff1a;发送自定义广播 2.3. 有序广播示例&#xff1a;有序广播 2.4. …

线代知识点总结

目录 一.初等行/列变换 1.计算行列式时&#xff0c;行列变换都可 2.求矩阵的秩时&#xff0c;行列变换都可 3.解线性方程组时&#xff0c;仅能使用初等行变换 4.判定解的情况&#xff0c;单纯求r(A),r(A,b)的过程行列变换都可 5.求向量组极大无关组、线性表出关系&#x…

汽车级TPSI2140QDWQRQ1隔离式固态继电器,TMUX6136PWR、TMUX1109PWR、TMUX1133PWR模拟开关与多路复用器(参数)

1、TPSI2140-Q1 是一款隔离式固态继电器&#xff0c;专为高电压汽车和工业应用而设计。 TPSI2140-Q1 与 TI 具有高可靠性的电容隔离技术和内部背对背 MOSFET 整合在一起&#xff0c;形成了一款完全集成式解决方案&#xff0c;无需次级侧电源。 该器件的初级侧仅由 9mA 的输入电…

线程介绍及其Java如何用Thread 类创建线程和操作线程方法

目录 一、进程和线程1.1 进程特征 2.2 线程特征 2.3 区别 二、利用Thread类创建线程2.1 通过创建Thread子类&#xff0c;重写run()方法2.2 通过实现Runnable接口&#xff0c;重写run()方法2.3. Callable接口 FutureTask 创建线程2.3 三种方法区别1. 通过创建Thread子类&#x…

SQL深度解析:掌握这些技巧,让你的数据库查询如虎添翼!

前言 随着大数据时代的来临&#xff0c;数据库的角色愈发重要。SQL作为使用最为广泛的数据查询语言&#xff0c;其深度解析与优化对于数据密集型应用来说至关重要。掌握高级SQL技巧不仅可以提升开发效率&#xff0c;还能显著提高数据查询的性能和灵活性。本文将探讨一些关键的S…

修改SubVI的LabVIEW默认搜索路径

在启动顶级VI后&#xff0c;LabVIEW可能会遇到找不到subVI的情况。这通常是由于subVI的路径发生了变化或没有被正确配置。 LabVIEW默认搜索路径 默认情况下&#xff0c;LabVIEW会按以下顺序搜索文件位置&#xff08;*表示LabVIEW将搜索子目录&#xff09;&#xff1a; <t…

如何从印刷体的图片中把手写体部分统统去掉?--免费途径

AI图像处理技术 我是从国外某个网站上找到在线AI免费credit的处理方式的。国内的基本没有全功能试用、或者即使收费也不好用。 国内的差距主要是&#xff1a;1、对图片分辨率和大小有更多限制&#xff0c;即使收费用户也是&#xff1b;2、需要安装app之类&#xff0c;然后连线…

MongoDB使用$addToSet向数组中添加元素

学习mongodb&#xff0c;体会mongodb的每一个使用细节&#xff0c;欢迎阅读威赞的文章。这是威赞发布的第66篇mongodb技术文章&#xff0c;欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题&#xff0c;欢迎在文章下面点个赞&#xff0c;或者关…

驱动开发(四):Linux内核中断

驱动开发系列文章&#xff1a; 驱动开发&#xff08;一&#xff09;&#xff1a;驱动代码的基本框架 驱动开发&#xff08;二&#xff09;&#xff1a;创建字符设备驱动 驱动开发&#xff08;三&#xff09;&#xff1a;内核层控制硬件层 驱动开发&#xff08;四&#xf…

java:一个springfox swagger2的简单例子

# 示例程序 【pom.xml】 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.3.12.RELEASE</version> </dependency> <dependency><groupId>…

视图-什么是(VIEW)?怎么创建(CREATE VIEW)?怎么删除(DROP)?怎么用(SELECT/INSERT/UPDATE/DELETE)?

一、引言 之前对数据库的操作都是针对基本关系表&#xff0c;操作都是在数据库的全局逻辑模式上进行的&#xff0c;而在实际的数据库系统中&#xff0c;可能用户只关心或只被允许使用数据库中的某些基本关系表或基本关系表中的某些属性列&#xff0c;这些数据构成了数据库的外…

vue(v-if,v-else-if-else-show)

基本应用 例子 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTE-8"> <meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-w…

LabView_波形控件

波形图表 将一定数量的数据点存储在缓冲区&#xff0c;并通过这种方式存储并显示这些数据点。当缓冲区被填满后&#xff0c;波形图表将会用新的数据点覆盖缓冲区中存在时间最久的数据点。 当数据点可用时&#xff0c;波形图表将显示已有的数据点外加最新接收到的数据点 。 您可…

NVIDIA Triton系列02-功能与架构简介

NVIDIA Triton系列02-功能与架构简介 B站&#xff1a;肆十二-的个人空间-肆十二-个人主页-哔哩哔哩视频 (bilibili.com) 博客&#xff1a;肆十二-CSDN博客 问答&#xff1a;(10 封私信 / 72 条消息) 肆十二 - 知乎 (zhihu.com) 前面文章介绍微软 Teams 会议系统、微信软件与腾讯…

Thinkphp一文鸡富贵鸡玫瑰庄园富农场仿皮皮果理财农场源码

Thinkphp一文鸡富贵鸡玫瑰庄园富农场仿皮皮果理财农场源码&#xff0c;喜欢的朋友可以下载研究 一文鸡富贵鸡玫瑰庄园富农场仿皮皮果理财农场源码

Django初学者指南

文章目录 Django初学者指南1 Django简介1.1 Django的历史1.2 使用Django的知名网站1.4 Django的主要特点1.5 Django的工作原理 2 Django 使用2.1 Django 支持的 Python 版本2.2 Django 版本 3 Django 开发 Web 程序3.1 安装Django3.2 创建Django项目3.3 运行开发服务器3.4 创建…