java中I/O流之字节流和字符流学习总结(下)

简介: java中I/O流之字节流和字符流学习总结(下)

三、字节输入流:(InputStream)(重点)


InputStream可以实现数据的读取操作,在java中InputStream类的定义如下:


public abstract class InputStream implements Closeable


InputStream类中定义有三个数据的读取操作方法:


  • 读取单个字节:public abstract int read() throws IOException;
      每次执行此方法将读取当个字节数据,如果已经读取完成了,那么最后返回-1。


image.png


读取数据到字节数组中:public int read(byte b[]) throws IOException.最常用方法

每次讲数据读取到数组之中,那么会返回一个读取长度的数据,如果没有数据则返回的长度为-1,可是要考虑两种情况:

   要读取的内容大于开辟的数组内容:长度就是整个数组的长度。

   要读取的内容小于开辟数组的内容,

长度就是全部最后的内容长度,数组装不满。


读取部分内容到字节数组中:public int read(byte b[], int off,int len) throws IOException;

每次读取内容到部分字节数组,只允许读取满限制的数组的字节个数。此方法依然会返回读取的长度。


整个操作跟输出的形式几乎是相同的,参数的类型及作用也几乎是相同的。


InputStream是一个抽象类,所以要进行文件的读取使用FileInputStream子类,子类定义的构造方法如下:


构造方法:public FileInputStream(File file) throws FileNotFoundException.

范例:实现数据的读取


package lisy;
import java.awt.print.Printable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.sql.Date;
import java.text.SimpleDateFormat;
@SuppressWarnings("unused")
public class Demo {
    public static void main(String[] args) throws IOException {
        //第一步:定义要输出的文件的File类对象
        File file = new File("e:"+File.separator+"hello"+File.separator+"my.txt");
        //第二步:实例化InputStream
        InputStream input = new FileInputStream(file);
        //实现数据的读取操作
        byte data[] = new byte[1024];
        int len = input.read(data);//将数据读取到数组之中
        System.out.println("读取的内容【" +new String(data,0,len)+"】");
        //第四步关闭输入流
        input.close();
    }
}


使用InputStream类中提供的一个read()方法,这个方法可以实现单个字节数据的读取操作。

范例:读取单个字节


package lisy;
import java.awt.print.Printable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.sql.Date;
import java.text.SimpleDateFormat;
import javax.swing.table.TableModel;
@SuppressWarnings("unused")
public class Demo {
    public static void main(String[] args) throws IOException {
        //第一步:定义要输出的文件的File类对象
        File file = new File("e:"+File.separator+"hello"+File.separator+"my.txt");//你的路径
        //第二步:实例化InputStream
        InputStream input = new FileInputStream(file);
        //实现数据的读取操作
        byte data[] = new byte[1024];
        int foot = 0;//控制保存的脚标索引
        int temp = 0;//接收每次保存的字节数据
        //while循环实际上按照由里向外的原则执行,它的执行分为两步:
        //第一步:“temp = input.read()”,表示读取一个字节保存到temp变量之中。
        //第二步:“(temp = input.read()) != -1”判断读取出来的temp内容是否为-1,
        //如果不是-1则表示还有数据,则进行保存。
        while((temp = input.read()) != -1);{
            data[foot ++] = (byte) temp;
        }
        System.out.println("读取的内容【" +new String(data,0,foot)+"】");
        //第四步关闭输入流
        input.close();
    }
}


四、字符输出流:(Writer)

Writer是进行字符输出操作使用的类,这个类属于抽象类,观察定义:


public abstract class Writer implements Appendable, Closeable, Flushable


这个Writer类可以直接输出字符串:public void write(String str) throws IOException

Writer是一个抽象类,要进行文件字符流操作,其构造方法为:

public FileWriter(File file)。

范例:使用Writer输出数据


package lisy;
import java.awt.print.Printable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Writer;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.sql.Date;
import java.text.SimpleDateFormat;
import javax.swing.table.TableModel;
@SuppressWarnings("unused")
public class Demo {
    public static void main(String[] args) throws IOException {
        //第一步:定义要输出的文件的File类对象
        File file = new File("e:"+File.separator+"hello"+File.separator+"my.txt");//你的路径
        if(!file.getParentFile().exists()) {
            file.getParentFile().mkdirs();
        }
        Writer out = new FileWriter(file);
        String str = "一定要好好学习,天天向上。。。";
        out.write(str);
        out.close();
    }
}


虽然Writer类提供有字符数组的输出操作能力,但是从本质上来讲使用Writer类就意味着要执行字符串的直接输出。


字符流最适合操作中文,但并不意味着字节流就无法操作中文。


五、字符输入流:(Reader)

Reader一定是一个抽象类,其定义为:


public abstract class Reader extends Object implements Readable,Closeable


在Reader类中也提供有一系列的read()方法。

  • 数据的读取:public int read(char[] cbuf) throws IOException。

范例:数据的读取


package lisy;
import java.awt.print.Printable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.io.Writer;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.sql.Date;
import java.text.SimpleDateFormat;
import javax.sql.rowset.CachedRowSet;
import javax.swing.table.TableModel;
@SuppressWarnings("unused")
public class Demo {
    public static void main(String[] args) throws IOException {
        //第一步:定义要输出的文件的File类对象
        File file = new File("e:"+File.separator+"hello"+File.separator+"my.txt");//你的路径
        if(file.exists()) {
            Reader in = new FileReader(file);
            char data[] = new char[1024];
            int len = in.read(data);//向字符数组保存数据,返回长度。
            System.out.println(new String(data,0,len));
            in.close();
        }
    }
}


六、字节流与字符流的区别

首先必须要明确一点,通过任何终端(网络、文件)读取或者输出的数据都一定是字节,但是字符是经过内存处理后的数据。


字符输入:字节(磁盘)–> 自动转换为 –>字符(内存);


字符输出:字符(内存)–> 自动转换为–>字节(磁盘);


在利用字符流输出的时候,所有的内容实际上都只是输出到了缓冲区中(内存)。在使用close()方法关闭的时候会将我们缓冲区的数据进行输出,如果没有关闭,那么就将无法进行输出,此时可以利用flush()方法进行强制的输出。


字符使用到了缓冲区,而字节流没有使用到缓冲区。


如果处理中文使用字符流,其他的任何数据都使用字节流。


目录
相关文章
|
25天前
|
XML Java 编译器
Java学习十六—掌握注解:让编程更简单
Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。
86 43
Java学习十六—掌握注解:让编程更简单
|
13天前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
10天前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
1月前
|
存储 SQL 小程序
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
这篇文章详细介绍了Java虚拟机(JVM)的运行时数据区域和JVM指令集,包括程序计数器、虚拟机栈、本地方法栈、直接内存、方法区和堆,以及栈帧的组成部分和执行流程。
31 2
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
|
18天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
1月前
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
41 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
|
1月前
|
前端开发 Java 应用服务中间件
Javaweb学习
【10月更文挑战第1天】Javaweb学习
31 2
|
1月前
|
存储 缓存 Java
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
34 1
|
1月前
|
存储 算法 Java
带你学习java的数组军队列
带你学习java的数组军队列
34 0
|
1月前
|
Java 大数据 开发工具
java学习——环境准备(1)
java学习——环境准备(1)
42 0