24/04/11总结

news2024/11/30 2:31:04

IO流(First edition):

IO流:用于读入写出文件中的数据
流的方向(输入指拿出来,输出指写进去)
输入流:读取
输出流:写出
操作文件类型
字节流:所有类型文件
字符流:纯文本

 

字节流:
InputStream的子类:FileInputStream:操作本地文件的字节输入流
OutputStream的子类:FileOutputStream:操作本地文件的字节输出流
 
 //1.创建字节输出流对象
                    //细节1:参数是字符串表示的路径或者是File对象都是可以的
                    //细节2:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的。
                    //细节3:如果文件存在,会清空文件的内容
        FileOutputStream fos = new FileOutputStream("C:\\Users\\35303\\Desktop\\a.txt");
 //2.写入
                    //细节:write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符
        //fos.write(67);
            //3.释放资源
        //fos.close();
FileOutputStream写数据的3种方式
方法名称                                              说明
void write(int b)                                     一次写一个字节数据
void write(byte[]b)                                   一次写一个字节数组数据
void write(byte[lb,int off,int len) (参数1:数组,参数2:起始索引,参数3:个数)  一次写一个字节数组的部分数据
 //void write(byte[]b)
       byte a[] = new byte[]{97,98,99,100,101};
        fos.write(a);
        //fos.close();

        //void write(byte[lb,int off,int len)
        byte b[] = new byte[]{65,66,67,68,69};
        fos.write(b,1,3);   //从1号索引写三个
        fos.close();
 //续写:在打开时后面写个true
        FileOutputStream fos1 = new FileOutputStream("C:\\Users\\35303\\Desktop\\b.txt",true);
        //方便转字符
        String s = "djaofjawsfja";
        byte[] bytes = s.getBytes();
        fos1.write(bytes);
        //fos1.close();

        //换行: \r\n(单写\r或\n也可以)
        String s1 ="\r\n";
        String s2 = "666";
        byte[] bytes1 = s1.getBytes();
        byte[] bytes2 = s2.getBytes();
        fos1.write(bytes1);
        fos1.write(bytes2);
        fos1.close();
FileInputStream:
//FileInputStream

        //1.创建对象
        FileInputStream fis = new FileInputStream("C:\\Users\\35303\\Desktop\\b.txt");
        //2.读取数据(如果没数据了read会返回-1)
        //read:表示读取数据,而且是读取一个数据就移动一次指针
        int a1 = fis.read();
        System.out.println((char)a1);
        //3.释放资源
        //fis.close();

        //字节输入流循环读取
        int a2;
        while((a2=fis.read())!=-1){
            System.out.print((char)a2);
        }
        fis.close();


        //方法名称                                                                  说明
        //public int read()                                                 一次读一个字节数据
        //public int read(byte[] buffer)  (返回值为获取的长度)              一次读一个字节数组数据
字符流:字符流的底层其实就是字节流
  //字符流=字节流+字符集
特点:
输入流:一次读一个字节,遇到中文时,一次读多个字节
输出流:底层会把数据按照指定的编码方式进行编码,变成字节再写到文件中
Reader的子类:FileReader
Writer的子类:FileWriter

FileReader:
构造方法 (1.创建字符输入流对象)                                                 说明
public FileReader(File file)                             创建字符输入流关联本地文件
public FileReader(string pathname)                       创建字符输入流关联本地文件
细节1:如果文件不存在就直接报错
2.读取数据
成员方法                              说明
public int read()                     读取数据,读到末尾返回-1
public int read(char[] buffer)        读取多个数据,读到末尾返回-1
细节1:按字节进行读取遇到中文,一次读多个字节,读取后解码,返回一个整数
细节2:读到文件末尾了,read方法返回-1。
3.释放资源
close();

//read无参
        //1.创建对象并关联本地文件
        FileReader fr = new FileReader("C:\\Users\\35303\\Desktop\\b.txt");
        //2.读取数据
        //字符流的底层也是字节流,默认也是一个字节一个字节的读取的。
        //如果遇到中文就会一次读取多个,GBK一次读两个字节,UTF-8一次读三个字节(IDEA默认UTF-8)
        int ch;
        while((ch=fr.read())!=-1){          //空参是传出的ch是字符的二进制
            System.out.print((char)ch);
        }
        System.out.println();
read()细节:
1.read():默认也是一个字节一个字节的读取的,如果遇到中文就会一次读取多个
2.在读取之后,方法的底层还会进行解码并转成十进制。
最终把这个十进制作为返回值
这个十进制的数据也表示在字符集上的数字
英文:文件里面二进制数据 0110 0001
read方法进行读取,解码并转成十进制97
中文:文件里面的二进制数据 11100110 10110001 10001001
read方法进行读取,解码并转成十进制27721
// 我想看到中文汉字,就是把这些十进制数据,再进行强转就可以了
  //read有参
        //1.创建对象
        FileReader fr1 = new FileReader("C:\\Users\\35303\\Desktop\\b.txt");
        //2.读取数据
        char []chars = new char[2]; //表示一次读两个数据
        int len;
        while((len=fr1.read(chars))!=-1){           //有参时传出来的是长度
            //把数组中的数据变成字符串再去打印
            System.out.print(new String(chars,0,len));        //读几个就转几个
        }
        //3.释放资源
        fr1.close();

 

FileWriter:
构造方法                                                                   说明
public FileWriter(File file)                                              创建字符输出流关联本地文件
public FileWriter(String pathname)                                        创建字符输出流关联本地文件
public FileWriter(File file,boolean append)  (append:续写开关,为true是续写) 创建字符输出流关联本地文件,续写
public FileWriter(String pathname,boolean append)                         创建字符输出流关联本地文件,续写
成员方法                                                      说明
void write(int c)                                             写出一个字符
void write(string str)                                        写出一个字符串
void write(String str,int off,int len)                        写出一个字符串的一部分
void write(char[] cbuf)                                       写出一个字符数组
void write(char[] cbuf,int off,int len)                       写出字符数组的一部分
FileWriter书写细节
1.创建字符输出流对象
  //细节1:参数是字符串表示的路径或者File对象都是可以的
  //细节2:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的
  //细节3:如果文件已经存在,则会清空文件,如果不想清空可以打开续写开关
2.写数据
细节: 如果write方法的参数是整数,但是实际上写到本地文件中的是整数在字符集上对应的字符
3.释放资源
细节:每次使用完流之后都要释放资源

 

 //方法write(int c)       写出一个字符
        FileWriter fw = new FileWriter("C:\\Users\\35303\\Desktop\\b.txt",true);
        fw.write(25105);//(25105:我)//根据字符集的编码方式进行编码,把编码之后的数据写到文件中去
        //fw.close();

        //方法FileWriter(String pathname)       写出一个字符串
        fw.write("\n你好hello位");
        fw.close();
       //write(String str,int off,int len)    写出一个字符串的一部分
        //fw.write("\n你好hello位",0,3);

        //方法void write(char[] cbuf)          写出一个字符数组
        //char s[]= new char[]{'a','b','c'};
        //fw.write(char);
        //fw.close();

 

前面学的都是基本流,下面的是高级流
缓冲流:BufferedInputStream(字节缓存输入流)、BufferedOutputStream(字节缓存输出流)
BufferedReader(字符缓存输入流)、BufferedWriter(字符缓冲输出流)
字节缓存流原理:底层自带了长度为8192的缓冲区提高性能
方法名称                                                      说明
public BufferedInputStream(InputStream is)        把基本流包装成高级流,提高读取数据的性能
public BufferedOutputStream(OutputStream os)       把基本流包装成高级流,提高写出数据的性能
//字节缓冲流
        //一次操作一个字节
        //1.创建缓冲流的对象
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("C:\\Users\\35303\\Desktop\\b.txt"));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("C:\\Users\\35303\\Desktop\\c.txt"));
        //2.循环读取并写到目的地
        int b;
        while((b=bis.read())!=-1){
            bos.write((char)b);
        }
        //3.释放资源
        bos.close();
        bis.close();

 

 //一次操作多个字节
            byte [] bytes = new byte[1024];
            int len;
            while((len=bis.read(bytes))!=-1){
                bos.write(bytes,0,len);
            }
        bos.close();
        bis.close();
字符缓存流原理:底层自带了长度为8192的缓冲区提高性能
方法名称                                      说明
public BufferedReader(Reader r)               把基本流变成高级流
public BufferedWriter(Writer r)               把基本流变成高级流
字符缓冲流特有方法
字符缓冲输入流特有方法                                       说明
public String readLine()                  读取一行数据,如果没有数据可读了,会返回null
字符缓冲输出流特有方法                                       说明
public void newLine()                                   跨平台的换行
//1.创建字符缓冲输入流的对象
        BufferedReader br = new BufferedReader(new FileReader("C:\\Users\\35303\\Desktop\\b.txt"));
        //2.读取数据
        String line;
        while ((line=(br.readLine()))!=null) {      //获取文件中一行的数据
            System.out.println(line);
        }
        //3.释放资源
        br.close();

        //1.创建字符缓冲输出流对象
        BufferedWriter bw = new BufferedWriter(new FileWriter("C:\\Users\\35303\\Desktop\\c.txt",true));
        //2.写出数据
        bw.write("你嘴角上扬的样子");
        bw.newLine();                        //因为不同平台的换行不一样,所以可以用跨平台换行newLine
        bw.write("hello world");
        //3.释放资源
        bw.close();
转换流(不需要掌握,看看懂懂意思)
转换流属于字符流
InputStreamReader(转换输入流),OutputStreamWriter(转换输出流)
转换流是字符流和字节流之间的桥梁
输入时把字节流转换成字符流,然后就拥有了字符流的特性,输出又转换为字节流
作用:字节流想使用字符流中的方法了那就可以使用转换流转一下
 //1.创建对象并指定字符编码
        InputStreamReader isr = new InputStreamReader(new FileInputStream("C:\\Users\\35303\\Desktop\\b.txt"),"GBK");
        //第二个参数不写默认UTF-8,写了就是转换为什么编码
        //2.读取数据
        int ch;
        while((ch=isr.read())!=-1){
            System.out.print((char)ch);
        }
        //3.释放资源
        isr.close();

        //1.创建转换流的对象
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("C:\\Users\\35303\\Desktop\\b.txt"),"GBK");
        //2.写出数据
        osw.write("nihao");
        //3.释放资源
        osw.close();

 

序列化流(又叫对象操作输出流):可以把java中的对象写到本地文件中
序列化流属于字节流(输出outputStream),反序列化流(输入inputStream)
ObjectInputStream(反序列化流),ObjectOutputStream(序列化流)
构造方法                                                          说明
public ObjectOutputStream(OutputStream out)               把基本流包装成高级流
成员方法                                                            说明
public final void writeObject(object obi)                 把对象序列化(写出)到文件中去
需求:利用序列化流/对象操作输出流,把一个对象写到本地文件中
序列化流的小细节
使用对象输出流将对象保存到文件时会出现NotSerializableException异常
解决方案:
需要让Javabean类实现Serializable接口
 //1.创建对象
        Demo10two stu = new Demo10two("张三",12,"da");

        //2.创建序列化流的对象
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:\\Users\\35303\\Desktop\\d.txt"));

        //3.写出数据
        oos.writeObject(stu);

        //4.释放资源
        oos.close();

 

反序列化流(又叫对象操作输入流)
可以把序列化到本地文件中的对象,读取到程序中来
构造方法                                                  说明
public ObjectInputStream(InputStream out)         把基本流变成高级流
成员方法                                                              说明
public object readObject()                        把序列化到本地文件中的对象,读取到程序中来
//1.创建反序列化流的对象
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:\\Users\\35303\\Desktop\\d.txt"));

        //2.读取数据
        Object o = ois.readObject();

        //3.打印对象
        System.out.println(o);

        //3.释放资源
        ois.close();

 javabean类:
 

package com.itheima.demo14IO流;

import java.io.Serializable;

public class Demo10two implements Serializable {

    private static final long serialVersionUID = -8462176507494611942L;
    //反序列化流要定义版本号,在IDEA里设置了,所以只要点黄色的那段类名然后alt+回车添加版本号就行了

    //序列化流的小细节
    //使用对象输出流将对象保存到文件时会出现NotSerializableException异常
    //解决方案:
    //需要让Javabean类实现Serializable接口

    //Serializable接口里面是没有抽象方法,标记型接
    //一旦实现了这个接口,那么就表示当前的student类可以被序列化

    private  String name;
    private  int age;
    //transient:瞬态关键字
    //作用:不会把当前属性序列化到本地文件当中
    private transient String a;

    public Demo10two(String dawda, int age, String da) {
    }

    public Demo10two(long serialVersionUID, String name, int age, String a) {
        this.name = name;
        this.age = age;
        this.a = a;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    /**
     * 获取
     * @return a
     */
    public String getA() {
        return a;
    }

    /**
     * 设置
     * @param a
     */
    public void setA(String a) {
        this.a = a;
    }

    public String toString() {
        return "Demo10two{name = " + name + ", age = " + age + ", a = " + a + "}";
    }






}

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

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

相关文章

【HTML】制作一个简单的实时字体时钟

目录 前言 HTML部分 CSS部分 JS部分 效果图 总结 前言 无需多言,本文将详细介绍一段HTML代码,具体内容如下: 开始 首先新建文件夹,创建一个文本文档,两个文件夹,其中HTML的文件名改为[index.html]&am…

二分查找-图文详解,看不懂你来打我。。。

一、查找算法 在计算机科学和算法领域,搜索是一项基本的任务。在海量数据中寻找特定的元素是一项常见的任务,而二分查找(Binary Search)是一种非常高效的搜索算法,特别适用于有序数组。 二、二分查找 二分查找是一种…

【阿里淘天笔试题汇总】2024-04-10-阿里淘天春招笔试题-三语言题解(CPP/Python/Java)

🍭 大家好这里是KK爱Coding ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新淘天近期的春秋招笔试题汇总~ 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢&#x1f…

【前端Vue】Vue3+Pinia小兔鲜电商项目第5篇:整体认识和路由配置,本资源由 收集整理【附代码文档】

Vue3ElementPlusPinia开发小兔鲜电商项目完整教程(附代码资料)主要内容讲述:认识Vue3,使用create-vue搭建Vue3项目1. Vue3组合式API体验,2. Vue3更多的优势,1. 认识create-vue,2. 使用create-vue创建项目,1. setup选项的写法和执行…

基于Springboot的箱包存储系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的箱包存储系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构&…

linux的io的知识大全

C语言的io操作 写文件 #include<stdio.h> #include<string.h>#define FILE_NAME "log.txt" int main() {FILE * fp fopen(FILE_NAME, "w");if(fpNULL){printf("fopen error!\n");}const char* msg "hello zk\n";int c…

【复现】浙大恩特客户资源管理系统 SQL注入漏洞_71

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 浙大恩特客户资源管理系统是一款针对企业客户资源管理的软件产品。该系统旨在帮助企业高效地管理和利用客户资源&#xff0c;提升…

Golang 基于共享变量的并发锁

一、互斥锁 先看一个并发情况&#xff0c;同时操作一个全局变量&#xff0c;如果没有锁会怎么样 假设有1000个goroutines并发进行银行余额的扣除&#xff0c;每次都扣除10元&#xff0c;起始的总余额是10000&#xff0c;理论上并发执行完应该是0对不对&#xff0c;但实际却不…

GeoServer:忘记密码重置

操作步骤 1. 找到data_dir/security/usergroup/default目录下的users.xml文件&#xff0c; 2.修改password为plain:geoserver&#xff0c; 这里无论原来的密码是什么&#xff0c;改为plain:geoserver之后&#xff0c;就可以通过admin&#xff1a;geoserver默认账户密码登录了。…

RAG应用开发实战(01)-RAG应用框架和解析器

1 开源解析和拆分文档 第三方的工具去对文件解析拆分&#xff0c;去将我们的文件内容给提取出来&#xff0c;并将我们的文档内容去拆分成一个小的chunk。常见的PDF word mark down, JSON、HTML。都可以有很好的一些模块去把这些文件去进行一个东西去提取。 优势 支持丰富的文…

电商新宠:淘宝拍立淘API接口助力精准搜索商品信息

淘宝拍立淘API接口&#xff0c;作为电商领域的新宠&#xff0c;正以其独特的图像识别技术为精准搜索商品信息提供强大的助力。这项基于深度学习和计算机视觉技术的先进服务&#xff0c;使得用户能够通过上传图片来快速搜索淘宝平台上的相关商品&#xff0c;极大地提升了购物体验…

鸿蒙让我赚到了第一笔桶金!年薪33.6W!

抢人&#xff01;抢人&#xff01;抢人&#xff01; 所谓抢滩鸿蒙&#xff0c;人才先行。鸿蒙系统火力全开后&#xff0c;抢人已成鸿蒙市场的主题词&#xff01; 智联招聘数据显示&#xff0c;春节后首周&#xff0c;鸿蒙相关职位数同比增长163%&#xff0c;是去年同期的2.6倍…

分布式锁-redission可重入锁原理

5.3 分布式锁-redission可重入锁原理 在Lock锁中&#xff0c;他是借助于底层的一个voaltile的一个state变量来记录重入的状态的&#xff0c;比如当前没有人持有这把锁&#xff0c;那么state0&#xff0c;假如有人持有这把锁&#xff0c;那么state1&#xff0c;如果持有这把锁的…

RX8901CE可在最高+105℃工作温度下工作,助力光伏逆变器稳定运行

光伏逆变器是一种由半导体器件组成的电力调整装置&#xff0c;主要用于把直流电力转换成交流电力。一般由升压回路和逆变桥式回路构成&#xff0c;而且很多时候会配有储能单元进行峰谷电压平整。作为光伏电站中关键的部件&#xff0c;光伏逆变器的可靠运行影响着整个光伏电站的…

ubuntu如何截图? ubuntu中截屏的三种方法

文章目录 1.ubuntu主要用途2.ubuntu如何截图&#xff1f;2.1 方法一&#xff1a;键盘按键快捷键截屏 2.2 方法二&#xff1a;系统自带软件2.3 方法三&#xff1a;第三方软件 Reference 1.ubuntu主要用途 1、桌面操作系统&#xff1a;Ubuntu可用作个人电脑或笔记本电脑的操作系…

树形查找试题(二叉树、红黑树)

一、单项选择题 01.对于二叉排序树&#xff0c;下面的说法中&#xff0c;()是正确的。 A.二叉排序树是动态树表&#xff0c;查找失败时插入新结点&#xff0c;会引起树的重新分裂和组合 B.对二叉排序树进行层序遍历可得到有序序列 C.用逐点插入法构造二叉排序树&#xff0c;若先…

批归一化(BN)在神经网络中的作用与原理

文章目录 1. 批归一化&#xff08;BN&#xff09;在神经网络中的作用与原理1.1 作用与优势1.2 原理与推导 2. 将BN应用于神经网络的方法2.1 训练时的BN 2. 将BN应用于神经网络的方法2.1 训练时的BN2.2 测试时的BN代码示例&#xff08;Python&#xff09;&#xff1a; 3. BN的优…

QT学习day5

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget),socket(new QTcpSocket(this)) {ui->setupUi(this);//初始化界面ui->msgEdit->setEnabled(false);//不可用ui->sendBtn-&g…

软考121-上午题-【软件工程】-敏捷方法

一、敏捷方法 敏捷开发的总体目标是通过“尽可能早地、持续地对有价值的软件的交付”使客户满意。通过在软件开发过程中加入灵活性&#xff0c;敏捷方法使用户能够在开发周期的后期增加或改变需求。 敏捷过程的典型方法有很多&#xff0c;每一种方法基于一套原则&#xff0c;这…

初始C++之缺省参数 函数重载 引用

初始C之缺省参数 函数重载 引用& 文章目录 初始C之缺省参数 函数重载 引用&一、缺省参数1.1 缺省参数的定义1.2 缺省参数的分类1.3 注意事项 二、 函数重载2.1 函数重载的定义2.2 参数个数不同2.3 参数类型不同2.4 类型顺序不同2.5 为什么C语言不支持函数重载 三、引用…