Java Day 10 io流

IO流

  • 1、前置知识 字符集
    • 1.1 标准ASCII
    • 1.2 GBK编码
    • 1.3 UTF-32
    • 1.4 UTF-8
    • 1.5 编码和解码方法
  • 2、IO流
    • 2.1 流的分类
    • 2.2 FileInputStream
      • 2.2.1 常用方法
    • 2.3 FileOutputStram
      • 2.3.1 常用方法
      • 2.3.2 文件复制案例
    • 2.4 释放资源的方式
      • 2.4.1 try-catch-finally
      • 2.4.2 try-with-resource

1、前置知识 字符集

1.1 标准ASCII

每个字符一个字节,共128个字符,00000000-01111111(第一位都是0
在这里插入图片描述

1.2 GBK编码

一个中文字符占两个字节,兼容了ASCII编码。
英文,符号数字等仍然是一个字节,每个汉字的第一位都是1。

1.3 UTF-32

每个字符占四个字节,但是这样太浪费空间了。

1.4 UTF-8

可变编码。汉字占3个字节,数字这些占一个字节。
在这里插入图片描述
编码和解码要使用相同的字符集,否则会出现乱码
在这里插入图片描述

1.5 编码和解码方法

Java提供了常用的编码和解码方法
在这里插入图片描述

     String  data="cky崔";
        //1.编码
        byte[] bytes = data.getBytes();//使用系统默认的编码格式
        byte[] gbks = data.getBytes("GBK");//使用特定的字符集编码

        //2.解码
        String s = new String(bytes); //使用系统默认的格式解码
        System.out.println(s);//cky崔
        String gbk1 = new String(gbks);
        System.out.println(gbk1);//cky��  乱码 因为我们使用GBK进行编码,但是却用UTF-8进行解码
        String gbk = new String(gbks, "GBK");//使用特定的格式解码
        System.out.println(gbk);

2、IO流

在这里插入图片描述

2.1 流的分类

在这里插入图片描述
在这里插入图片描述

2.2 FileInputStream

文件字节输入流,是InputStream 字节输入流这个抽象类的一个实现类,可以把文件磁盘中的数据以字节的形式传输到内存中

2.2.1 常用方法

在这里插入图片描述
①read() 每次读取一个字节 并返回该字节的int值 如果没有数据了 返回-1
②每次读取一个字节 性能差 因为IO会利用硬件资源 时间慢 且一次读取一个字节,读取中文时 会乱码
③每次读取多个字节 返回读取的字节数 这里每次读取3个字节
④这种一次读取多个字符,虽然性能得到了提升,但是读取中文时还是会出现乱码问题

package com.cky.file;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;

public class Endecode {
    public static void main(String[] args) throws Exception {
   // 1、创建字节文件输入流的管道 以及它要连通的文件
//        InputStream fileInputStream = new FileInputStream(new File("E:\\java_code\\project\\hello-app\\a.txt"));

        //简化写法  直接写路径即可 没必要new一个文件对象
        InputStream fis = new FileInputStream("E:\\java_code\\project\\hello-app\\a.txt");
        int c;

        //read() 每次读取一个字节 并返回该字节的int值 如果没有数据了 返回-1
//        while((c=fis.read())!=-1){
//            System.out.print((char)(c));
//        }
        //每次读取一个字节 性能差 因为IO会利用硬件资源 时间慢 且一次读取一个字节,读取中文时 会乱码

        //每次读取多个字节  返回读取的字节数  这里每次读取3个字节
        //这种一次读取多个字符,虽然性能得到了提升,但是读取中文时还是会出现乱码问题
        byte[] bytes = new byte[3];
        int len;  //读取的内容保存在bytes数组中 该数组会重复利用
        while((len=fis.read(bytes))!=-1){
            //读取多少 倒出多少
            String s = new String(bytes,0,len); //最后可能并不会读取刚刚好的字符,这里我们只用解码刚好读入的字节数就可以,如果没有读满,然后全部解码,就会出现内容不一致
            System.out.print(s);}
            fis.close();//释放资源
    }}


将文件的全部内容一次读取如果文件很大,则无法操作

方法1

        //简化写法  直接写路径即可 没必要new一个文件对象
        InputStream fis = new FileInputStream("E:\\java_code\\project\\hello-app\\a.txt");
        //使用文件字节输入流 一次读取文件全部字节
        File file = new File("E:\\java_code\\project\\hello-app\\a.txt");
        long len=file.length(); //文件是系统资源 存放在硬盘中 可能会很大 所以是long类型
        byte[] bytes = new byte[(int)len]; //因为是要将文件内容 读取到内容中 内存空间有限 所以都是int类型
        int read = fis.read(bytes);
        String s = new String(bytes);
        System.out.println(s);
        fis.close();//释放资源

方法2

        InputStream fis = new FileInputStream("E:\\java_code\\project\\hello-app\\a.txt");
        byte[] bytes = fis.readAllBytes();
        String s = new String(bytes);
        System.out.println(s);
        fis.close();//释放资源

在这里插入图片描述

2.3 FileOutputStram

文件字节输出流
在这里插入图片描述

2.3.1 常用方法

在这里插入图片描述

package com.cky.file;

import java.io.*;
import java.nio.charset.StandardCharsets;

public class Endecode {
    public static void main(String[] args) throws Exception {
        // 构建文件字节输出流对象 并且确定与哪个文件相连
        //该文件可以不存在 如果不存在 会自动创建
        //默认会覆盖原来的文件 会先清空再写 每次创建一次流对象均是如此
        //如果想要追加,在后边添加true
//        OutputStream fileOutputStream = new FileOutputStream("D:/a.txt");
        OutputStream fileOutputStream = new FileOutputStream("D:/a.txt",true);

        fileOutputStream.write(97);//一次添加一个字节
        fileOutputStream.write('a');
        byte[] bytes = "abc崔".getBytes();//一次添加多个字节
        fileOutputStream.write(bytes);

        fileOutputStream.write("\r\n".getBytes());  //"\r\n" 可以适应各个系统 \n只适用于windows

        fileOutputStream.close();//释放资源
    }}




2.3.2 文件复制案例

在这里插入图片描述

package com.cky.file;

import java.io.*;
import java.nio.charset.StandardCharsets;

public class Endecode {
    public static void main(String[] args) throws Exception {
      //照片复制

        //1、创建一个文件输入流 与原文件相连
        InputStream inputStream=new FileInputStream("C:\\Users\\10945\\Desktop\\a\\11.jpg");
        //2、创建一个文件输出流 与复制文件 相连
        OutputStream outputStream=new FileOutputStream("C:\\Users\\10945\\Desktop\\15.jpg");

        //创建一个字符数组 用于缓存我们读取到的数据

        byte[] bytes = new byte[1024];

        int len;//用于记录我们读取到了多少 字节数据

        while ((len=inputStream.read(bytes))!=-1){
            //读多少 写多少
            outputStream.write(bytes,0,len);
        }
        outputStream.close();
        inputStream.close();

        System.out.println("复制成功");
    }}


2.4 释放资源的方式

2.4.1 try-catch-finally

//最后要释放资源 防止在未释放资源之前 发生异常
//在释放资源之前先要判断是否为空 防止在未创建之前 发生异常

package com.cky.file;

import java.io.*;
import java.nio.charset.StandardCharsets;

public class Endecode {
    public static void main(String[] args) throws Exception {
      //最后要释放资源 防止在未释放资源之前 发生异常 
        InputStream inputStream=null;
        OutputStream outputStream=null;
        

        try {
            //1、创建一个文件输入流 与原文件相连
            inputStream=new FileInputStream("C:\\Users\\10945\\Desktop\\a\\11.jpg");
            //2、创建一个文件输出流 与复制文件 相连
            outputStream=new FileOutputStream("C:\\Users\\10945\\Desktop\\15.jpg");

            //创建一个字符数组 用于缓存我们读取到的数据

            byte[] bytes = new byte[1024];

            int len;//用于记录我们读取到了多少 字节数据

            while ((len=inputStream.read(bytes))!=-1){
                //读多少 写多少
                outputStream.write(bytes,0,len);
            }
            outputStream.close();
            inputStream.close();

            System.out.println("复制成功");
        } catch (IOException e) {
            e.printStackTrace();
        }
        finally {
            
            //先要判断是否为空 防止在未创建之前 发生异常
            if (inputStream!=null)
                inputStream.close();
            if (outputStream!=null)
                outputStream.close();
        }
    }}


2.4.2 try-with-resource

在这里插入图片描述

这种更简洁 会自动释放资源
为了说明会自动调用 close方法 这里我们自己定义了一个资源

package com.cky.file;

public class Myresource implements AutoCloseable {
    @Override
    public void close() throws Exception {
        System.out.println("close方法被执行");
    }
}

package com.cky.file;

import java.io.*;
import java.nio.charset.StandardCharsets;

public class Endecode {
    public static void main(String[] args) throws Exception {
      //最后要释放资源 防止在未释放资源之前 发生异常


        try ( InputStream inputStream=new FileInputStream("C:\\Users\\10945\\Desktop\\a\\11.jpg");
        //这里只能放置资源对象
         //什么是资源?资源 会实现AutoCloseable接口 并且会有一个close方法。
        //用完之后会自动调用close 方法
       OutputStream outputStream=new FileOutputStream("C:\\Users\\10945\\Desktop\\15.jpg");
       Myresource myresource=new Myresource()){

            byte[] bytes = new byte[1024];

            int len;//用于记录我们读取到了多少 字节数据

            while ((len=inputStream.read(bytes))!=-1){
                //读多少 写多少
                outputStream.write(bytes,0,len);
            }
            System.out.println("复制完成");

        } catch (IOException e) {
            e.printStackTrace();
        }


    }}

结果:
复制完成
close方法被执行

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ftp和fxp哪个传传输快,传输大文件该怎么选择?

在当今数字化时代,大文件传输已成为日常工作和商业活动中不可或缺的一部分。无论是跨国公司的数据交换,还是个人用户的大型媒体文件分享,选择一个高效的传输协议至关重要。FTP和FXP是两种常用的文件传输方式,但在传输大文件时&…

nginx gzip性能优化 —— 筑梦之路

对比使用和不使用gzip static处理 1. 不使用 gzip static 时的 gzip 处理 如果你不使用 gzip_static 而只是 "gzip on",它每次都会被压缩并发送。 虽然它实际上可能缓存在内存中,但传统观点是 "每次都会执行压缩处理,因此 CP…

【SRE系列之docker容器】--dockerfile镜像优化

dockerfile镜像优化 1.1 镜像优化方法 系统镜像采用ubuntu或者alpine,会比centos少1G左右编写业务镜像时从官网拉取镜像,其余配置根据业务需求再配置编写dockerfile时把不用的安装包卸载或者删除尽量减少run命令的使用(一个run命令&#xf…

【兆易创新GD32H759I-EVAL开发板】图像处理加速器(IPA)的应用

GD32H7系列的IPA(Image Pixel Accelerator)是一个高效的图像处理硬件加速器,专门设计用于加速图像处理操作,如像素格式转换、图像旋转、缩放等。它的优势在于能够利用硬件加速来实现这些操作,相比于软件实现&#xff0…

YOLOv9实例分割教程|(二)验证教程

专栏地址:目前售价售价59.9,改进点30个 专栏介绍:YOLOv9改进系列 | 包含深度学习最新创新,助力高效涨点!!! 一、验证 打开分割验证文件,填入数据集配置文件、训练好的权重文件&…

go语言基础笔记

1.基本类型 1.1. 基本类型 bool int: int8, int16, int32(rune), int64 uint: uint8(byte), uint16, uint32, uint64 float32, float64 string 复数:complex64, complex128 复数有实部和虚部,complex64的实部和虚部为32位,complex128的实部…

yocto是个什么东东

yocto不是个什么东东 在我们了解Yocto项目是什么之前,让我们先了解一下它不是什么。 Yocto项目不是用于现有硬件的软件开发工具包(SDK),而是用于构建这样一个工具包。 Yocto项目不是可以部署到硬件上的系统二进制镜像&#xff…

客服销冠偷偷用的提效神器!无广很实用

近期发现我的同事每天上班必登录的一款软件——客服宝聊天助手,用过才发现:真客服办公的提效神器!感兴趣的小伙伴请往下看~一、客服宝的简介:客服宝聊天助手,是一款跨平台快捷回复工具。自带多种功能,有效帮…

leetcode判断子序列

本题中,我们可以删除原始字符串的一些字符但是不能改变其他字符的位置,这种求子序列的题都可以用动态规划来解决。 首先我们要确定dp数组的定义,这里我们将dp数组定义为dp[i][j] 表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的…

蓝桥杯[OJ 1621]挑选子串-CPP-双指针

目录 一、题目描述: 二、整体思路: 三、代码: 一、题目描述: 二、整体思路: 要找子串,则必须找头找尾,找头可以遍历连续字串,找尾则是要从头的基础上往后遍历,可以设头…

OSCP靶场--BlackGate

OSCP靶场–BlackGate 考点(1.redis rce 2. CVE-2021-4034提权) 1.nmap扫描 ┌──(root㉿kali)-[~/Desktop] └─# nmap -sV -sC -p- 192.168.163.176 --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-14 03:32 EDT Nmap scan report for 192.168.163.…

MongoDB实战面试指南:常见问题一网打尽

码到三十五 : 个人主页 心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 ! MongoDB是一款流行的非关系型数据库,以其高效、可扩展的特性受到开发者的青睐。了解MongoDB的架构、存储引擎和数据结…

python 基础知识点(蓝桥杯python科目个人复习计划63)

今日复习内容:做题 例题1:蓝桥骑士 问题描述: 小蓝是蓝桥王国的骑士,他喜欢不断突破自我。 这天蓝桥国王给他安排了N个对手,他们的战力值分别为a1,a2,...,an,且按顺序阻挡在小蓝的前方。对于这些对手小…

剪辑设计软件如何跨系统使用?PC也能用Mac Final Cut

我猜你工作中,常常遇到这样那样的麻烦: 临时接手一个项目,之前的同事用Final Cut,而你是Windows系统; 临时有紧急需求要调整,而本地电脑却没有工作软件/性能不给力; 那这样的情况&#xff0c…

SSL证书如何实现数据加密传输?

在当前互联网的洪流中,用户对网站隐私与安全性的重视程度日益提升。为了确保用户信息和交易数据的安全传输,SSL证书在网络世界中扮演了关键角色。本文将深入解析SSL证书的核心功能及其重要作用。 1、SSL证书采用加密技术保障数据传输安全 通过应用公钥加…

Mysql 无法启动,mysql-bin.日志丢失删除处理

在linux操作系统中,当mysql无法启动时候,先看日志 2024-03-15T05:20:16.352075Z 0 [Warning] [MY-000081] [Server] option max_allowed_packet: unsigned value 107374182400 adjusted to 1073741824. 2024-03-15T05:20:16.352156Z 0 [Warning] [MY-010…

(008)Unity StateMachineBehaviour的坑

文章目录 StateMachineBehaviour同名函数的调用问题StateMachineBehaviour 的 OnState*、OnStateMachine* 的区别 StateMachineBehaviour同名函数的调用问题 1.如果脚本中,两个同名的函数都存在,那么两个函数都会被调用;如果只有其中一个同名…

IO流——字节流

常见字符集 标准ASCII码字符集 ASCII(American Standard Code for Information Interchange):美国信息交换标准代码,包括英文、符号等标准ASCII码使用1个字节存储一个字符,首位是0,总共可表示128个字符 而对于国内而言&a…

橡胶工厂5G智能制造数字孪生可视化平台,推进橡胶工业数字化转型

橡胶5G智能制造工厂数字孪生可视化平台,推进橡胶工业数字化转型。随着信息技术的迅猛发展和智能制造的不断推进,数字化转型已成为制造业转型升级的重要方向。橡胶工业作为传统制造业的重要领域,正面临着产业升级和转型的迫切需求。橡胶5G智能…

计算机网络笔记(湖科大教书匠版本)

第一章、 ①三种交换方式 电路交换、分组交换、报文交换(被分组交换所取代) 1.电路交换:会一直占用通道,不适合计算机之间的数据通信 2.分组交换:通常我们把表示该数据的整块数据称为一个报文。 先把较长的报文划…