前言
Java基础:io流学习小结
一、IO流是什么?
I/O是Input/Output的缩写
I: input,读的操作,指将硬盘上的文件读入到内存。
O: output,写的操作,指将内存上的文件写入到硬盘。
IO流就是用来处理设备间数据传输问题的。
二、io流分类
1.字节流
(1)概述
在计算机中,无论是文本、图片、音频还是视频,所有的文件都是以二进制(字节)形式存在的,字节流可复制任何文件数据,因此字节流是程序中最常用的流。
(2)写入方法
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException{
//创建一个字符输出流对象并让他指向文件位置
FileOutputStream fos=new FileOutputStream("E:\\myjava\\javase\\fos.txt",true);
//将字节97写入文件
fos.write(97);
fos.write("\r\n".getBytes());
byte[] b= {97,98,99,100};
//将b数组写入文件
fos.write(b);
fos.write("\r\n".getBytes());
//将b数组的0到len写入文件
fos.write(b,0,3);
fos.write("\r\n".getBytes());
//getBytes方法直接将要写的数据转化为字节写入文件
//这边写入一个换行符
fos.write("\r\n".getBytes());
//关闭输出流并释放资源
fos.close();
}
}
在创建字符输出流对象时文件路径后加true代表追加写入
运行结果:
三次写入对应的结果,如果不写入回车对应的字节,那么将不会有换行出现。
(3)读入方法
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException{
//创建一个字符输出入流对象并让他指向文件位置
FileInputStream fis=new FileInputStream("E:\\myjava\\javase\\fot.txt");
//读取文件的一个字节
int b=fis.read();
System.out.println(b);
System.out.println((char)b);
//一次读取一个字节数组,数组大小一般设置为1024整数倍
// 如果读取到文件的尾部,那么读取的b=-1
//因此我们可以通过一个循环来读取一个文件里的所有数据
byte[] bys=new byte[1024];
int len;
while((len=fis.read(bys))!=-1)
{
System.out.println(new String(bys,0,len));
}
//释放资源
fis.close();
}
}
运行结果:
(4)字节缓冲流
字节缓冲流的读写方法与上述一致,但其具有一定的缓冲区,并且读写速度相对基础字符流要快一些, 可以指定缓冲区的大小,或者接受默认的大小。 在大多数情况下,默认值就足够大了。
2.字符流
(1)概述
字符流会把读取到的二进制的数据进行对应 的编码与解码工作,且字符流只能复制文本数据
(2)字符流的编码解码问题
import sun.nio.cs.ext.GBK;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException{
//创建字符输入流对象,通过GBK进行编码
OutputStreamWriter ow=new OutputStreamWriter
(new FileOutputStream("E:\\myjava\\javase\\fos.txt"), "GBK");
//字符串写数据
String str="我爱编码";
ow.write(str);
ow.close();
// ow.write("\r\n");
//字符串部分数据写入
// ow.write(str,0,1);
//创建字符输出流对象,通过GBK进行解码
InputStreamReader iw=new InputStreamReader
(new FileInputStream("E:\\myjava\\javase\\fos.txt"),"GBK");
int b;
while((b=iw.read())!=-1)
{
System.out.print((char)b);
}
//释放资源
iw.close();
}
}
只有OutputStreamWriter和InputStreamReader分别提供了编码解码的功能呢,在指定文件的后面进步编码解码的指定,就可以按照指定的方法进行编码解码,上面的代码展示了按照GBK的方法进行编码解码,当你的编译器是UTF-8的方式进行编码时写入文件就会出现下面的问题
但是你可以用相应的编码方法进行解码,依旧可以输出正确的文本文档
注:FileReader和FileWriter与上述的方法相比缺少了编码和解码的功能
(2)字符流读写数据方法
字符流写数据的方法与字节流相比多出来了两种写入数据的方法
字符流多了可以写入字符串与读取部分字符串的功能如下图所示
写入的时候,可以添加flush方法对数据进行刷新,否则有可能出现数据显示不出来的问题
但是在代码的最后进行close也可以对数据进行一次刷新
字符流读数据的方法可以参考字节流读数据的方法
(3)字符缓冲流
字符缓冲流的读写数据方法基本与字节流一致,
字符缓冲流的特有功能:
void newLine():相当于在写数据的时候换行
public String readLine():读取一行数据,直到结尾,如果无文本可读则读取结果为null。
三、flush和close方法的区别
flush在写数据的时候进行刷新,刷新完了之后还可以继续写入数据,而close是关闭流,关闭之后不能继续写入数据,并且在关闭前也会有刷新的操作。
总结
综上所述,想要进行数据的读取一般使用字节流的方式,并且使用字节缓冲流一次读取一个数组的方式读取数据,这样读取的速度是最快的。
以上就是今天要讲的内容,本文仅仅简单介绍了IO流的基础内容,如果想学习更深的操作,还需自己钻研捏。