I 表示input是数据从硬盘文件中读入到内存的过程,称为输入,负责读;
O 表示output是内存程序的数据从内存写出到硬盘文件的过程,称为输出,负责写;
入和出 是相对内存而言
IO流的分类:
按照数据的流向:IO流的分类为输入流和输出流
按照流中的数据的最小单位分为:字节流(可以操作所有文件:包括音频 视频图片等)和字符流(只能操作纯文本文件包括.txt文件.java文件)
IO流可以分为大类:
IO流体系:
文件的字节输入流:FileInputStream和数据的操作相关API
public class FileInputStreamDemo1 {
public static void main(String[] args) throws IOException {
// 创建一个文件字节输入流管道与源文件联通
//InputStream is = new FileInputStream(new
File("day_08/src/cn/sxjzit/RecurisonDemo.java"));
//简化写法
InputStream is = new
FileInputStream("day_08/src/cn/sxjzit/RecursionDemo1.java");
// 每次读取一个字节
// int b1 = is.read();//读第一个
// System.out.println((char)b1);//112
// int b2 = is.read();//读第二个
// System.out.println((char)b2);// 如果返回值为-1 则表示文件读到了末尾
int b ;
while((b=is.read())!=-1){//等于-1就表示读到了末尾
System.out.print((char)b);
}
}
}
问题:
public int read(byte[] b) throws IOException
从次输入流b.length最多b.length个字节的数据读入一个字节数组。
public class FileInputDemo2 {
public static void main(String[] args) throws IOException {
InputStream is = new
FileInputStream("day_08/src/cn/sxjzit/RecursionDemo1.java");//定义一个文件创建一个文件通道
// 定义一个字节数组 作为缓冲区
byte[] buffer = new byte[5];//每次读取5个字节
// int len = is.read(buffer);//len当前读取几个字节
// System.out.println("读取的字节数:" + len);//5
//如果读取有中文就进行解码过程
// String rs = new String(buffer);//解码
// System.out.println(rs);//三个字节编码一个汉字,会出现乱码
//使用循环都进行改进 每次读取一个字节数组
int len;// 记录每次读取的字节数
while((len = is.read(buffer)) != -1){
// 每次读取多少字节 就写出多少字节
System.out.print(new String(buffer,0,len));//看上文数据操作相关API第三个从0开始到读的个数
}
}
}
问题:
读取性能提升
但是读取中文的时候 依然无法避免中文乱码的问题
1.如何使用字节输入流读取中文内容输出不乱码?
定义一个与文件大小一致的字节数组,一次性读取文件的全部字节
2.直接把文件的数据全部读取到一个字节数组可以避免乱码,是否存在问题?
如果文件过大,字节数组可能会引起内存溢出
public class FileInputStreamDemo3 {
public static void main(String[] args) throws IOException {
File file = new File("day_08/src/cn/sxjzit/RecursionDemo1.java");
InputStream is = new FileInputStream(file);
// 定义一个字节数组 作为缓冲区
//byte[] buffer = new byte[(int)file.length()];文件的长度作为数组的大小
byte[] buffer = new byte[1024*1024];// 1024计算机的进制 定义数组的大小为1024的倍数(推荐)
//使用循环都进行改进 每次读取一个字节数组
int len;// 记录每次读取的字节数
while((len = is.read(buffer)) != -1){ // 每次读取多少字节 就写出多少字节
System.out.print(new String(buffer,0,len));
}
}
}
//另一种方法如上文
public static void main(String[] args) throws IOException {
File file = new File("day_08/src/cn/sxjzit/RecursionDemo1.java");
InputStream is = new FileInputStream(file);
// 定义一个字节数组 作为缓冲区
//byte[] buffer = new byte[(int)file.length()];
byte[] buffer = is.readAllBytes();//一次性读取所有方法
System.out.println(new String(buffer));
}
}
写数据的方式
public static void main(String[] args) throws IOException {
// 1 创建一个文件字节输出流管道OutputStream与目标文件联通
//第二个参数ture 表示是否实行追加写append
OutputStream os = new FileOutputStream("day_08/src/out.txt",true);
//2 写出数据到目标文件out.txt可以写字节或字符
os.write('a');//字符
os.write(99);
//写一个字节数组
byte[] buff = {'w',98,99,100};//写一个字节数组
os.write(buff);//结果acwbcd写出的数据
os.write(buff,1,2);//写字节数组的一部分从第一个位置开始写
os.write("山西晋中理工学院".getBytes());//转化为字节数组
os.flush();//刷新
os.close();//关闭
}
以上是基本的写数据 注意追加写