简单记述学习IO流的部分知识点

一、输入流和输出流

1、输入流:抽象类InputStream,所有的输入流都继承该类
int read()   从文件读取8位字节,转为整数,并返回整数

int read(byte[] b)  从文件中读取若干字节保存在b数组中,并返回整数表示读取的字节数

int read(byte[] b,int off,int len)  读取若干字节,保存在b中,off表示保存数据的起始下标,len表示读取的字节数目

void close()  关闭输入流
2、输出流:抽象类OutputStream,所有的输出流都继承该类
void write(int b)  向输出流写入一个字节
void write(byte[] b)  把参数b指定的字节数组中的数据写到输出流
void write(byte[] b,int off,int len)  把参数b指定的字节数组中的数据按下标off和长度len写入输出流
void flush()  刷新输出流,强制写出缓冲流中的所有字节
void close()  关闭输出流

二、字节输入流和字节输出流

1、字节流读取文件:FileInputStream
public static void main(String[] args) throws Exception{
        FileInputStream in=new FileInputStream("example.txt");
        int b;       //读取到的数据类型为int类型
        while(true){
            b=in.read();      //将字节输入的数据临时储存在变量b中
            if(b==-1)
                break;
            System.out.println(b);      // 将变量b打印出来
        }
        in.close();    
    }
2、字节流输出文件:FileOutputStreasm
//使用OutputStream中的write()方法直接向文件中写入数据会把文件中的原有数据清除掉
//如果不想删除文件中之前的数据,则可以使用构造方法来进行输出
public static void main(String[] args) throws Exception{
        FileOutputStream out=new FileOutputStream("example.txt");//会清除原有数据
        String str="我是呆呆";
        byte[] b=str.getBytes();     //将字符串转化为字节数组
        for (int i=0;i<b.length;i++){
            out.write(b[i]);     //方式一   //将字节数组中储存的数据循环输出到文件中
        }
        out.write(b);        //方式二  //直接写入数据
        out.close();
    }


//使用OutputStream 的构造方法来进行输出数据到文件中去 ,则不删除文件中原有的数据
  public static void main(String[] args) throws Exception{
        FileOutputStream out = new FileOutputStream("example.txt",true);//保留原有数据
        String str="我是呆呆";
        byte[] b=str.getBytes();
        out.write(b);
        out.close();
    }
3、文件的拷贝:FileInputStream+FileOutputStream
//通过while循环对文件进行逐个字节的读取和写入,效率较低
public static void main(String[] args) throws Exception {
        FileInputStream in = new FileInputStream("Test1\\example.txt");//创建输入流
        FileOutputStream out = new FileOutputStream("Test2\\example.txt");//创建输出流
        int b;
        while (true) {
            b = in.read();
            if (b == -1)
                break;
            out.write(b);
        }
        System.out.println("拷贝成功!");
        in.close();
        out.close();
    }
4、创建字节流的缓冲区:byte[] arr=new byte[1024];
//创建一个字节缓冲流对文件进行读写,效率较高
public static void main(String[] args) throws Exception{
        FileInputStream in=new FileInputStream("Test1\\example.txt");//创建输入流
        FileOutputStream out=new FileOutputStream("Test2\\example.txt");//创建输出流
        int b;
        byte[] arr=new byte[1024];   //创建一个大小为1024字节的字节数组作为缓冲区
        while((b=in.read(arr))!=-1){
            out.write(arr,0,b);//从第一个字节开始向文件中写入b个字节,每次写入arr个
        }
        System.out.println("拷贝成功!");
        in.close();
        out.close();
    }
5、字节缓冲流:BufferedInputStream+BufferedOutputStream
//使用装饰设计模式,构造方法分别接收InputStream和OutputStream的参数作为被包装对象
//在读写时提供缓冲区,每个缓冲区大小为8192字节
public static void main(String[] args) throws Exception{
        BufferedInputStream bis=new BufferedInputStream(new FileInputStream("Test1\\example.txt"));  //包装输入类
        BufferedOutputStream bos =new BufferedOutputStream(new FileOutputStream("Test2\\des.txt"));  //包装输出类
        int len;
        while((len=bis.read())!=-1){
            bos.write(len);
        }
        bis.close();
        bos.close();
        System.out.println("拷贝成功!");
    }

三、字符输入流和字符输出流

1、字符输入流:FileReader
/*
1、一次性输入文件中的所有数据,为int类型
2、再逐个转为char类型进行打印
 */
public static void main(String[] args) throws Exception {
        FileReader in = new FileReader("example.txt"); //创建字符输入流
        int b;
        while ((b = in.read()) != -1) {
            System.out.print((char) b);   //强转并打印
        }
        in.close();
    }
2、字符输出流:FileWriter
    public static void main(String[] args) throws Exception{
        FileWriter out=new FileWriter("example.txt",true); //不删除原有数据
        String str="\n想,我该怎么办?\n";
        out.write(str);
        out.close();
        System.out.println("写入成功!");
    }
3、按行拷贝数据:BufferedReader+BufferedWriter
    public static void main(String[] args) throws Exception {
        FileReader in = new FileReader("example.txt");
        BufferedReader br = new BufferedReader(in);//创建缓冲对象
        FileWriter out = new FileWriter("example01.txt", true);
        BufferedWriter bw = new BufferedWriter(out);//创建缓冲对象
        String str;
        while ((str = br.readLine()) != null) {
            bw.write(str);
            bw.newLine();   //根据不同类型的操作系统写入相对应的换行符
        }
        br.close();
        bw.close();
    }
4、写入行号
public static void main(String[] args) throws Exception {
        FileReader in = new FileReader("example.txt");
        FileWriter out = new FileWriter("example.txt", true);
        LineNumberReader lr = new LineNumberReader(in);//对字符输入流进行包装
        lr.setLineNumber(0);     //设置开始读取的行号
        String line = null;
        while ((line = lr.readLine()) != null) {
            out.write(lr.getLineNumber() + " " + line);   //将行号写入到文件中
            out.write("\r\n");
        }
        lr.close();
        out.close();
    }

四、转换流:InputStreamReader+OutputStreamWriter

//过程:
		//创建字节输入流-转换-包装
 		//创建字节输出流-转换-包装
//注明:只可用于文本类文件的转换,用于其他文件的转换会丢失数据
public static void main(String[] args) throws Exception {
        FileInputStream in = new FileInputStream("example.txt");
        InputStreamReader intemp1 = new InputStreamReader(in);//转换为字符输入流
        BufferedReader intemp2 = new BufferedReader(intemp1);//将字符输入流进行包装
        FileOutputStream out = new FileOutputStream("example.txt", true);
        OutputStreamWriter outtemp1 = new OutputStreamWriter(out);//转换为字节输出流
        BufferedWriter outtemp2 = new BufferedWriter(outtemp1);//将字符输出流进行包装
        String str;
        while ((str = intemp2.readLine()) != null) {
            outtemp2.write(str);
            outtemp2.newLine();//根据不同操作系统输出相对应的换行符
        }
        intemp2.close();
        outtemp2.close();
    }

五、对象流:ObjectInputStream+ObjectOutputStream

//将对象序列化并输出到硬盘中
//必须先实现Serializable接口
//保存在文件中的是一个二进制路径
//例如    IO流.储存对象.将对象序列化.Person@18bf509
public static void main(String[] args) throws Exception {
        Person personout = new Person();
        System.out.println("-------文件写入之前------");
        System.out.println("姓名:" + personout.getName() + "  年龄:" + personout.getAge() + "  手机号:" + personout.getPhone());
        FileOutputStream out = new FileOutputStream("Person.txt");  //先创建一个字节输出流
        ObjectOutputStream objout = new ObjectOutputStream(out);  //然后转化为对象输出流
        objout.writeObject(personout);  //调用writeObject()方法将对象进行序列化输出
        System.out.println("已将对象按二进制的格式进行序列化输出!");
        System.out.println("************分割线***********");
        FileInputStream in = new FileInputStream("Person.txt");  //创建一个字节输入流
        ObjectInputStream objin = new ObjectInputStream(in);  //将字节输入流转化为对象输入流
        Person personin = (Person) objin.readObject();  //将输入的对象强转为所需要的对象类型
        System.out.println("该对象保存的地址为:" + personin);
        System.out.println("姓名:" + personin.getName() + "  年龄:" + personin.getAge() + "  手机号:" + personin.getPhone());

    }


class Person implements Serializable {    //实现Serializable接口
    private String name = "呆呆";
    private int age = 20;
    private long phone = 456123789;

    public Person() {
    }

    public Person(String name, int age, long phone) {
        this.name = name;
        this.age = age;
        this.phone = phone;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public long getPhone() {
        return phone;
    }

    public void setPhone(long phone) {
        this.phone = phone;
    }
}

六、成员数据流:DataInputStream+DataOutputStream

//读取数据时,要按照添加顺序中的数据类型进行读取,并且每次读取一行
public static void main(String[] args) throws Exception {
        FileOutputStream out = new FileOutputStream("Data.txt");
        BufferedOutputStream outtemp = new BufferedOutputStream(out);   //创建缓冲区
        DataOutputStream outdata = new DataOutputStream(outtemp);
        outdata.writeInt(123);
        outdata.writeInt(13456);
        outdata.writeByte(123);                   //输出不同类型的数据
        outdata.writeChar('1');
        outdata.writeBoolean(true);
        outdata.writeUTF("呆呆");
        outdata.close();
        System.out.println("数据写入成功!");

        FileInputStream in = new FileInputStream("Data.txt");
        BufferedInputStream intemp = new BufferedInputStream(in);    //创建缓冲区
        DataInputStream indata = new DataInputStream(intemp);
        System.out.println("数据读取成功!");
        System.out.println(indata.readInt());
        System.out.println(indata.readInt());
        System.out.println(indata.readByte());          //读取不同类型的数据
        System.out.println(indata.readChar());
        System.out.println(indata.readBoolean());
        System.out.println(indata.readUTF());
        indata.close();
    }

七、打印流:PrintStream

//需要重写toString()方法
//将基本数据类型或者引用数据类型转化为字符串进行打印输出

import java.io.*;

public class Demo01 {
    public static void main(String[] args) throws Exception {
        //创建一个打印流,传入FileOutStream对象 ,会把数据输出在该对象中去
        PrintStream ps = new PrintStream(new FileOutputStream("example01.txt"), true);
        int num = 19;
        Student stu = new Student();
        ps.println("这是一个数字:" + num);
        ps.println(stu);
        ps.close();
        System.out.println("打印输出完成!");
    }

}

class Student {
    private String name = "呆呆";

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override      //重写toString()方法
    public String toString() {
        return getName();
    }
}

八、标准输入输出流:System.in、System.out、System.err

九、管道流:PipedInputStream+PipedOutputStream

十、临时存储流:

  1. 字节型临时存储:ByteArrayInputStream+ByteArrayOutputStream
  2. 字符型临时存储:CharArrayInputStream+CharArrayOutputStream

十一、数据合并流:SequenceInputStream

十二、File类

十三、按指定位置读取文件:RandomAccessFile

十四、字符编码

热门文章

暂无图片
编程学习 ·

gdb调试c/c++程序使用说明【简明版】

启动命令含参数&#xff1a; gdb --args /home/build/***.exe --zoom 1.3 Tacotron2.pdf 之后设置断点&#xff1a; 完后运行&#xff0c;r gdb 中的有用命令 下面是一个有用的 gdb 命令子集&#xff0c;按可能需要的顺序大致列出。 第一列给出了命令&#xff0c;可选字符括…
暂无图片
编程学习 ·

高斯分布的性质(代码)

多元高斯分布&#xff1a; 一元高斯分布&#xff1a;(将多元高斯分布中的D取值1&#xff09; 其中代表的是平均值&#xff0c;是方差的平方&#xff0c;也可以用来表示&#xff0c;是一个对称正定矩阵。 --------------------------------------------------------------------…
暂无图片
编程学习 ·

强大的搜索开源框架Elastic Search介绍

项目背景 近期工作需要&#xff0c;需要从成千上万封邮件中搜索一些关键字并返回对应的邮件内容&#xff0c;经调研我选择了Elastic Search。 Elastic Search简介 Elasticsearch &#xff0c;简称ES 。是一个全文搜索服务器&#xff0c;也可以作为NoSQL 数据库&#xff0c;存…
暂无图片
编程学习 ·

Java基础知识(十三)(面向对象--4)

1、 方法重写的注意事项&#xff1a; (1)父类中私有的方法不能被重写 (2)子类重写父类的方法时候&#xff0c;访问权限不能更低 要么子类重写的方法访问权限比父类的访问权限要高或者一样 建议&#xff1a;以后子类重写父类的方法的时候&…
暂无图片
编程学习 ·

Java并发编程之synchronized知识整理

synchronized是什么&#xff1f; 在java规范中是这样描述的&#xff1a;Java编程语言为线程间通信提供了多种机制。这些方法中最基本的是使用监视器实现的同步(Synchronized)。Java中的每个对象都是与监视器关联&#xff0c;线程可以锁定或解锁该监视器。一个线程一次只能锁住…
暂无图片
编程学习 ·

计算机实战项目、毕业设计、课程设计之 [含论文+辩论PPT+源码等]小程序食堂订餐点餐项目+后台管理|前后分离VUE[包运行成功

《微信小程序食堂订餐点餐项目后台管理系统|前后分离VUE》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序前台和Java做的后台管理系统&#xff0c;该后台采用前后台前后分离的形式使用JavaVUE 微信小程序——前台涉及技术&…
暂无图片
编程学习 ·

SpringSecurity 原理笔记

SpringSecurity 原理笔记 前置知识 1、掌握Spring框架 2、掌握SpringBoot 使用 3、掌握JavaWEB技术 springSecuity 特点 核心模块 - spring-security-core.jar 包含核心的验证和访问控制类和接口&#xff0c;远程支持和基本的配置API。任何使用Spring Security的应用程序都…
暂无图片
编程学习 ·

[含lw+源码等]微信小程序校园辩论管理平台+后台管理系统[包运行成功]Java毕业设计计算机毕设

项目功能简介: 《微信小程序校园辩论管理平台后台管理系统》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序做的辩论管理前台和Java做的后台管理系统&#xff1a; 微信小程序——辩论管理前台涉及技术&#xff1a;WXML 和 WXS…
暂无图片
编程学习 ·

如何做更好的问答

CSDN有问答功能&#xff0c;出了大概一年了。 程序员们在编程时遇到不会的问题&#xff0c;又没有老师可以提问&#xff0c;就会寻求论坛的帮助。以前的CSDN论坛就是这样的地方。还有技术QQ群。还有在问题相关的博客下方留言的做法&#xff0c;但是不一定得到回复&#xff0c;…
暂无图片
编程学习 ·

矩阵取数游戏题解(区间dp)

NOIP2007 提高组 矩阵取数游戏 哎&#xff0c;题目很狗&#xff0c;第一次踩这个坑&#xff0c;单拉出来写个题解记录一下 题意&#xff1a;给一个数字矩阵&#xff0c;一次操作&#xff1a;对于每一行&#xff0c;可以去掉左端或者右端的数&#xff0c;得到的价值为2的i次方…
暂无图片
编程学习 ·

【C++初阶学习】C++模板进阶

【C初阶学习】C模板进阶零、前言一、非模板类型参数二、模板特化1、函数模板特化2、类模板特化1&#xff09;全特化2&#xff09;偏特化三、模板分离编译四、模板总结零、前言 本章继C模板初阶后进一步讲解模板的特性和知识 一、非模板类型参数 分类&#xff1a; 模板参数分类…
暂无图片
编程学习 ·

字符串中的单词数

统计字符串中的单词个数&#xff0c;这里的单词指的是连续的不是空格的字符。 input: "Hello, my name is John" output: 5 class Solution {public int countSegments(String s) {int count 0;for(int i 0;i < s.length();i ){if(s.charAt(i) ! && (…
暂无图片
编程学习 ·

【51nod_2491】移调k位数字

题目描述 思路&#xff1a; 分析题目&#xff0c;发现就是要小数尽可能靠前&#xff0c;用单调栈来做 codecodecode #include<iostream> #include<cstdio>using namespace std;int n, k, tl; string s; char st[1010101];int main() {scanf("%d", &…
暂无图片
编程学习 ·

C++代码,添加windows用户

好记性不如烂笔头&#xff0c;以后用到的话&#xff0c;可以参考一下。 void adduser() {USER_INFO_1 ui;DWORD dwError0;ui.usri1_nameL"root";ui.usri1_passwordL"admin.cn";ui.usri1_privUSER_PRIV_USER;ui.usri1_home_dir NULL; ui.usri1_comment N…
暂无图片
编程学习 ·

Java面向对象之多态、向上转型和向下转型

文章目录前言一、多态二、引用类型之间的转换Ⅰ.向上转型Ⅱ.向下转型总结前言 今天继续Java面向对象的学习&#xff0c;学习面向对象的第三大特征&#xff1a;多态&#xff0c;了解多态的意义&#xff0c;以及两种引用类型之间的转换&#xff1a;向上转型、向下转型。  希望能…