一般初学者在学习的时候都是程序在内容运行后,当程序关闭后者关机后,内容就会消失,这是因为东西在内存中运行,没有写到硬盘或者其他的存储设备上。io流提供了内存和存储之间的连接通道。
这里说的读取和输出选择的参考系或者说参考对象是内存(即要运行的程序)。
java提供了两种方式进行输入输出:分别是字节流和字符流。
一:字节流:对计算机来说所有的东西都是字节包括文字、视频、音频等等。
输出:java对字节输出提供了FileOutPutStream类来进行操作,①通过创建对象,②使用提供的构造方法,③参数可以传入要保存具体地址的字符串,也可以传入对象。
1.通过FileOutputStream类提供的write()方法,可不加参数每次输出一个字节,也可以加入byte[]数组,每次输入给定数组的大小(一般默认写1024的倍数)。(将字符串输出可以使用
、getBytes()方法将字符串转为字符字节,可以使用\r\n换行
)
2.最后要关闭流调用close()方法。
读取:即将内存里面的东西读取到程序中,java中通过FileInputStream类来进行操作。通过提供的read()方法,将数据读取到,其中的参数可以不写,或者传入一个byte类型的数组。返回值为每次输出的长度,要是最后没有能够获取就输出-1。
两个结合就可以实现将一个地方的文件去读保存到另一地方
这里的抛异常练习是可以直接抛最大的Exception
字节流输入输出图解:
这个介绍字节跟字符串转换的几种方法:
String转成byte[]:
方法名 | 说明 |
byte[] getBytes() | 将String的内容转成byte[] |
byte[]转成String:
String的构造方法 | 说明 |
String(byte bytes[]) | 将byte[]的内容转成String |
String(byte bytes[], int offset, int length) | 将byte[]的部分内容转成String |
二:字符流
因为中文的编码(在gkb是两个字节,utf-8是三个字节)所以在用字节流读取是可能会将原本要组成字的字节拆到其他的字节里,(这里就因为拆分组不成字,显示就是乱码)
1.读取字符流可以用 FileReader 操作文件。①创建对象,传入参数(文件要读取的路径)使用read()方法来操作,最后要关闭流使用close()方法(在关闭前系统会默认执行最后一次flush()方法,将内存东西写到硬盘中,没有写关闭,存不到数据)
构造方法 | 说明 |
FileReader(String fileName) | 根据字符串路径,指定读取的文件。 |
FileReader(File file) | 根据File对象,指定读取的文件。 |
方法名 | 说明 |
int read() | 从流中读取一个字符,返回读取到的字符,读不到返回-1。 |
int read(char[] b) | 从流中读取多个字符保存到字符数组中,返回读取的字符个数,读不到返回-1。 |
字符流输出数据到硬盘中可以使用 FileWriter类 操作文件①创建对象,传入要存放地址的字符串参数②调用write()方法③使用close()关闭流
构造方法 | 说明 |
FileWriter(String fileName) | 根据字符串路径,写出数据到文件。 |
FileWriter(File file) | 根据File对象,写出数据到文件。 |
write方法的使用:
方法名 | 说明 |
void write(int c) | 写一个字符到流中,如果是数字,会转为码表上对应的字符写出 |
void write(char[] cbuf) | 写入一个字符数组到流中 |
void write(char[] cbuf, int off, int len) | 写入字符数组的一部分到流中 |
void write(String str) | 写一个字符串到流中 |
void write(String str, int off, int len) | 写一个字符串的一部分到流中 |
flush()和close()在使用上的区别:
方法名 | 说明 |
flush() | 刷新流,还可以继续写数据。 |
close() | 关闭流,但是在关闭之前会自动刷新流;一旦关闭,就不能再写数据。 |
字符流输入输出图解: