IO流及字符集

news2024/11/26 19:43:11

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: \r

        String 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");
        //按字符读,读不到返回-1
        int 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.coloradmin.cn/o/1825983.html

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

相关文章

工业 web4.0 的 UI 风格,独树一帜

工业 web4.0 的 UI 风格,独树一帜

Java—文件拷贝

将指定的文件或目录拷贝到指定目录夹下 import java.io.*; import java.util.Scanner;/*** 实现一个文件拷贝*/ public class FileCopy {public static void main(String[] args) {Scanner scanner new Scanner(System.in);System.out.println("请输入要拷贝的源文件路径…

抽象工厂模式(大话设计模式)C/C++版本

抽象工厂模式 C 参考&#xff1a;https://www.cnblogs.com/Galesaur-wcy/p/15927110.html #include <iostream> using namespace std;// 抽象产品Department ,定义具体产品的公共接口 class Department { public:virtual ~Department() default;virtual void Insert()…

next.js v14 升级全步骤|迁移 pages Router 到 App Router

【概括】本文升级整体按照官网文档指引进行&#xff0c;在迁移 pages Router 前先看了官网的实操视频。 【注意】文章内对 .babel.ts、next.config.js 进行了多次更改&#xff0c;最终配置可见 报错3: Server Error ReferenceError: React is not defined 一、升级 Next.js 版…

Boom 3D软件下载及安装教程

简介&#xff1a; Boom 3D是适用于Mac和Windows系统的专业音效增强软件&#xff0c;旨在通过播放器&#xff0c;媒体或流媒体服务等介质&#xff0c;在不同类型的耳机上以3D环绕效果播放媒体内容。您无需使用昂贵的耳机或其他附加环绕音效增强器即可感受3D环绕音乐。 安 装 包…

性能测试包括哪些方面?

性能测试、通过自动化测试工具模拟多种正常&#xff0c;峰值&#xff0c;以及异常的负载情况下对系统各项性能指标进行的测试。 负载测试、压力测试、容量测试都属于性能测试。 性能测试指标是衡量系统性能的评价标准 主要关注一些响应时间、并发用户/并发、点击率、吞吐量、…

助力知识博主,实现在家搞副业的FlowUs新策略

助力知识博主&#xff0c;实现在家副业的FlowUs新策略 我们设定了一个雄心勃勃的目标&#xff1a;帮助100位知识博主在FlowUs上实现副业成功。这个目标不仅得到了团队成员的广泛支持&#xff0c;甚至有人认为它过于保守&#xff0c;因为FlowUs的多功能性使其成为自媒体博主收入…

工资信息管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;基础数据管理&#xff0c;公告管理&#xff0c;津贴管理&#xff0c;管理员管理&#xff0c;绩效管理 用户账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;公告管理&#xff0c;津…

CCAA质量管理【学习笔记】​​ 备考知识点笔记(五)质量设计方法与工具

第五节 质量设计方法与工具 1 任 务 分 解 法 1.1 概念 任务分解法&#xff0c;又称工作分解结构 (Work Breakdown Structure, 简 称 WBS) 。WBS 指以可交付成果为 导向&#xff0c;对项目团队为实现项目目标并完成规定的可交付成果而执行的工作所进行的层次分解。W…

057、PyCharm 运行代码报错:Error Please select a valid Python interpreter

当我们在PyCharm运行代码时&#xff0c;提示如下图错误&#xff1a; 那么问题通常是由于PyCharm未正确配置Python解释器引起的。 我们只需按以下步骤重新配置Python解释器即可&#xff1a; 打开PyCharm设置&#xff1a; 在菜单栏中的点击 “File” -> “Settings”&#xf…

【Spine学习09】之导入皮肤两种方式[skin]

第一种&#xff1a;明确项目中某个角色是有两套皮肤的情况下 直接导入两套皮肤 1、添加SKIN皮肤指令 2、在ps中-文件-脚本-浏览【打开选中jsx脚本】 3、打开Spine 点击左上角&#xff0c;选择导入数据 就可以看到该角色的两套皮肤啦&#xff01; 第二种&#xff1a;刚开始角…

Android开发更改JDK版本

今天在跑GitHub上面一个Android项目时&#xff0c;在Android编译时出现如下错误&#xff1a; Unsupported Java. Your build is currently configured to use Java 17.0.2 and Gradle 7.0.2.错误原因&#xff1a; JDK和Gradle版本对应出错。 本地的JDK为1.8正好可以更改为本…

商品搬家到抖店

使用的工具为 张飞搬家&#xff0c;登录上去 张飞搬家 1 复制商品的网址 商品链接复制过去后&#xff0c;点击下面的开始批量复制 2 检查修改商品信息 价格啊、图片啊、各种商品属性啊&#xff0c;检查下&#xff0c;不合适的修改和补充 3 开始搬家 4 查看商品 打开抖店后…

配置完eslint没有用?

当你使用 npx eslint --init 生成配置文件后 你也配置好了.prettierrc 当你在代码写一点小问题的时候 发现eslint没有进行检查 原因是你生成的 .eslintrc.js中没有加上这个配置 extends: [.....plugin:prettier/recommended],加上以后重启vscode你会发现

用AI造谣每天收入1万元,最后只拘留5日?

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 当时我就震惊了!800多个MCN的自媒体账号每天收入1万元&#xff0c;最后拘留5日?难怪群里这么多人在晒收益截图&#xff0c;原来都是这样来的。 央视刚刚曝光一家MCN机构用AI造谣的事件&#xff0c;该公司用AI一天…

Servlet接口实现

项目搭建 pom文件引入依赖与打包配置。 <dependencies><!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId>…

Linux笔记--vi编辑器

vi编辑器 基本操作 对于vi编辑器有这几种模式 移动 当编辑一个过大的文件时通过方向键移动光标过慢所以可以使用快捷键进行移动 编辑 dw指令只能在单词第一个字母处使用 D指令删除的是当前行 查找替换 pattern指代想要搜索的内容

HAL库开发--STM32的HAL环境搭建

知不足而奋进 望远山而前行 目录 文章目录 前言 下载 安装 解压 安装 添加开发包 修改仓库路径 下载软件开发包&#xff08;慢&#xff0c;不推荐&#xff09; 解压已有软件开发包&#xff08;快&#xff0c;推荐&#xff09; 总结 前言 在嵌入式系统开发中&#x…

系统架构师考点--计算机硬件

大家好。今天我总结一下计算机硬件的一些考点。 一、中央处理单元&#xff08;CPU&#xff09; 我们知道&#xff0c;计算机的基本硬件系统由运算器、控制器、存储器、输入设备和输出设备5大部件组成。其中运算器、控制器等部件被集成在一起统称为中央处理单元(Central Proce…

微服务SpringCloud ES分布式全文搜索引擎简介 下载安装及简单操作入门

Elasticsearch ES简介 分布式全文搜索引擎 我们天天在用ES 搜索的时候 要与多个信息进行匹配查找 然后返回给用户 首先 ES会将数据库中的信息 先进行一个拆分 这个叫做分词 是按照词语关键词拆的 然后就能进行搜索的时候匹配对应的id 每一个关键字对应若干id 每一个…