IO流与File类
2015-09-10 09:15
246 查看
流的概念
流(stream)的概念源于UNIX中管道(pipe)的概念。在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备、外部文件等。
一个流,必有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是Internet上的某个URL。
流的方向是重要的,根据流的方向,流可分为两类:输入流和输出流。用户可以从输入流中读取信息,但不能写它。相反,对输出流,只能往输入流写,而不能读它。
实际上,流的源端和目的端可简单地看成是字节的生产者和消费者,对输入流,可不必关心它的源端是什么,只要简单地从流中读数据,而对输出流,也可不知道它的目的端,只是简单地往流中写数据。
形象的比喻——水流 ,文件======程序 ,文件和程序之间连接一个管道,水流就在之间形成了,自然也就出现了方向:可以流进,也可以流出.便于理解,这么定义流: 流就是一个管道里面有流水,这个管道连接了文件和程序。
一、java字节流
FileInputStream和FileOutputStream
这两个类属于结点流,第一个类的源端和第二个类的目的端都是磁盘文件,它们的构造方法允许通过文件的路径名来构造相应的流。如:
FileInputStream infile = new FileInputStream("myfile.dat");
FileOutputStream outfile = new FileOutputStream("results.dat");
要注意的是,构造FileInputStream, 对应的文件必须存在并且是可读的,而构造FileOutputStream时,如输出文件已存在,则必须是可覆盖的。
BufferedInputStream和BufferedOutputStream
它们是过滤器流,其作用是提高输入输出的效率。
DataInputStream和DataOutputStream
这两个类创建的对象分别被称为数据输入流和数据输出流。这是很有用的两个流,它们允许程序按与机器无关的风格读写Java数据。 所以比较适合于网络上的数据传输。这两个流也是过滤器流,常以其它流如InputStream或OutputStream作为它们的输入或输出。
二、Java的字符流
字符流主要是用来处理字符的。Java采用16位的Unicode来表示字符串和字符,对应的字符流按输入和输出分别称为readers和writers。
InputStreamReader和OutputStreamWriter
在构造这两个类对应的流时,它们会自动进行转换,将平台缺省的编码集编码的字节转换为Unicode字符。对英语环境,其缺省的编码集一般为ISO8859-1。
BufferedReader和BufferedWriter
这两个类对应的流使用了缓冲,能大大提高输入输出的效率。这两个也是过滤器流,常用来对InputStreamReader和OutputStreamWriter进行处理。
IO流的异常处理方式:为防止代码异常导致流无法关闭,因此在finally中对流进行关闭。
三、缓冲区
字符流的缓冲区
缓冲区的出现提高了对数据的读写效率。
对应类:
BufferedWriter
BufferedReader
PS:缓冲区要结合流才可以使用。
缓冲区的作用:在流的基础上对流的功能进行了增强。
在字符流的缓冲区中,写入换行使用BufferedWriter类中的newLine()方法。读取一行数据使用BufferedReader类中的readLine()方法。
bufr.read():这个read方法是从缓冲区中读取字符数据,所以覆盖了父类中的read方法。
bufr.readLine():另外开辟了一个缓冲区,存储的是原缓冲区一行的数据,不包含换行符。
原理:使用了读取缓冲区的read方法,将读取到的字符进行缓冲并判断换行标记,将标记前的缓冲数据变成字符串返回。
LineNumberReader
跟踪行号的缓冲字符输入流。此类定义了方法 setLineNumber(int) 和 getLineNumber(),它们可分别用于设置和获取
四、转换流
由来:
字符流与字节流之间的桥梁
方便了字符流与字节流之间的操作
应用:
字节流中的数据都是字符时,转成字符流操作更高效。
转换流:
InputStreamReader:字节到字符的桥梁,解码。
OutputStreamWriter:字符到字节的桥梁,编码。
InputStreamReader是字节流通向字符流的桥梁。
PS:
System.out的类型是PrintStream,属于OutputStream类别。
OutputStreamReader是字符流通向字节流的桥梁
五、File类
File类用来将文件或者文件夹封装成对象,方便对文件与文件夹的属性信息进行操作。File对象可以作为参数传递给流的构造函数 。
PS:流只能操作数据,不能操作文件。
File类的查找示例:
[java] view
plaincopy
import java.io.File;
import java.text.DateFormat;
import java.util.Date;
public class FileMethodDemo{
public static void main(String[] args){
getDemo();
}
public static void getDemo(){
File file1 = new File("a.txt" );
File file2 = new File("d:\\fuck\\a.txt" );
String name = file2.getName();
String absPath = file2.getAbsolutePath(); //绝对路径
String path1 = file1.getPath();
String path2 = file2.getPath();
long len = file2.length();
long time = file2.lastModified();
//相对路径不同,父目录不同
//如果此路径名没有指定父目录,则返回 null
String parent1 = file1.getParent();
String parent2 = file2.getParent();
Date date = new Date(time);
DateFormat df =DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG);
String str_time = df.format(date);
System.out.println( "name:" + name);
System.out.println( "absPath:" + absPath);
System.out.println( "path1:" + path1);
System.out.println( "path2:" + path2);
System.out.println( "len:" + len);
System.out.println( "str_time:" + str_time);
System.out.println( "parent1:" + parent1);
System.out.println( "parent2:" + parent2);
}
}
程序运行结果为:
。
实例:
需求:读取一个键盘录入的数据,并打印在控制台上。
键盘本身就是一个标准的输入设备。对于Java而言,对于这种输入设备都有对应的对象。
[java] view
plaincopy
import java.io.IOException;
import java.io.InputStream;
public class ReadKey{
public static void main(String[] args) throws IOException {
readKey();
}
public static void readKey() throws IOException {
InputStream in = System.in;
int ch = in.read();//阻塞式方法
System.out.println(ch);
ch = in.read(); //阻塞式方法
System.out.println(ch);
ch = in.read(); //阻塞式方法
System.out.println(ch);
in.close();
}
}
程序最后结果为:
。
流(stream)的概念源于UNIX中管道(pipe)的概念。在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备、外部文件等。
一个流,必有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是Internet上的某个URL。
流的方向是重要的,根据流的方向,流可分为两类:输入流和输出流。用户可以从输入流中读取信息,但不能写它。相反,对输出流,只能往输入流写,而不能读它。
实际上,流的源端和目的端可简单地看成是字节的生产者和消费者,对输入流,可不必关心它的源端是什么,只要简单地从流中读数据,而对输出流,也可不知道它的目的端,只是简单地往流中写数据。
形象的比喻——水流 ,文件======程序 ,文件和程序之间连接一个管道,水流就在之间形成了,自然也就出现了方向:可以流进,也可以流出.便于理解,这么定义流: 流就是一个管道里面有流水,这个管道连接了文件和程序。
一、java字节流
FileInputStream和FileOutputStream
这两个类属于结点流,第一个类的源端和第二个类的目的端都是磁盘文件,它们的构造方法允许通过文件的路径名来构造相应的流。如:
FileInputStream infile = new FileInputStream("myfile.dat");
FileOutputStream outfile = new FileOutputStream("results.dat");
要注意的是,构造FileInputStream, 对应的文件必须存在并且是可读的,而构造FileOutputStream时,如输出文件已存在,则必须是可覆盖的。
BufferedInputStream和BufferedOutputStream
它们是过滤器流,其作用是提高输入输出的效率。
DataInputStream和DataOutputStream
这两个类创建的对象分别被称为数据输入流和数据输出流。这是很有用的两个流,它们允许程序按与机器无关的风格读写Java数据。 所以比较适合于网络上的数据传输。这两个流也是过滤器流,常以其它流如InputStream或OutputStream作为它们的输入或输出。
二、Java的字符流
字符流主要是用来处理字符的。Java采用16位的Unicode来表示字符串和字符,对应的字符流按输入和输出分别称为readers和writers。
InputStreamReader和OutputStreamWriter
在构造这两个类对应的流时,它们会自动进行转换,将平台缺省的编码集编码的字节转换为Unicode字符。对英语环境,其缺省的编码集一般为ISO8859-1。
BufferedReader和BufferedWriter
这两个类对应的流使用了缓冲,能大大提高输入输出的效率。这两个也是过滤器流,常用来对InputStreamReader和OutputStreamWriter进行处理。
IO流的异常处理方式:为防止代码异常导致流无法关闭,因此在finally中对流进行关闭。
三、缓冲区
字符流的缓冲区
缓冲区的出现提高了对数据的读写效率。
对应类:
BufferedWriter
BufferedReader
PS:缓冲区要结合流才可以使用。
缓冲区的作用:在流的基础上对流的功能进行了增强。
在字符流的缓冲区中,写入换行使用BufferedWriter类中的newLine()方法。读取一行数据使用BufferedReader类中的readLine()方法。
bufr.read():这个read方法是从缓冲区中读取字符数据,所以覆盖了父类中的read方法。
bufr.readLine():另外开辟了一个缓冲区,存储的是原缓冲区一行的数据,不包含换行符。
原理:使用了读取缓冲区的read方法,将读取到的字符进行缓冲并判断换行标记,将标记前的缓冲数据变成字符串返回。
LineNumberReader
跟踪行号的缓冲字符输入流。此类定义了方法 setLineNumber(int) 和 getLineNumber(),它们可分别用于设置和获取
四、转换流
由来:
字符流与字节流之间的桥梁
方便了字符流与字节流之间的操作
应用:
字节流中的数据都是字符时,转成字符流操作更高效。
转换流:
InputStreamReader:字节到字符的桥梁,解码。
OutputStreamWriter:字符到字节的桥梁,编码。
InputStreamReader是字节流通向字符流的桥梁。
PS:
System.out的类型是PrintStream,属于OutputStream类别。
OutputStreamReader是字符流通向字节流的桥梁
五、File类
File类用来将文件或者文件夹封装成对象,方便对文件与文件夹的属性信息进行操作。File对象可以作为参数传递给流的构造函数 。
PS:流只能操作数据,不能操作文件。
File类的查找示例:
[java] view
plaincopy
import java.io.File;
import java.text.DateFormat;
import java.util.Date;
public class FileMethodDemo{
public static void main(String[] args){
getDemo();
}
public static void getDemo(){
File file1 = new File("a.txt" );
File file2 = new File("d:\\fuck\\a.txt" );
String name = file2.getName();
String absPath = file2.getAbsolutePath(); //绝对路径
String path1 = file1.getPath();
String path2 = file2.getPath();
long len = file2.length();
long time = file2.lastModified();
//相对路径不同,父目录不同
//如果此路径名没有指定父目录,则返回 null
String parent1 = file1.getParent();
String parent2 = file2.getParent();
Date date = new Date(time);
DateFormat df =DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG);
String str_time = df.format(date);
System.out.println( "name:" + name);
System.out.println( "absPath:" + absPath);
System.out.println( "path1:" + path1);
System.out.println( "path2:" + path2);
System.out.println( "len:" + len);
System.out.println( "str_time:" + str_time);
System.out.println( "parent1:" + parent1);
System.out.println( "parent2:" + parent2);
}
}
程序运行结果为:
。
实例:
需求:读取一个键盘录入的数据,并打印在控制台上。
键盘本身就是一个标准的输入设备。对于Java而言,对于这种输入设备都有对应的对象。
[java] view
plaincopy
import java.io.IOException;
import java.io.InputStream;
public class ReadKey{
public static void main(String[] args) throws IOException {
readKey();
}
public static void readKey() throws IOException {
InputStream in = System.in;
int ch = in.read();//阻塞式方法
System.out.println(ch);
ch = in.read(); //阻塞式方法
System.out.println(ch);
ch = in.read(); //阻塞式方法
System.out.println(ch);
in.close();
}
}
程序最后结果为:
。
相关文章推荐
- 指向二维数组的指针
- MJRefresh的基本使用
- qt QComboBox 组合框 的currentIndexChanged ( int index )信号的触发
- js中出现missing ) after argument list
- lower_bound函数
- Linux中查看系统资源占用情况的命令
- 工作中遇到的问题--使用DTO减少数据字段
- 官网下载jstl【配图详解】
- express第一个程序
- phoneGap 打包
- AFNetworking的使用
- phoneGap 打包
- MVC4笔记 Area区域
- <rich:modelPanel>标签的使用
- eclipse 创建 maven servlet 3.0 web 项目
- 一个GDI双缓冲类
- 角色控制器
- 关于MySql在调试过程中出现Driver not loaded Driver not loaded的问题的解决办法
- 【DirectX3D】Blending Colors for Special Effects
- 基于webrtc技术session border controler (SBC)