黑马程序员——IO流与File类

来源:互联网 发布:用python直接写utf 编辑:程序博客网 时间:2024/06/05 10:18
------- android培训java培训、期待与您交流! ----------

一、字符流与字节流

IO流用来处理设备之间的数据传输。Java对数据的操作是通过流的方式。Java用于操作流的对象都在IO包中。
输入流和输出流相对于内存设备而言。
将外设中的数据读取到内存中:输入。
将内存的数写入到外设中:输出。
流按操作数据分为两种:字节流与字符流。
字符流的由来:
其实就是:字节流读取文字字节数据后,不直接操作而是先查指定的编码表,获取对应的文字。再对
这个文字进行操作。简单说:字节流+编码表。

二、字符流

字节流的抽象基类:InputStream,OutputStream。
字符流的抽象基类:Reader,Writer。
PS:由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。
如:InputStream的子类FileInputStream。
如:Reader的子类FileReader。

IO流的异常处理方式:为防止代码异常导致流无法关闭,因此在finally中对流进行关闭。

PS:字符流继承体系图


三、缓冲区

字符流的缓冲区
缓冲区的出现提高了对数据的读写效率。
对应类:
BufferedWriter
BufferedReader

PS:缓冲区要结合流才可以使用。

缓冲区的作用:在流的基础上对流的功能进行了增强。

在字符流的缓冲区中,写入换行使用BufferedWriter类中的newLine()方法。读取一行数据使用BufferedReader类中的readLine()方法。
bufr.read():这个read方法是从缓冲区中读取字符数据,所以覆盖了父类中的read方法。
bufr.readLine():另外开辟了一个缓冲区,存储的是原缓冲区一行的数据,不包含换行符。
原理:使用了读取缓冲区的read方法,将读取到的字符进行缓冲并判断换行标记,将标记前的缓冲数据变成字符串返回。

LineNumberReader
跟踪行号的缓冲字符输入流。此类定义了方法 setLineNumber(int) 和 getLineNumber(),它们可分别用于设置和获取当前行号。

四、字节流

基本操作与字符流类相同。但它不仅可以操作字符,还可以操作其他媒体文件。

PS:字节流继承体系图:


五、转换流

由来:
字符流与字节流之间的桥梁
方便了字符流与字节流之间的操作

应用:

字节流中的数据都是字符时,转成字符流操作更高效。
 转换流:
InputStreamReader:字节到字符的桥梁,解码。
OutputStreamWriter:字符到字节的桥梁,编码。
InputStreamReader是字节流通向字符流的桥梁。
PS:
System.out的类型是PrintStream,属于OutputStream类别。
OutputStreamReader是字符流通向字节流的桥梁。

六、File类
  File类用来将文件或者文件夹封装成对象,方便对文件与文件夹的属性信息进行操作。File对象可以作为参数传递给流的构造函数 。
PS:流只能操作数据,不能操作文件。
File类的查找示例:
[java] view plaincopy
  1. import java.io.File;  
  2. import java.text.DateFormat;  
  3. import java.util.Date;  
  4. public class FileMethodDemo{  
  5.     public static void main(String[] args){  
  6.         getDemo();  
  7.     }  
  8.     public static void getDemo(){  
  9.         File file1 = new File("a.txt" );  
  10.         File file2 = new File("d:\\fuck\\a.txt" );  
  11.         String name = file2.getName();  
  12.         String absPath = file2.getAbsolutePath(); //绝对路径  
  13.         String path1 = file1.getPath();  
  14.         String path2 = file2.getPath();  
  15.         long len = file2.length();  
  16.         long time = file2.lastModified();  
  17. //相对路径不同,父目录不同  
  18. //如果此路径名没有指定父目录,则返回 null  
  19.         String parent1 = file1.getParent();  
  20.         String parent2 = file2.getParent();  
  21.         Date date = new Date(time);  
  22.         DateFormat df =DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG);  
  23.         String str_time = df.format(date);  
  24.         System.out.println( "name:" + name);  
  25.         System.out.println( "absPath:" + absPath);  
  26.         System.out.println( "path1:" + path1);  
  27.         System.out.println( "path2:" + path2);  
  28.         System.out.println( "len:" + len);  
  29.         System.out.println( "str_time:" + str_time);  
  30.         System.out.println( "parent1:" + parent1);  
  31.         System.out.println( "parent2:" + parent2);  
  32.     }     
  33. }  
程序运行结果为:

实例:
需求:读取一个键盘录入的数据,并打印在控制台上。
键盘本身就是一个标准的输入设备。对于Java而言,对于这种输入设备都有对应的对象。
[java] view plaincopy
  1. import java.io.IOException;    
  2. import java.io.InputStream;    
  3.     
  4. public class ReadKey{    
  5.        public static void main(String[] args) throws IOException {    
  6.             readKey();    
  7.        }    
  8.     
  9.        public static void readKey() throws IOException {    
  10.             InputStream in = System.in;    
  11.     
  12.             int ch = in.read();//阻塞式方法    
  13.             System.out.println(ch);    
  14.     
  15.             ch = in.read(); //阻塞式方法    
  16.             System.out.println(ch);    
  17.     
  18.             ch = in.read(); //阻塞式方法    
  19.             System.out.println(ch);    
  20.                 
  21.             in.close();    
  22.       }    
  23. }   
程序最后结果为:
0 0
原创粉丝点击