流指计算机各部件之间的数据流动,输入流是将数据从外设或外存传递到应用程序的数据流,输出流是将数据从应用程序传递到外设或外存的数据流。
java.io包中的四个基本类为了方便流的处理,java语言的流类都封装在 java.io包中,因此在使用流类时,必须导入 java.io包。
四个基本类:InputStream,OutputStream,Reader,Writer,且它们都是抽象类,因此通常根据它们派生出来的子类对文件进行处理。
这两个流类是字节流的基本类型,一般用来处理二进制文件的数据,因为它们在处理含有汉字的文本文件时可能会出现乱码。
InputStream流类中包含一套所有字节输入都需要的方法,可以完成最基本的从输入流读取数据的功能;OutputStream流类中包含一套所有字节输出都需要的方法,可以完成最基本的向输出流写入数据的功能。
FileInputStream和FileOutputStream分别是InputStream,OutputStream的直接子类,它们主要负责完成对本地磁盘文件的顺序输入与输出 *** 作的流(在进行文件的读写 *** 作时会产生IOExecption异常,异常必须被捕获或声明抛出)。
FileDescriptor是 java.io包中的另一个类,该类不能实例化,有三个静态成员:in,out和err,利用它们可以实现键盘输入或屏幕输出 *** 作。
实例:在程序中创建一个文本文件,从键盘输入一串字符,读取该文件并显示该文件。
import java.io.*;//先导入包 class Aa{ public static void main(String[] args) { char ch; int data; try( FileInputStream fin=new FileInputStream(FileDescriptor.in);//实现键盘输入 FileOutputStream fout=new FileOutputStream("D:/abc/a.txt");//括号中输入文件路径) ){ System.out.println("请输入一串字符串,并以#结束:"); while((ch=(char)fin.read())!='#') fout.write(ch);//将ch写入新文件中 } catch(FileNotFoundException e){//文件未找到异常类 System.out.println("文件没找到"); } catch(IOException e){}//输入输出异常类 try( FileInputStream fin=new FileInputStream("D:/abc/a.txt"); FileOutputStream fout=new FileOutputStream(FileDescriptor.out);//实现屏幕输出 ){ while((fin.available()>0) fout.write(data); } } catch(IOException e){} } }顺序输入流
SequenceInputStream是InputStream的直接子类,功能是将多个输入流顺序连接在一起,形成单一的输入数据流,没有对应输出数据流存在。
管道输入输出流PipedInputStream和PipedOutputStream分别是InputStream,OutputStream类的直接子类,管道流的功能是将一个程序或线程的输出连接到另外一个程序或线程作为输入,使相连接的线程能够进行数据交换,从而实现程序内部线程间的通信或不同程序间的通信。(管道字节输入流和管道字节输出流必须结合使用)
过滤输入输出流FilterInputStream和FilterOutputStream分别实现了在数据的读写 *** 作的同时进行数据处理,它们既是InputStream,OutputStream的直接子类,也是抽象类,又分别派生出数据输入流类DataInputStream和DataOutputStream。
实例:利用数据输入输出流将不同类型的数据写到一个文件中,然后再读出来显示在屏幕上。
import java.io.*; public class Bb{ public static void main(String[] args) { try( FileOutputStream fout=new FileOutputStream("D:/abc/a.txt");//括号中输入文件路径) DataOutputStream dout=new DataOutputStream(fout); ){ dout.writeInt(10); dout.writeBoolean(true); dout.writeChars("Goodbye"); dout.writeFloat(3.1415926f); dout.writeDouble(987654321.123); dout.writeLong(12345); } catch(IOException e){} try( FileInputStream fin=new FileInputStream("D:/abc/a.txt");//括号中输入文件路径) DataInputStream din=new DataInputStream(fin); ){ System.out.println(din.readInt()); System.out.println(din.readLong()); System.out.println(din.readFloat()); System.out.println(din.readDouble()); System.out.println(din.readBoolean()); char ch; while((ch=din.readChar())!='') System.out.print(ch); } catch(Exception e){ System.out.println("文件未找到"); } } }标准输入输出流
标准输入:System.in是BufferedInputStream类的对象,当程序需要从键盘上读取数据时,只需调用System.in的read()方法即可,且该方法应包含在异常处理的try块中。
标准输出:System.out是打印出输出流的对象PrintStream类的对象,PrintStream定义了向屏幕输送不同数据类型数据的方法print()和println()(前者输出数据后不换行,后者换行),System.out对应的输出流通常指显示器、打印机等信息输出设备。
标准错误输出:System.err用于为用户显示错误信息,它使用与out同样的方法,但err会立即显示指定的错误信息让用户知道,输入的信息也不会被重新定位,而是仍然显示在设备上。
Reader和Writer流类只是建立一条通往文本文件的通道,而要实现对字符数据的读写 *** 作,还需要相应的读方法和写方法来完成。
FileReader类和FileWriter文件字符输入流类FileReader继承自InputStreamReader类,而InputStreamReader又继承自Reader类。在使用FileReader类读取文件时,必须先调用FileReader()构造方法创建FileReader类的对象,再利用它来调用read()方法。
文件字符输出流类FileWriter与文件字符输入流类用法相似。
import java.io.*; public class Cc { public static void main(String[] args) throws IOException { char c[]=new char[500]; try(FileReader fr=new FileReader("abc");){//调用FileReader()构造方法创建FileReader类的对象 int num= fr.read(c); String str=new String(c,0,num); System.out.println("读取的字符个数为:"+num+",其内容如下:"); System.out.println(str); } } }
java把每个汉字和英文字母作为一个字符对待,而把Enter键生成的回车换行符“rn”作为两个字符
BufferedReader类与BufferedWriter类缓冲字符输入流类 BufferedReader继承自Reader类,它用来读取缓冲区里的文件。使用 BufferedReader类之前,应先创建FileReader类对象,再以该对象为参数来创建BufferedReader类的对象,然后再利用此对象调用相应的方法来读取缓冲区的数据。
缓冲字符输出流类用法BufferedWriter与缓冲字符输入流类相似。
import java.io.*; public class Ba { public static void main(String[] args) throws IOException { FileWriter fw= new FileWriter("abc"); char[] c={'h','e','l','l','o','r','n'}; String str="欢迎使用java"; fw.write(c);//将字符数组写到文件中 fw.write(str);//将字符串写到文件中 fw.close();//关闭流 } }文件管理与随机访问
每个File类对象对象表示一个磁盘文件或文件夹,而其对象属性中包含了文件或文件夹的相关信息,调用它的方法可以完成对文件或文件夹的管理 *** 作。
为了使java程序能在不同平台上运行,可以利用File类的一个静态变量File.separator,该属性包含了当前系统规定的文件夹分隔符,使用它可以组合在不同 *** 作系统下都通用的路径。
如:“d:”+File.separator+“java”+File.separator+“myfile”
随机访问文件类RandomAccessFile也是在java.io包中定义的,它是有关文件处理中功能齐全,文件访问方法众多的类。
import java.io.*; public class Ba { public static void main(String[] args) throws IOException { StringBuffer st=new StringBuffer(); System.out.println("请输入文件所在的路径"); char ch; while ((ch=(char)System.in.read())!='r') st.append(ch); File dir=new File(st.toString()); System.out.println("请输入欲读取的文件名"); StringBuffer stn=new StringBuffer(); char c; while ((c=(char)System.in.read())!='r') stn.append(c); stn.replace(0,1,"");//去掉上次输入并回车后存留在缓冲区中的“n” File rf=new File(dir,stn.toString()); if(rf.isFile()&& rf.canWrite()&& rf.canRead()) { RandomAccessFile ra = new RandomAccessFile(rf, "rw"); while (ra.getFilePointer() < ra.length()) System.out.println(ra.readLine()); ra.close();//关闭ra流 } else System.out.println("文件不可读"); } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)