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
- java—IO流
- Java——IO流
- <java——IO流>
- Java——IO流
- JAVA——IO流
- java——io流
- Java——IO流
- Java——IO流
- Java基础—IO流
- java基础—-IO流
- java基础—IO流
- java基础—IO流
- Java IO(二):IO流——字节流
- Java IO(二):IO流——字符流
- Java IO系统——IO流分类说明
- java——IO
- Java——>IO
- java——IO
- java基础的核心技术:多线程(二)
- CSS3 Columns:比table更好用的分列式布局方法
- 获取apk签名及apk签名方法
- (Leetcode)70.Climbing Stairs(easy)
- kubernetes的service的网络类型ingress的搭建
- Java——IO流
- 锯齿转变(ZigZag Conversion)
- php中的数组遍历
- CodeForces 356A Knight Tournament 【线段树】
- 你知道Hello World程序的由来吗?
- 方法的使用常见问题
- 增删改查
- poj-3624-Charm Bracelet【经典01背包】
- php中的作用域