JAVA中IO流

1.Io流也成为输入输出流 就是用来读写数据的。

I 表示input是数据从硬盘文件中读入到内存的过程,称为输入,负责读;

O 表示output是内存程序的数据从内存写出到硬盘文件的过程,称为输出,负责写;

入和出 是相对内存而言

IO流的分类:

按照数据的流向:IO流的分类为输入流和输出流

按照流中的数据的最小单位分为:字节流(可以操作所有文件:包括音频 视频图片等)和字符流(只能操作纯文本文件包括.txt文件.java文件)

IO流可以分为大类:

  • 字节输入流:以内存为基准,来自磁盘文件/网络中的数据以字节的形式读入到内存中去的流称为字节输入流;
  • 字节输出流:以内存为基准,把内存中的数据以字节为单位写出到磁盘文件或者网络中去的流称之 为字节输出流;
  • 字符输入流:以内存为基准,来自磁盘文件或者网络数据以字符为单位读入到内存中的流称之为字符流;
  • 字符输出流:以内存为基准,把内存中的数据以字符为单位写出到磁盘文件或者网络介质中去的流 称之为字符输出流;

 IO流体系:

2.IO流操作文件 

文件的字节输入流:FileInputStream和数据的操作相关API

 2.1使用文件输入流:每次读取一个字节

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);
}
}
}

问题:

  • 性能较低
  • 读取的内容中如果包含中文字符,会出现乱码

2.2使用文件输入流:每次读取一个字节数组

public int read(byte[] b) throws IOException

从次输入流b.length最多b.length个字节的数据读入一个字节数组。

此方法将阻塞,直到某些输入可用。
  • 重写 read InputStream
  • 参数 b - 读取数据的缓冲区。
  • 结果 读入缓冲区的总字节数,如果由于文件末尾已到达而没有更多数据, -1
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开始到读的个数
}
}
}

问题:

读取性能提升

但是读取中文的时候 依然无法避免中文乱码的问题

2.2.4.文件字节输入流:一次读完全部字节

1.如何使用字节输入流读取中文内容输出不乱码?

定义一个与文件大小一致的字节数组,一次性读取文件的全部字节

2.直接把文件的数据全部读取到一个字节数组可以避免乱码,是否存在问题?

如果文件过大,字节数组可能会引起内存溢出

byte[]
readAllBytes()
从输入流中读取所有剩余字节。
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));
}
}

2.3IO流 写数据到存储介质上

OutputStream 实现 FileOutputStream(子类) 

写数据的方式

流的关闭和刷新

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();//关闭
}

 以上是基本的写数据 注意追加写

2.4.文件的拷贝

需求:将一个视频文件复制到其他的目录下
思路:
  • 创建数据输入流 对象
  • 创建一个输出流对象 指定目的地
  • 进行数据的读写 完成复制
  • 释放资源
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值