Java——IO流

1、IO流
根据数据的走向分为:输入流、输出流
根据处理的数据类型分为:字节流、字符流
这里写图片描述
字节流:可以处理所有类型的数据,如MP3、图片、文字、视频等。在读取时,读到一个字节就返回一个字节。
在Java中对应的类都以“Stream”结尾

字符流:仅能够处理纯文本数据,如txt文本等。在读取时,读到一个或多个字节,先查找指定的编码表,然后将查找到的字符返回。
在Java中对应的类都以“Reader”或“Writer”结尾

2、
1)、使用字节流读写数据

读取数据:FileInputStream

//创建读取字节流获取读取文件
FileInputStream fis = new FileInputStream("test.txt");
//创建字节数组,设置读取的字节数
byte input[] = new byte[1024] ;
//使用字节流读取,并将读取到的字节传给input[]字节数组
fis.read(input) ;

//将字节数组转成String字符串,用于输出
String inputString = new String(input, "GBK");
System.out.println(inputString);

//关闭字节流
fis.close();

写出数据:FileOutputStream

//创建写出字节流获取读取文件
FileOutputStream fos = new FileOutputStream("newtest.txt");

//要写入的数据
String outString = "write to test 完成写出" ;
//创建字节数组获取要写入的数据,并且设置编码方式
byte output[] = outString.getBytes("GBK");

//写出数据
fos.write(output);
//关闭输出流
fos.close();

根据以上字节流的读取和写出操作,可以总结出一种复制和移动文件的方法:

//创建一个IO读取流,并且获取要输入的文件
FileInputStream fis = new FileInputStream("ani.gif") ;
//创建一个IO写出流,并且标明要写出的地址和文件名
FileOutputStream fos = new FileOutputStream("ani_new.gif") ;

byte input[] = new byte[1024] ;
//因为字节流数组一次只能读取1024KB,为了保证能够把文件读取完,因此需要一个循环读取。read()方法把读取流fis读取到input[]字节流数组中,然后write()方法把读取到的input[]字节数组里的字节传给写出流fos。如果read()方法读取不到数据,就会返回-1,此时说明文件读取完了,于是就可以退出循环。 
while (fis.read(input) != -1) {
    fos.write(input);
}

fis.close();
fos.close();

2)、使用带缓冲的字节流读写数据:

//创建输入字节流
FileInputStream fis = new FileInputStream("movie.mp4");
BufferedInputStream bis = new 
//创建缓冲的输入字节流,设置缓冲区大小为1000000字节
BufferedInputStream(fis,1000000);
//创建写出字节流
FileOutputStream fos = new FileOutputStream("moive_new.mp4");
//创建穿冲的写出字节流,设置缓冲区大小为1000000字节
BufferedOutputStream bos = new BufferedOutputStream(fos,1000000);
//创建字节数组,大型文件对应的数组可以大一些,小文件对应的数组小一些
byte input[] = new byte[100000];
int count = 0;
long before = System.currentTimeMillis();//获取当前时间
while (bis.read(input) != -1) {
    bos.write(input);
    count++;
}
//强制输出缓冲区内容。如果不加上flush,最后的缓冲区未读满将不输出内容
bos.flush();

bis.close();
fis.close();
bos.close();
fos.close();
//输出读取时间=现在时间-刚才时间
System.out.println(System.currentTimeMillis()-before+"ms");
//输出共读取的次数
System.out.println("读取了:"+count+"次");

2、使用字符流读写数据

File file = new File("test_1.txt") ;
//字节流(只用来给字符流赋值)
FileInputStream fis = new FileInputStream(file) ;
//字符流
InputStreamReader isr = new InputStreamReader(fis, "GBK") ;

char input[] = new char[100] ;
int l = 0 ;
/*
 * read方法,会吧字符流isr里的数据读取到input以供计算机使用。
 * 但是input存量有限,因此read只能一次读取input存满的数据量,因此使用while循环可以一直从isr里读取出数据存到input里,
 * 只有当read从isr里读不到新的数据的时候,read会返回-1,否则每次都是返回此次读取到的数据量的大小
 * 但是,read读取的机制是把读取到的数据赋值给input,但是只会覆盖掉read读取到的前n个元素,也就是说如果input数组的100个元素都有值,而下一次read只读取到了10个元素,那么read会把这10个元素赋值给input的前10个元素将其覆盖掉,而剩下90个并不会改变,依旧保持input原来的值,从而成为冗余数据。
 * 这样如果最后一次read读取到的数据量没有正好和input元素数相同,就容易造成最后的输出的时候会多输出一次input后面的元素。
 * 因此就需要使用String的String(bytes, offset, length)方法,其中bytes是数据流,offset是偏移量,length是数据的长度,把input里的数据给新建的String,同时设置数据的长度,这样就可以避免冗余数据的出现。
*/
while ((l = isr.read(input)) != -1) {
    System.out.println(l);
    System.out.println(new String(input, 0, l) );
}

使用字符流实现文档的复制:

FileInputStream fis = new FileInputStream("test.txt") ;
InputStreamReader isr = new InputStreamReader(fis, "GBK") ;
FileOutputStream fos = new FileOutputStream("new_test.txt") ;
OutputStreamWriter osw = new OutputStreamWriter(fos, "GBK") ;

char input[] = new char[100] ;
int l = 0 ;
//write也同样有write(cbuf, off, len)方法,其中cbuf表示写出时原字符数组,off表示偏移量,len表示一次写出的长度
while ((l=isr.read(input)) != -1) {
    osw.write(input,0,l);
}

//先进后出
isr.close();
fis.close();
osw.close();
fos.close();

使用带缓冲的字符流实现文档的复制

FileInputStream fis = new FileInputStream("test.txt") ;
InputStreamReader isr = new InputStreamReader(fis, "GBK") ;
FileOutputStream fos = new FileOutputStream("new_test.txt") ;
OutputStreamWriter osw = new OutputStreamWriter(fos, "GBK") ;

BufferedReader br = new BufferedReader(isr) ;
//BufferedWriter bw = new BufferedWriter(osw) ;
//使用PrintWriter来替代BufferedWriter原因在下。
/*
 * 在创建PrintWriter对象的时候,可以使用PrintWriter(out, autoFlush)方法,
 * out是要写出的字符流,autoFlush是一个boolean类型的值,当true的时候表示PrintWriter会在最后的时候强制写出缓冲区内容,即自动调用flush()方法,当false的时候表示不强制调用。
 * 有了这个方法我们就可以省略最后自己代码上的调用flush()方法了。
*/
PrintWriter pw = new PrintWriter(osw,true);

String inputString ;
while ((inputString = br.readLine()) != null) {
    //如果使用BufferedWriter对象的readLine()方法,一次会读到一行数据,也就是以\n或\r时读取就停止。同时是不读取\n或\r的,这样最后写出的结果就是一段没有换行的数据
    //bw.write(inputString);
    //由于BufferedWriter的局限性,因此使用PrintWriter方法,因为PrintWriter的println(注意:带ln)方法写出完之后会自动换行,这样既可以使用readLine()方法,也可以实现换行。
    pw.println(inputString);
}
//因为BufferedWriter方法是缓冲区存满了才写出,为了防止没有存满而没有输出的情况,因此调用flush()方法强制把缓冲区内容写出
//bw.flush();
//先进后出
//bw.close();
pw.close();
br.close();
isr.close();
fis.close();
osw.close();
fos.close();

3、FileReader与FileWriter

FileReader与FileWriter专门用来读取和写出文本文档的简单类操作。

FileReader fr = new FileReader("test_1.txt") ;
BufferedReader br = new BufferedReader(fr) ;
FileWriter fw = new FileWriter("text_1_new.txt") ;
BufferedWriter bw = new BufferedWriter(fw) ;

String inputString ;
while ((inputString = br.readLine()) != null) {
    bw.write(inputString + '\n');
}

bw.flush();
bw.close();
br.close();
fw.close();
fr.close();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值