IO流
用来处理设备之间的数据传输
IO流的分类:按流向:输入流(读取数据);输出流(写出数据)
按数据类型:字节流:
字节输入流 读取数据 InputStream
字节输出流 写出数据 OutputStream
字符流:为了方便操作文本数据
字符输入流 读取数据 Reader
字符输出流 写出数据 Writer
InputStream,OutputStream,Reader,Writer都是抽象类,不能实例化,所以我们要使用具体的子类。每种基类的子类都是以父类名作为后缀名:
XxxOutputStream,XxxInputStream,XxxReader,XxxWriter
FileOutputStream:
构造方法:FileOutputStream(File file)
FileOutputStream(String name)
FileOutputStream(String name;Boolean ture)
成员方法:public void wirte(int b):
public void wirte(byte[] b):
public void wirte(byte[] b, int off, int len)
字节输出流操作步骤:创建字节输出流–>写数据–>释放资源,关闭此文件输出流并释放与此流有关的所有系统资源(.close() )
创建字节输出流对象做了几件事情:
A. 调用系统功能去创建文件
B. 创建FileOutputStream对象
C. 把对象指向这个文件
为什么一定要close()呢?
A. 让流对象变成垃圾,这样就可以被垃圾回收器回收了
B. 通知系统去释放跟该文件相关的资源
实现数据换行
加换行符号:
Windos:\r\n; linux:\n; Mac: \r;
如何实现追加写入数据:
使用构造方法:FileOutputStream(String name;Boolean ture)
写入数据时的异常处理:
FileInputStream
字节输入流操作步骤:创建字节输入流对象–>调用read()方法读取数据,并把数据显示在控制台–>释放资源
构造方法同FileOutputStream
成员方法:public int read(): 一次读取一个字节
public int read(byte[] b): 一次读取一个字节数组 返回值是实际读取的字节个数。如果到末尾就返回-1
计算机时如何识别什么时候该把两个字节转换为一个中文呢?
在计算机中中文的存储分两个字节:第一个字节肯定是负数,第二个字节常见是负数,可能是正数。但是没有影响。
通过定义数组的方式确实比以前一次读取一个字节的方式快很多,所以,缓冲区非常有用,java就在开始设计的时候,提供了带缓冲区的字节类。这种类被称为:缓冲区类(高效类)。写数据:BufferedOutputStream;读数据:BufferedInputStream
构造方法可以指定缓冲区的大小,但是我们一般用不上,因为默认缓冲区大小足够了。
为什么不传递一个具体的文件或者文件路径,而是传递一个OutputStream对象呢?因为字节缓冲区流仅仅提供缓冲区,为高效而设计的,但是真正的读写操作还得靠基本的流对象实现.
字符流 = 字节流 + 编码表(由现实世界的字符和对应的数值组成的一张表)
String类中的编码和解码问题:
String(byte[] bytes, String charsetName): 通过指定的字符集解码字节数组
byte[] getBytes(String charsetName):使用指定的字符集合把字符串编码为字节数组
OutputStreamWrite
OutputStreamWriter(OutputStream out): 根据默认编码把字节流的数据转换为字符流
OutputStreamWriter(OutputStream out, String charsetName):根据指定编码把字节流数据转换为字符流
字符流的五种写数据的方法:
public void write(int c):写一个字符
public void write(char[] cbuf):写一个字符数组
public void write(char[] cbuf,int off,int len):写一个字符数组的一部分
public void write(String str):写一个字符串
public void write(String str,int off,int len):写一个字符串的一部分
close()和flush()的区别?
A:close()关闭流对象,但是先刷新一次缓冲区。关闭之后,流对象不可以继续再使用了(即不能书写和读取数据,否则报错)。
B: 仅仅刷新缓冲区,刷新之后,流对象还可以继续使用。
InputStreamReader
InputStreamReader(InputStream is): 用默认的编码读取数据
InputStreamReader(InputStream is, String charsetName): 根据指定的编码读取数据
字符流读数据的两种方法:
public int read():一次读取一个字符
public int read(char[] chs):一次读取一个字符数组
由于我们常见的操作都是使用本地默认编码,所以,不用指定编码。
而转换流的名称有点长,所以,Java就提供了其子类供我们使用 FileWriter, FileReader
字符缓冲流
字符流为了高效读写,也提供了对应的字符缓冲流
BufferedWriter:字符缓冲输出流:将文本写入字符输出流,缓冲各个字符,从而提供的单个字符,数组和字符串的高效写入。可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了
BufferedReader:字符缓冲输入流:从字符输入流中读取文本,缓冲各个字符,从而提供的单个字符,数组和字符串的高效写入。可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了
特殊方法:
BufferedWriter: public void newLine(): 根据系统来决定换行符
BufferdReader:public String readLine(): 一次读取一个一行数据
操作基本数据类型的流
可以读写基本类型的数据
数据输入流:DataInputStream
DataInputStream(InputStream in)
数据输出流: DataOutputStream
DataOutputStream(OutputStream out)
内存操作流: 用于处理临时存储信息的,程序结束,数据就从内存中消失
操作字节数组
ByteArrayInputStream
ByteArrayOutputStream
操作字符数组
CharArrayReader
CharArrayWriter
操作字符串
StringReader
StringWriter
打印流
字节打印流 PrintStream
字符打印流 PrintWriter
只有写数据的,没有读数据的,只能操作目的地,不能操作数据源
可以操作任意类型的数据
print() println()
如果启动了自动刷新,能够自动刷新
PrintWriter pw = new PrintWriter(new FileWriter(“pw2.txt”),ture);
还是应该调用println()的方法才可以
这个时候不仅仅自动刷新了,还实现了数据的换行
该流是可以直接操作文本文件的
哪些流对象是可以直接操作文本文件的呢?
FileInputStream FileOutputStream
FileReader FileWriter
PrintStream PrintWriter
看API,查流对象的构造方法,如果同时有File类型和String类型的参数,一般来说就是可以直接操作文件的
基本流:能够直接读写文件的
高级流:在基本流的基础上提供了一些其他的功能
标准输入输出流
System类中的两个成员变量:
public static final InputStream in “标准”输入流。
public static final PrintStream out “标准”输出流。
InputStream is = System.in;
PrintStream ps = System.out;
随机访问流
不属于流,是Object类的子类,但它融合了InputStream和OutputStream的功能,支持对文件的随机访问读取和写入。
public RandomAccessFile(String name, String mode): 第一个参数是文件路径,第二个参数是操作文件的模式。模式一般常用’rw’,既可以写数据也可以读数据
Original: https://www.cnblogs.com/AICROC/p/13821358.html
Author: 生于思考
Title: Java复习,Java知识点以及Java面试题(七)
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/643077/
转载文章受原作者版权保护。转载请注明原作者出处!