Java——IO流

来源:互联网 发布:税务数据采集软件 编辑:程序博客网 时间:2024/04/29 19:32

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
原创粉丝点击