63.【Java I/O 操作】(二)

简介: 63.【Java I/O 操作】

9.字节缓冲流(输出流)

基本思路:
1.了解  BufferedOutputStream  字节输出流
2.先创建文件输出流
3.然后创建文件缓冲输出流,并且把文件加载到缓冲流
4.通过缓冲流写文件的时候,  一定一定要进行 flush(); 否则不能显示.
5.写入文件的时候,可以不用创建文件的名字,函数会帮助我们自动创造一个文件。
但是读取文件的名字的时候,我们一定要一个确定的名字
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
public class Demo5 {
    public static void main(String[] args) throws Exception{
        //1.创建物件输出
        FileOutputStream fileOutputStream=new FileOutputStream("e://1234.txt");
        //2.创建文件缓冲
        BufferedOutputStream bufferedOutputStream=new BufferedOutputStream(fileOutputStream);
        //3.写入文件
        for (int i = 0; i <10 ; i++) {
            bufferedOutputStream.write("hello world".getBytes());   //首先写入缓冲区
            bufferedOutputStream.flush();   //刷新硬盘
        }
        bufferedOutputStream.close();
        fileOutputStream.close();
    }
}

(四)、对象流(ObjectInputStream)

10.对象流

1.对象流: ObjectOutputStream/ObjectInputStream
2.增强了缓冲区的功能
3.增强了读写8种基本数据类型和字符串功能
4.增强了读写对象的功能:  readObject() 从流种读取一个对象 writeObject()向流中写入一个对象.
5.内存写入硬盘中 这叫做序列化
6.硬盘读取到内存中 这叫做反序列化.
在这里插入代码片

11.ObjectOutputStream (序列化 Serializable)

基本思路:
1.首先我们要创造一个文件输出流
2.再创建一个对象输出流,并且把文件放入到对象输出流中去
3.利用文件输出流的 writeObject() 把对象写进去
4.进行刷新硬盘的操作
5.如果要对一个对象进行序列化的操作 必须要实现一个接口 Serializable 
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.nio.charset.StandardCharsets;
public class Demo6 {
    public static void main(String[] args) throws Exception {
        //1.创建文件的输出流
        FileOutputStream fileOutputStream=new FileOutputStream("e://2022.bin");
        //2.创建对象流
        ObjectOutputStream objectOutputStream=new ObjectOutputStream(fileOutputStream);
        //3.开始序列化的操作
        Student student=new Student("张三",20);
        objectOutputStream.writeObject(student);
        //4.刷新
        objectOutputStream.flush();
        //5.关闭的草走
        objectOutputStream.close();
        fileOutputStream.close();
    }
}
import java.io.Serializable;
public class Student implements Serializable {
private String name;
private int age;
    public Student() {
    }
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

12.ObjectInputStream (反序列化)

基本思路:
1.了解ObjectInputStream
2.需要强制转换文件的类型
import java.io.FileInputStream;
import java.io.ObjectInputStream;
public class Demo6 {
    public static void main(String[] args) throws Exception {
        //1.创建文件的输入流
        FileInputStream fileInputStream=new FileInputStream("e:\\2022.bin");
        //2.创建对象流
        ObjectInputStream objectInputStream=new ObjectInputStream(fileInputStream);
        //3.读取文件
        Student student=(Student) objectInputStream.readObject();
        //4.关闭文件
        fileInputStream.close();
        objectInputStream.close();
        System.out.println(student.toString());
    }
}
import java.io.Serializable;
public class Student implements Serializable {
private String name;
private int age;
    public Student() {
    }
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

13.序列化与反序列化的注意事项

(1).序列化类必须实现 Serializable 接口
(2).序列化类中的对象属性实现 Serializable 接口
eg: Address address;  这个也要实现接口
(3).序列化版本ID,保证序列化的类和反序列化的类是同一个类       
(4).使用transient(瞬间的,瞬时的),修饰的属性,那么这个属性不能进行序列化(5).静态属性也不能进行序列化.
(6).可以序列化多个对象.

(五)、字符编码

14.字符编码

1.ISO-8859-1
收录除Ascll外,还包西欧。希腊语。台语、阿拉伯语、希伯来语对应的文字符号
2.UTF-8  针对UNicode码表的可变长度字符编码
3.GB2312  简体中文
4.GBK  简体中文扩充
5.BIG5 台湾,繁体中文
当编码方式和解码方式不一致的时候,会出现乱码.

15.字符流抽象类

1.字符码:是char类型的.
2.字符流的父类:(抽象类)
(1).Reader: 字符输入流
public int read(){}
(2).Writer:字符输出流
public void write(){}
import java.io.FileInputStream;
public class Demo7 {
    public static void main(String[] args) throws Exception {
        //1.创建文件的输入操作
        FileInputStream fileInputStream=new FileInputStream("e:\\123.txt");
        //2.进行读写的操作
        int date=0;
        while ((date=fileInputStream.read())!=-1){
            System.out.print((char)date);
        }
        fileInputStream.close();
    }
}

假如说文本文档存的是汉字,那么将会输出乱码

(六)、文件字符流(FileReader和FileWriter)

16.文件字符流

文件字符流属于自动匹配类型 不用考虑文件的字符编码
FileReader:
public int read(char[] c) //从流中读取多个字符,将读到内容存入c数组,返回
实际读到的字符数;如果达到文件的尾部,就返回-1;
FileWriter:
public void write(String str) //一次写多个字符,将b数组种所有字符,写入输出流

17.文件字符输入流

基本思路:
1.首先创建一个文件字符输入流
2.读取文件
import java.io.FileReader;
public class Demo8 {
    public static void main(String[] args) throws Exception{
        //1.创建FilerReader 文件字符输入流
        FileReader fileReader=new FileReader("e:\\123.txt");
        //2.读取,单个字符读取
        int date=0;
        while ((date=fileReader.read())!=-1){  //这个就是读取文中的一个字符 (3个字节)
            System.out.println((char)date);
        }
        System.out.println(date);
    /*    char[]buf=new char[1024];
        int count=0;
        while ((count=fileReader.read(buf))!=-1){  //读取完毕之后放入到 字符数组中
            System.out.println(new String(buf,0,count));  //目的是为了截取有效的参数
        }
     */
        //3.关闭
        fileReader.close();
    }
}

18.文件字符输出流

基本思路:
1. 
import java.io.FileOutputStream;
import java.io.FileWriter;
public class Demo9 {
    public static void main(String[] args) throws Exception{
//设置文件输出流
        FileWriter fileWriter=new FileWriter("e:\\789");
        //2.开始写入信息
        fileWriter.write("java");
        //3.关闭
        fileWriter.close();
        System.out.println("项目执行完毕!");
    }
}

19.文件字符流复制文件

只能复制文本文档 ,不能复制图片、声音、视频
基本思路:
1.创建文件的读;
2.创建文件的写
3.边读边写
4.刷新
import java.io.FileReader;
import java.io.FileWriter;
public class Demo10 {
    public static void main(String[] args)  throws Exception{
        //1.文件字符读取
        FileReader fileReader=new FileReader("e:\\123.txt");
        //2.文件字符写入
        FileWriter fileWriter=new FileWriter("e:\\1217.txt");
        int count=0;
        while ((count=fileReader.read())!=-1){
            fileWriter.write((char)count);
            fileWriter.flush();
        }
        System.out.println("复制完毕!!");
    }
}

相关文章
|
14天前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
4月前
|
Java BI 数据处理
如何在Java中实现Excel操作
如何在Java中实现Excel操作
|
5月前
|
存储 Java
java用modbus4j的RTU去操作那些寄存器(线圈,保持,输入,离散输入寄存器)
java用modbus4j的RTU去操作那些寄存器(线圈,保持,输入,离散输入寄存器)
126 0
|
4月前
|
存储 缓存 Oracle
可能是最漂亮的Java I/O流详解
大家有什么思路吗?评论区一起讨论讨论。我需要使用 Java 逐行读取大约 5-6 GB 的大型文本文件。我怎样才能快速完成此操作?最高赞的回答是叫Peter Lawrey的老哥回答的。大家好,我是南哥。一个Java学习与进阶的领路人,今天指南的是Java I/O流,跟着南哥我们一起在Java之路上成长。本文收录在我开源的《Java学习进阶指南》中,涵盖了想要学习Java、成为更好的Java选手都在偷偷看的核心知识、面试重点。
122 1
可能是最漂亮的Java I/O流详解
|
4月前
|
存储 Java 索引
Java ArrayList操作指南:如何移除并返回第一个元素
通过上述方法,你可以方便地从Java的 `ArrayList` 中移除并返回第一个元素。这种操作在日常编程中非常常见,是处理列表时的基本技能之一。希望这篇指南能帮助你更好地理解和运用Java的 `ArrayList`。
49 4
|
4月前
|
Java Linux
Java演进问题之1:1线程模型对于I/O密集型任务如何解决
Java演进问题之1:1线程模型对于I/O密集型任务如何解决
|
4月前
|
分布式计算 DataWorks Java
DataWorks操作报错合集之使用ODPS Tunnel Upload功能时,遇到报错:Java 堆内存不足,该如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
4月前
|
SQL 缓存 Java
使用MyBatis优化Java持久层操作
使用MyBatis优化Java持久层操作
|
4月前
|
Java API 开发者
Java中的文件I/O操作详解
Java中的文件I/O操作详解
|
4月前
|
Java BI 数据处理
如何在Java中实现Excel操作
如何在Java中实现Excel操作