当前位置: 首页 > 后端技术 > Java

javaIO流

时间:2023-04-01 14:42:08 Java

大家好,我是小鱼!一、基本概念IO流用于处理设备间的数据传输。Java对数据的操作都是以流的形式进行的。Java的操作流的类都在IO包中。2.IO流的分类3.字节流字节流可以操作任何数据,因为计算机中任何数据都是以字节的形式存储的,所以不多说直接上例子:1.FileInputStream(下java.iopackage)Inputstream(read)//创建流对象FileInputStreamfis=newFileInputStream("xxx.txt");//从硬盘读取一个字节intx=fis.read();System.out.println(x);inty=fis.read();System.out.println(y);intz=fis.read();System.out.println(z);//读取文件结束标志为-1inta=fis.read();System.out.println(a);//关闭流并释放资源fis.close();读取文件中的所有字节FileInputStreamfis=newFileInputStream("xxx.txt");诠释吨;while((t=fis.read())!=-1){System.out.println(t);}fis.close();2.FileOutputStreamoutput(write)//输出流创建字节如果没有输出流对象,会自动创建一个文件。FileOutputStreamfos=newFileOutputStream("yyy.txt");//添加的AsCll码表的值fos.write(97);fos.write(98);福斯。关闭();3。档案续在写//FileOutputStream创建对象时,如果没有这个文件,就会创建。如果有这样的文件,会先清除,然后write//outputstream,创建一个字节输出流对象。如果没有,会自动创建一个文件FileOutputStreamfos=newFileOutputStream("yyy.txt",true);//如果要继续写,第二个参数传True//添加的AsCll码表fos的值.write(100);fos.close();bytestreambuffer如果我们逐字节传输文件,效率很低,所以使用buffer。缓冲区BufferedInputStream有一个内置的缓冲区,当从BufferedInputStream中读取一个字节时,BufferedInputStream会从文件中获取8192字节(2^13),将它们存储在缓冲区中,然后返回给一个程序,等待数据被直接取到缓冲区,直到取完所有8192字节,BufferedInputStream会再次从文件中取8192字节直接上图:接下来看一个例子:4.复制图片文件//创建输入输出流对象FileInputStreamfis=newFileInputStream("copy.png");FileOutputStreamfos=newFileOutputStream("copy2.png");//创建一个缓冲对象,将输入输出流包装起来,功能更强大BufferedInputStreambis=newBufferedInputStream(fis);BufferedOutputStreambos=newBufferedOutputStream(fos);诠释乙;while((b=bis.read())!=-1){bos.write(b);}bis.close();bos.close();1.flush和close方法的区别/***@paramargs*@throwsIOException*close方法*和refresh函数,在关闭stream之前,会刷新一次buffer,把buffer中的所有字节都flush掉到文件,然后关闭。*close刷新后不能写*flush方法*有了刷新功能,刷新后可以继续写*/publicstaticvoidmain(String[]args)throwsIOException{//demo();//flush和close方法的区别BufferedInputStreambis=newBufferedInputStream(newFileInputStream("Copy.png"));BufferedOutputStreambos=newBufferedOutputStream(newFileOutputStream("Copy3.png"));诠释乙;while((b=bis.read())!=-1){bos.write(b);}bos.close();}4、字符流只能对纯文本文件进行操作,直接上传代码示例更方便:1、字符流读取FileReaderfr=newFileReader("xxx.txt");诠释c;while((c=fr.read())!=-1){//通过默认码表一次读取一个字符chars=(char)c;系统。out.print(s);}fr.close();2。字符流拷贝FileReaderfr=newFileReader("xxx.txt");FileWriterfw=newFileWriter("zzz.txt");诠释c;while((c=fr.read())!=-1){fw.write(c);}fr.close();fw.close();//write类中有一个2k的小缓冲区,如果没有关闭流,内容就会写入缓冲区。![file](http://image.openwrite.cn/27912_4C25FBE7BD9E4D6688E0F6AE58219354)字符流缓冲区BufferedReader类从字符输入流中读取文本并对字符进行缓冲,以高效读取字符、数组和行。我们通过一张图来理解:1.Bufferedcharacterstream/***@paramargs*@throwsIOException*bufferedstream的特殊方法*readLine()获取一行文本*newLine()换行的功能**newLine()\r\n区别*newLine()是跨平台方法*\r\n只支持windows系统*/publicstaticvoidmain(String[]args)throwsIOException{//demo1();BufferedReaderbr=newBufferedReader(newFileReader("xxx.txt"));BufferedWriterbw=newBufferedWriter(newFileWriter("yyy.txt"));弦线;while((line=br.readLine())!=null){bw.写(行);bw.newLine();//换行函数System.out.println(line);}br.close();bw.close();}2。实现将一个文件复制到另一个文件中倒序排序。/***@paramargs*@throwsIOException*流对象应该尽可能晚打开和早关闭**复制一个文件,并以相反的顺序到另一个文件。*/publicstaticvoidmain(String[]args)throwsIOException{//1.创建流对象BufferedReaderbr=newBufferedReader(newFileReader("xxx.txt"));//2。创建集合对象ArrayListlist=newArrayList();//3。读取的数据存储在集合String行;while((line=br.readLine())!=null){list.add(line);}br.close();//4。向后遍历集合数据到文件BufferedWriterbw=newBufferedWriter(newFileWriter("zzz.txt"));对于(inti=list.size();i>0;i--){bw.write(list.get(i));bw.newLine();}//5。关闭流bw.close();}![file](http://image.openwrite.cn/27912_6B0E16632B1944199BCB91880DADB11A)五、其他流1.SequenceInputStream(将两个输入流合为一个流)序列流FileInputStreamfis1=newFileInputStream("a.txt");FileInputStreamfis2=newFileInputStream("b.txt");SequenceInputStreamsis=newSequenceInputStream(fis1,fis2);FileOutputStreamfos=newFileOutputStream("c.txt");诠释b1;while((b1=sis.read())!=-1){//不断从a.txt中读取字节//读取到将字节写入c.txtfos.write(b1);}sis.close();//sis关闭时,构造方法传入的流对象也会关闭fos.close();2.ByteArrayOutputStream内存输出流FileInputStreamfis=newFileInputStream("a.txt");//创建一个可以在内存中增长的内存数组ByteArrayOutputStreambos=newByteArrayOutputStream();诠释乙;while((b=fis.read())!=-1){bos.write(b);}//获取buffer中的所有数据,赋值给arr数组byte[]arr=bos.toByteArray();System.out.println(新字符串(arr));//将buffer的内容转为字符串,在输出语句中可以省略调整System.out.println(bos.toString());fis.close();3。随机访问流RandomAccessFileRandomAccessFile类不是流,是Object的子类,结合了InputStream和OutputStream的功能,可以随机读写文件。RandomAccessFileraf=newRandomAccessFile("g.txt","rw");//rw为读写权限raf.seek(10);//指定位置设置指针raf.write(97);raf.close();4.操作对象流这个流就是读取一个对象或者写入一个程序,相当于进行序列化(归档)和反序列化(读取)。例子:1.对象输出流ObjectOutputStream序列化(相对于archive)Personp1=newPerson("张三",23);Personp2=newPerson("李四",23);ObjectOutputStreamoos=newObjectOutputStream(newFileOutputStream("a.txt"));oos.writeObject(p1);oos.writeObject(p2);2、对象输入流反序列化(相当于文件读取)ObjectInputStreamois=newObjectInputStream(newFileInputStream("a.txt"));Personp1=(Person)ois.readObject();Personp2=(Person)ois.readObject();System.out.println(p1);System.out.println(p2);ois.close();完整对象写入、读取(优化版)3.完整对象写入、读取(优化版)//写入Personp1=newPerson("张三",23);Personp2=newPerson("李四",23);Personp3=newPerson("王舞",23);ArrayListlist=newArrayList();list.add(p1);列表.添加(p2);list.add(p3);ObjectOutputStreamoos=newObjectOutputStream(newFileOutputStream("a.txt"));oos.writeObject(列表);oos.close();//读出ObjectInputStreamois=newObjectInputStream(newFileInputStream("a.txt"));ArrayListarrlist=(ArrayList)ois.readObject();for(Personperson:arrlist){System.out.println(person);}ois.close();