700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > IO流 字节和字符的输入输出

IO流 字节和字符的输入输出

时间:2021-12-01 05:34:22

相关推荐

IO流 字节和字符的输入输出

IO流,字节和字符的输入输出

i:input输入(读取)

o:output输出(写入)

流:数据(字符,字节),一个字符=2个字节,1个字节=8个二进制位

由硬盘读取到内存中被称为输入(读取),反之则为输出(写入)。

字节流

2.1 一切皆为字节

一切文件数据(文本、图片、视频等)在储存时,都是以二进制数字的形式保存,都一个一个的字节,那么传输时一样如此,所以字节流可以传输任意文件数据,在操作流的时候,我们要时刻明确,无论使用什么样的流对象,底层传输的至始至终都为二进制数据

2.2 字节输出流【OutputStream】

java.io.OutputStream抽象类是表示字节输出流的所有类的超类,将指定的字节信息写出到目的地。它定义了字节输出流的基本共性功能方法。

实现接口以及子类

接口方法

2.2.1FileOutputStream文件字节输出流

作用:把内存中的数据写入到硬盘文件中

构造方法:

FileOutputStream(File file)创建文件输出流以写入由指定的File对象表示的文件

FileOutputStream(String name)创建文件输出流以指定的名称写入文件

参数为写入数据的目的地

String name:目的地是一个文件的路径

File file:目的地是一个文件

构造方法的作用

1.创建一个FileOutputStream对象

2.会根据构造方法中传递的文件/文件路径,创建一个空的文件

3.会把FileOutputStream对象指向创建好的文件

写入数据原理(内存–>硬盘)

java程序–>JVM–>OS(操作系统)–>os调用写数据的方法–>把数据写入到文件中

字节输出流的使用步骤

​ 1.创建一个FileoutputStream对象,构造方法中传递写入数据的目的地

​ 2.调用FileOutputStream对象中的方法write,把数据写入到文件中

​ 3.释放资源(流使用会占用一定的内存,使用完毕要把内存清空,提升程序效率)

注意事项

fos.write(int b)

写数据的时候会将10进制的整数,转换为二进制整数

写换行:写换行符号

windows:\r\n

linux:/n

mac:/r

例如写入97

public class DemoOutPutStream {public static void main(String[] args) throws IOException {FileOutputStream fos=new FileOutputStream("C:\\Users\\Administrator\\Desktop\\Study\\src\\com\\bainan\\io\\a.txt");fos.write(97);fos.close();}}

fos.write(1100001);97–>1100001

任意的文本编辑器再打开文件的时候都会查询编码表,把字节转化为字符表示

0-127:查询ASCII表

其他值:查询系统默认码表(中文系统GBK)

写入的时候如果需要是在原本文本内容后追加内容使用俩个参数的构造方法

FileOutputStream(File file, boolean append)创建文件输出流以写入由指定的File对象表示的文件。FileOutputStream(String name, boolean append) 创建文件输出流以指定的名称写入文件。

参数:

File file,String name:写入数据的目的地

boolean append:追加写开关true:创建对象不会覆盖原文件,继续在文件的末尾追加写数据。false:创建一个新文件,覆盖原文件

public class DemoOutoutStream03 {public static void main(String[] args) throws IOException {FileOutputStream fos=new FileOutputStream("C:\\Users\\Administrator\\Desktop\\Study\\src\\com\\bainan\\io\\b.txt",true);for (int i = 0; i < 10; i++) {fos.write("你好".getBytes());fos.write("\r\n".getBytes());}fos.close();}}

2.3 字节输入流【InputStream】

java.io.InputStream:字节输入流

此抽象类表示字节输入流所有类的超类。

定义了所有子类共性的方法 如下

read(byte[] b)从该输入流读取最多b.length个字节的数据为字节数组。

read(byte[] b, int off, int len)从该输入流读取最多len字节的数据为字节数组。

read()` 从该输入流读取一个字节的数据。

close()` 关闭此文件输入流并释放与流相关联的任何系统资源。

2.3.1文件字节输入流FileInputStream

FileInputStream的作用是把硬盘文件中的数据,读取到内存中使用。

构造方法:

FileInputStream(File file)通过打开与实际文件的连接创建一个FileInputStream,该文件由文件系统中的File对象file命名。

FileInputStream(String name)通过打开与实际文件的连接来创建一个FileInputStream,该文件由文件系统中的路径名name命名。

参数:

File file:文件的路径

String name:文件

构造方法作用:

1.会创建一个FileInputStream对象

2.会把FileInputStream对象指定构造方法中要读取的文件

读取数据原理(硬盘–>内存):

java程序–>JVM–>OS(操作系统)–>OS调用读取数据的方法–>读取文件

字节输入流的使用步骤

1.创建FileInputStream对象,构造方法中绑定要读取的数据源

2.使用FileInputStream对象中的方法read(),读取文件

3.释放资源

案例:

public class Demo01InputStream {public static void main(String[] args) throws IOException {FileInputStream fis=new FileInputStream("C:\\Users\\Administrator\\Desktop\\Study\\src\\com\\bainan\\io\\a.txt");int b=0;while ((b=fis.read())!=-1){System.out.print((char) b);}fis.close();}}

字节输入流一次读取多个字节的方法

int read(byte[] b)从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中

方法的参数byte[]的作用?

​ 数组:缓冲作用,存储读取到的多个字节,数组的长度一般定义为1024(1kb)或者1024的整数倍

new byte[5]//一次读取5个字节

方法的返回值int是什么?

​ 每次读取的有效字节个数。

例如

/*String类的构造方法String(Byte[] bytes):把字节数组转化为字符串String(Byte[] bytes,int offset,ine length):把字节数组一部分转化为字符串 offset:数组开始索引,length:转化的字节个数*/public class Demo02InputStream {public static void main(String[] args) throws IOException {FileInputStream fis=new FileInputStream("C:\\Users\\Administrator\\Desktop\\Study\\src\\com\\bainan\\io\\b.txt");byte[] bytes=new byte[1024];//存取读取到的多个字节int len=0;//记录每次读取的有效个数while ((len=fis.read(bytes))!=-1){System.out.println(new String(bytes,0,len));}fis.close();}}

字符流

当使用字节流读取文本文件时,遇到中文字符时。可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节储存,所以java提供了一些字符流类,以字符为单位读写数据,专门用于处理文本文件。

3.1 字符输入流【Reader】

java.io.Reader:字符输入流,是字符输入流的最顶层的父类,定义了一些共性的成员方法,是一个抽象类

共性的成员方法

int read():读一个字符并返回

read(char[] cbuf):将字符读入数组。

abstract void close()关闭流并释放与之相关联的任何系统资源。

**FileReader:**文件字符输入流

作用:把硬盘文件中的数据以字符的方式读取到内存中。

构造方法:

作用:

1.创建一个FileReader对象

2.会把FileReader对象指向要读取的文件

字符输入流使用步骤:

1.创建FileReader对象,构造方法中绑定要读取的数据源

2.使用FileReader对象中的方法read读取文件

3.释放资源

例子:使用方法与字节输入流大致相同

public class Demo01Reader {public static void main(String[] args) throws IOException {FileReader fr=new FileReader("C:\\Users\\Administrator\\Desktop\\Study\\src\\com\\bainan\\io\\c.txt");int len=0;char[] a=new char[1024];while ((len=fr.read(a))!=-1){System.out.println(new String(a,0,len));}fr.close();}}

3.2 字符输出流【Writer】

java.io.Writer抽象类是表示用于写出字符的所有类的超类,将指定的字符信息写到目的地,它定义了字节输出流的基本方法共性。

共性的成员方法:

abstract void close()关闭流,先刷新。abstract void flush()刷新流。void write(char[] cbuf)写入一个字符数组。abstract void write(char[] cbuf, int off, int len)写入字符数组的一部分。void write(int c)写一个字符void write(String str)写一个字符串void write(String str, int off, int len)写一个字符串的一部分。

FileWriter:文字字符输出流

作用:把内存中的字符数据写入到文件中

构造方法:

FileWriter(File file)给一个File对象构造一个FileWriter对象。FileWriter(File file, boolean append)给一个File对象构造一个FileWriter对象。FileWriter(FileDescriptor fd)构造与文件描述符关联的FileWriter对象。FileWriter(String fileName)构造一个给定文件名的FileWriter对象。FileWriter(String fileName, boolean append)构造一个FileWriter对象,给出一个带有布尔值的文件名,表示是否附加写入的数据。

参数:写入数据的目的地

String fileName:文件的路径

File file:是一个文件

构造方法

1.创建一个FileWriter对象

2.会根据构造方法中传递的文件/文件的路径,创建文件

3.会把FileWriter对象指向创建好的文件

字符输出流的使用步骤

1.创建FileWriter对象,构造方法中绑定写入数据的目的地

2.使用FileWriter中的方法write()把数据写到内存缓冲区中(字符转换为字节的过程)

3.使用FileWriter的方法flush,把内存缓冲区中的数据,刷新到文件中

4.释放资源(会先把内存缓冲区中的数据刷新到文件中)

例如:

public class Demo01Writer {public static void main(String[] args) throws IOException {//1.创建FileWriter对象,构造方法中绑定写入数据的目的地FileWriter fw=new FileWriter("C:\\Users\\Administrator\\Desktop\\Study\\src\\com\\bainan\\io\\d.txt");//2.使用FileWriter中的方法write()把数据写到内存缓冲区中(字符转换为字节的过程)char[] chars={'1','你','好','a'};fw.write(chars);//3.使用FileWriter的方法flush,把内存缓冲区中的数据,刷新到文件中// fw.flush();//4.释放资源(会先把内存缓冲区中的数据刷新到文件中)fw.close();}}

flush和close方法的区别

flush:刷新缓冲区,流对象可以继续使用

close:先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了

续写与换行与FileOutputStream类似

使用俩个参数的构造方法

FileWriter(File file, boolean append)FileWriter(String fileName, boolean append)

public class Demo04Writer {public static void main(String[] args) throws IOException {FileWriter fw=new FileWriter("C:\\Users\\Administrator\\Desktop\\Study\\src\\com\\bainan\\io\\d.txt",true);for (int i = 0; i < 5; i++) {fw.write("Hello"+i+"\r\n");}fw.close();}}

JDK7新特性

在try的后边可以增加一个(),在括号中可以定义流对象,那么这个流对象的作用域就在try中有效try中的代码执行完毕,会自动把流对象释放,而不用写finally

格式:

try(定义流对象;定义流对象…){

​ 可能会出现异常的语句

}catch(异常类变量 变量名){

异常处理逻辑

}

例如将文件复制代码稍作修改

public class Demo01JDK7 {public static void main(String[] args) {long s=System.currentTimeMillis();try( FileOutputStream fos=new FileOutputStream("C:\\Users\\Administrator\\Desktop\\Study\\src\\com\\bainan\\io\\3.jpg");FileInputStream fis=new FileInputStream("C:\\Users\\Administrator\\Desktop\\Study\\3.jpg");){byte[] bytes=new byte[1024];int len=0;while ((len=fis.read(bytes))!=-1){fos.write(bytes);}}catch (IOException e){System.out.println(e);}long b=System.currentTimeMillis();System.out.println("本次操作共耗时为"+(b-s)+"毫秒");}}

JDK9的新特性

try的前面可以定义流对象,在try后边的()中可以直接引入流对象的名称(变量名),在try代码执行完毕后,流对象也可以释放掉,不用写finally

格式:

A a = new A();B b = new B();try(a,b){可能会出现异常的语句}catch(异常类变量 变量名){异常处理逻辑

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。