Java中IO流操作大全
2016-03-08 16:24
711 查看
一、流的概念
流(stream)的概念源于UNIX中管道(pipe)的概念。在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备、外部文件等。 一个流,必有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是Internet上的某个URL。 流的方向是重要的,根据流的方向,流可分为两类:输入流和输出流。用户可以从输入流中读取信息,但不能写它。相反,对输出流,只能往输入流写,而不能读它。 实际上,流的源端和目的端可简单地看成是字节的生产者和消费者,对输入流,可不必关心它的源端是什么,只要简单地从流中读数据,而对输出流,也可不知道它的目的端,只是简单地往流中写数据。
形象的比喻——水流 ,文件======程序 ,文件和程序之间连接一个管道,水流就在之间形成了,自然也就出现了方向:可以流进,也可以流出.便于理解,这么定义流: 流就是一个管道里面有流水,这个管道连接了文件和程序。
二、流的分类
1. java.io包中的类对应两类流,一类流直接从指定的位置(如磁盘文件或内存区域)读或写,这类流称为结点流(node stream),其它的流则称为过滤器(filters)。过滤器输入流往往是以其它输入流作为它的输入源,经过过滤或处理后再以新的输入流的形式提供给用户,过滤器输出流的原理也类似。
2. Java的常用输入、输出流 java.io包中的stream类根据它们操作对象的类型是字符还是字节可分为两大类: 字符流和字节流。 . Java的字节流 InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先。 . Java的字符流 Reader是所有读取字符串输入流的祖先,而writer是所有输出字符串的祖先。 结合开始所说的输入/输出流 ,出现了个一小框架。
eg.1创建一个文件
File f=new File("D:\\hello.txt");
try{
f.createNewFile();
}catch (Exception e) {
e.printStackTrace();
}
eg.2 File类的两个常量
System.out.println(File.separator); // \
System.out.println(File.pathSeparator); // ;
我直接在windows下使用\进行分割不行吗?当然是可以的。但是在linux下就不是\了。所以,要想使得我们的代码跨平台,更加健壮,所以,大家都采用这两个常量吧.
eg.3删除一个文件
String fileName="D:"+File.separator+"hello.txt";
File f=new File(fileName); 9. if(f.exists()){ 10. f.delete(); 11. }else{ 12. System.out.println("文件不存在");
}
eg.4 创建一个文件夹
String fileName="D:"+File.separator+"hello";
File f=new File(fileName);
f.mkdir();
eg.5 列出指定目录的全部文件(包括隐藏文件)
String fileName="D:"+File.separator;
File f=new File(fileName);
String[] str=f.list();
for (int i =0; i < str.length; i++) {
System.out.println(str[i]);
}
eg.6 列出指定目录的全部文件(包括隐藏文件)
String fileName="D:"+File.separator;
File f=new File(fileName);
File[] str=f.listFiles();
for (int i =0; i < str.length; i++) {
System.out.println(str[i]);
}
更多File操作请查阅API:http://www.javaweb.cc/help/JavaAPI1.6/java/io/File.html
三、字节流
1. 向文件中写入字符串
String fileName="D:"+File.separator+"hello.txt";
File f=new File(fileName);
OutputStream out =new FileOutputStream(f);
String str="你好";
byte[] b=str.getBytes();
out.write(b);
out.close();
也可以一个字节一个字节的写
String fileName="D:"+File.separator+"hello.txt";
File f=new File(fileName);
OutputStream out =new FileOutputStream(f);
String str="你好";
byte[] b=str.getBytes();
for (int i =0; i < b.length; i++) {
out.write(b[i]);
}
out.close();
2.向文件中追加新内容
String fileName="D:"+File.separator+"hello.txt";
File f=new File(fileName);
OutputStream out =new FileOutputStream(f,true);多一个参数
String str="Rollen";
String str="\r\nRollen"; 可以换行
byte[] b=str.getBytes();
for (int i =0; i < b.length; i++) {
out.write(b[i]);
}
out.close();
3.字节流读文件内容
String fileName="D:"+File.separator+"hello.txt";
File f=new File(fileName);
nputStream in=new FileInputStream(f);
byte[] b=new byte[1024];
in.read(b);
in.close();
System.out.println(new String(b));
但是这个例子读取出来会有大量的空格,我们可以利用in.read(b);的返回值来设计程序。如下:
String fileName="D:"+File.separator+"hello.txt";
File f=new File(fileName);
InputStream in=new FileInputStream(f);
byte[] b=new byte[1024];
int len=in.read(b);
in.close();
System.out.println("读入长度为:"+len);
System.out.println(new String(b,0,len));
读者观察上面的例子可以看出,我们预先申请了一个指定大小的空间,但是有时候这个空间可能太小,有时候可能太大,我们需要准确的大小,这样节省空间,那么我们可 以这样干:
String fileName="D:"+File.separator+"hello.txt";
File f=new File(fileName);
InputStream in=new FileInputStream(f);
byte[] b=new byte[(int)f.length()];
in.read(b);
System.out.println("文件长度为:"+f.length());
in.close();
System.out.println(new String(b));
上边例子也可以一个字节一个字节读
String fileName="D:"+File.separator+"hello.txt";
File f=new File(fileName);
InputStream in=new FileInputStream(f);
byte[] b=new byte[(int)f.length()];
for (int i =0; i < b.length; i++) {
b[i]=(byte)in.read();
}
in.close();
System.out.println(new String(b));
上面的几个例子都是在知道文件的内容多大,然后才展开的,有时候我们不知道文件有多大,这种情况下,我们需要判断是否独到文件的末尾。
String fileName="D:"+File.separator+"hello.txt";
File f=new File(fileName);
InputStream in=new FileInputStream(f);
byte[] b=new byte[1024];
int count =0;
int temp=0;
while((temp=in.read())!=(-1)){
b[count++]=(byte)temp;
}
in.close();
System.out.println(new String(b));
四、字符流
1.字符流向文件中写入数据
String fileName="D:"+File.separator+"hello.txt";
File f=new File(fileName);
Writer out =new FileWriter(f);
String str="hello";
out.write(str);
out.close();
其实这个例子上之前的例子没什么区别,只是你可以直接输入字符串,而不需要你将字符串转化为字节数组。当你如果想问文件中追加内容的时候,可以使用将上面的声明 out的哪一行换为: Writer out =new FileWriter(f,true); 这样,当你运行程序的时候,会发现文件内容变为: hellohello如果想在文件中换行的话,需要使用“\r\n” 比如将str变 为String str="\r\nhello"; 这样文件追加的str的内容就会换行了。
2.从文件中读内容
String fileName="D:"+File.separator+"hello.txt";
File f=new File(fileName);
char[] ch=new char[100];
Reader read=new FileReader(f);
int count=read.read(ch);
read.close();
System.out.println("读入的长度为:"+count);
System.out.println("内容为"+newString(ch,0,count));
当然最好采用循环读取的方式,因为我们有时候不知道文件到底有多大。
String fileName="D:"+File.separator+"hello.txt";
File f=new File(fileName);
char[] ch=new char[100];
Reader read=new FileReader(f);
int temp=0;
int count=0;
while((temp=read.read())!=(-1)){
ch[count++]=(char)temp;
}
read.close();
System.out.println("内容为"+newString(ch,0,count));
五、字符流与字节流的区别
实际上字节流在操作的时候本身是不会用到缓冲区的,是文件本身的直接操作的,但是字符流在操作的时候下后是会用到缓冲区的,是通过缓冲区来操作文件的。 读者可以试着将上面的字节流和字符流的程序的最后一行关闭文件的代码注释掉,然后运行程序看看。你就会发现使用字节流的话,文件中已经存在内容,但是使用字符流的时候,文件中还是没有内容的,这个时候就要刷新缓冲区。 使用字节流好还是字符流好呢? 答案是字节流。首先因为硬盘上的所有文件都是以字节的形式进行传输或者保存的,包括图片等内容。但是字符只是在内存中才会形成的,所以在开发中,字节流使用广泛。
文件的复制 其实DOS下就有一个文件复制功能,比如我们想把d盘下面的hello.txt文件复制到d盘下面的rollen.txt文件中,那么我们就可以使用下面的命令: copy d:\hello.txt d:\rollen.txt
下面我们使用程序来复制文件吧。 基本思路还是从一个文件中读入内容,边读边写入另一个文件,就是这么简单。首先编写下面的代码:
public static void main(String[] args) throws IOException {
if(args.length!=2){
System.out.println("命令行参数输入有误,请检查");
System.exit(1);
}
File file1=new File(args[0]);
File file2=new File(args[1]);
if(!file1.exists()){
System.out.println("被复制的文件不存在");
System.exit(1);
}
InputStream input=new FileInputStream(file1);
OutputStream output=new FileOutputStream(file2);
if((input!=null)&&(output!=null)){
int temp=0;
while((temp=input.read())!=(-1)){
output.write(temp);
}
}
input.close();
output.close();
}
六 、OutputStreramWriter 和InputStreamReader类
整个IO类中除了字节流和字符流还包括字节和字符转换流。 OutputStreramWriter将输出的字符流转化为字节流 InputStreamReader将输入的字节流转换为字符流 但是不管如何操作,最后都是以字节的形式保存在文件中的。
1.将字节输出流转化为字符输出流
String fileName= "d:"+File.separator+"hello.txt";
File file=new File(fileName);
Writer out=new OutputStreamWriter(newFileOutputStream(file));
out.write("hello");
out.close();
2.将字节输入流变为字符输入流
String fileName= "d:"+File.separator+"hello.txt";
File file=new File(fileName);
Reader read=new InputStreamReader(newFileInputStream(file));
char[] b=new char[100];
int len=read.read(b);
System.out.println(new String(b,0,len));
read.close();
ps: 未完,待续
流(stream)的概念源于UNIX中管道(pipe)的概念。在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备、外部文件等。 一个流,必有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是Internet上的某个URL。 流的方向是重要的,根据流的方向,流可分为两类:输入流和输出流。用户可以从输入流中读取信息,但不能写它。相反,对输出流,只能往输入流写,而不能读它。 实际上,流的源端和目的端可简单地看成是字节的生产者和消费者,对输入流,可不必关心它的源端是什么,只要简单地从流中读数据,而对输出流,也可不知道它的目的端,只是简单地往流中写数据。
形象的比喻——水流 ,文件======程序 ,文件和程序之间连接一个管道,水流就在之间形成了,自然也就出现了方向:可以流进,也可以流出.便于理解,这么定义流: 流就是一个管道里面有流水,这个管道连接了文件和程序。
二、流的分类
1. java.io包中的类对应两类流,一类流直接从指定的位置(如磁盘文件或内存区域)读或写,这类流称为结点流(node stream),其它的流则称为过滤器(filters)。过滤器输入流往往是以其它输入流作为它的输入源,经过过滤或处理后再以新的输入流的形式提供给用户,过滤器输出流的原理也类似。
2. Java的常用输入、输出流 java.io包中的stream类根据它们操作对象的类型是字符还是字节可分为两大类: 字符流和字节流。 . Java的字节流 InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先。 . Java的字符流 Reader是所有读取字符串输入流的祖先,而writer是所有输出字符串的祖先。 结合开始所说的输入/输出流 ,出现了个一小框架。
类别 | 字节流 | 字符流 |
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
File f=new File("D:\\hello.txt");
try{
f.createNewFile();
}catch (Exception e) {
e.printStackTrace();
}
eg.2 File类的两个常量
System.out.println(File.separator); // \
System.out.println(File.pathSeparator); // ;
我直接在windows下使用\进行分割不行吗?当然是可以的。但是在linux下就不是\了。所以,要想使得我们的代码跨平台,更加健壮,所以,大家都采用这两个常量吧.
eg.3删除一个文件
String fileName="D:"+File.separator+"hello.txt";
File f=new File(fileName); 9. if(f.exists()){ 10. f.delete(); 11. }else{ 12. System.out.println("文件不存在");
}
eg.4 创建一个文件夹
String fileName="D:"+File.separator+"hello";
File f=new File(fileName);
f.mkdir();
eg.5 列出指定目录的全部文件(包括隐藏文件)
String fileName="D:"+File.separator;
File f=new File(fileName);
String[] str=f.list();
for (int i =0; i < str.length; i++) {
System.out.println(str[i]);
}
eg.6 列出指定目录的全部文件(包括隐藏文件)
String fileName="D:"+File.separator;
File f=new File(fileName);
File[] str=f.listFiles();
for (int i =0; i < str.length; i++) {
System.out.println(str[i]);
}
更多File操作请查阅API:http://www.javaweb.cc/help/JavaAPI1.6/java/io/File.html
三、字节流
1. 向文件中写入字符串
String fileName="D:"+File.separator+"hello.txt";
File f=new File(fileName);
OutputStream out =new FileOutputStream(f);
String str="你好";
byte[] b=str.getBytes();
out.write(b);
out.close();
也可以一个字节一个字节的写
String fileName="D:"+File.separator+"hello.txt";
File f=new File(fileName);
OutputStream out =new FileOutputStream(f);
String str="你好";
byte[] b=str.getBytes();
for (int i =0; i < b.length; i++) {
out.write(b[i]);
}
out.close();
2.向文件中追加新内容
String fileName="D:"+File.separator+"hello.txt";
File f=new File(fileName);
OutputStream out =new FileOutputStream(f,true);多一个参数
String str="Rollen";
String str="\r\nRollen"; 可以换行
byte[] b=str.getBytes();
for (int i =0; i < b.length; i++) {
out.write(b[i]);
}
out.close();
3.字节流读文件内容
String fileName="D:"+File.separator+"hello.txt";
File f=new File(fileName);
nputStream in=new FileInputStream(f);
byte[] b=new byte[1024];
in.read(b);
in.close();
System.out.println(new String(b));
但是这个例子读取出来会有大量的空格,我们可以利用in.read(b);的返回值来设计程序。如下:
String fileName="D:"+File.separator+"hello.txt";
File f=new File(fileName);
InputStream in=new FileInputStream(f);
byte[] b=new byte[1024];
int len=in.read(b);
in.close();
System.out.println("读入长度为:"+len);
System.out.println(new String(b,0,len));
读者观察上面的例子可以看出,我们预先申请了一个指定大小的空间,但是有时候这个空间可能太小,有时候可能太大,我们需要准确的大小,这样节省空间,那么我们可 以这样干:
String fileName="D:"+File.separator+"hello.txt";
File f=new File(fileName);
InputStream in=new FileInputStream(f);
byte[] b=new byte[(int)f.length()];
in.read(b);
System.out.println("文件长度为:"+f.length());
in.close();
System.out.println(new String(b));
上边例子也可以一个字节一个字节读
String fileName="D:"+File.separator+"hello.txt";
File f=new File(fileName);
InputStream in=new FileInputStream(f);
byte[] b=new byte[(int)f.length()];
for (int i =0; i < b.length; i++) {
b[i]=(byte)in.read();
}
in.close();
System.out.println(new String(b));
上面的几个例子都是在知道文件的内容多大,然后才展开的,有时候我们不知道文件有多大,这种情况下,我们需要判断是否独到文件的末尾。
String fileName="D:"+File.separator+"hello.txt";
File f=new File(fileName);
InputStream in=new FileInputStream(f);
byte[] b=new byte[1024];
int count =0;
int temp=0;
while((temp=in.read())!=(-1)){
b[count++]=(byte)temp;
}
in.close();
System.out.println(new String(b));
四、字符流
1.字符流向文件中写入数据
String fileName="D:"+File.separator+"hello.txt";
File f=new File(fileName);
Writer out =new FileWriter(f);
String str="hello";
out.write(str);
out.close();
其实这个例子上之前的例子没什么区别,只是你可以直接输入字符串,而不需要你将字符串转化为字节数组。当你如果想问文件中追加内容的时候,可以使用将上面的声明 out的哪一行换为: Writer out =new FileWriter(f,true); 这样,当你运行程序的时候,会发现文件内容变为: hellohello如果想在文件中换行的话,需要使用“\r\n” 比如将str变 为String str="\r\nhello"; 这样文件追加的str的内容就会换行了。
2.从文件中读内容
String fileName="D:"+File.separator+"hello.txt";
File f=new File(fileName);
char[] ch=new char[100];
Reader read=new FileReader(f);
int count=read.read(ch);
read.close();
System.out.println("读入的长度为:"+count);
System.out.println("内容为"+newString(ch,0,count));
当然最好采用循环读取的方式,因为我们有时候不知道文件到底有多大。
String fileName="D:"+File.separator+"hello.txt";
File f=new File(fileName);
char[] ch=new char[100];
Reader read=new FileReader(f);
int temp=0;
int count=0;
while((temp=read.read())!=(-1)){
ch[count++]=(char)temp;
}
read.close();
System.out.println("内容为"+newString(ch,0,count));
五、字符流与字节流的区别
实际上字节流在操作的时候本身是不会用到缓冲区的,是文件本身的直接操作的,但是字符流在操作的时候下后是会用到缓冲区的,是通过缓冲区来操作文件的。 读者可以试着将上面的字节流和字符流的程序的最后一行关闭文件的代码注释掉,然后运行程序看看。你就会发现使用字节流的话,文件中已经存在内容,但是使用字符流的时候,文件中还是没有内容的,这个时候就要刷新缓冲区。 使用字节流好还是字符流好呢? 答案是字节流。首先因为硬盘上的所有文件都是以字节的形式进行传输或者保存的,包括图片等内容。但是字符只是在内存中才会形成的,所以在开发中,字节流使用广泛。
文件的复制 其实DOS下就有一个文件复制功能,比如我们想把d盘下面的hello.txt文件复制到d盘下面的rollen.txt文件中,那么我们就可以使用下面的命令: copy d:\hello.txt d:\rollen.txt
下面我们使用程序来复制文件吧。 基本思路还是从一个文件中读入内容,边读边写入另一个文件,就是这么简单。首先编写下面的代码:
public static void main(String[] args) throws IOException {
if(args.length!=2){
System.out.println("命令行参数输入有误,请检查");
System.exit(1);
}
File file1=new File(args[0]);
File file2=new File(args[1]);
if(!file1.exists()){
System.out.println("被复制的文件不存在");
System.exit(1);
}
InputStream input=new FileInputStream(file1);
OutputStream output=new FileOutputStream(file2);
if((input!=null)&&(output!=null)){
int temp=0;
while((temp=input.read())!=(-1)){
output.write(temp);
}
}
input.close();
output.close();
}
六 、OutputStreramWriter 和InputStreamReader类
整个IO类中除了字节流和字符流还包括字节和字符转换流。 OutputStreramWriter将输出的字符流转化为字节流 InputStreamReader将输入的字节流转换为字符流 但是不管如何操作,最后都是以字节的形式保存在文件中的。
1.将字节输出流转化为字符输出流
String fileName= "d:"+File.separator+"hello.txt";
File file=new File(fileName);
Writer out=new OutputStreamWriter(newFileOutputStream(file));
out.write("hello");
out.close();
2.将字节输入流变为字符输入流
String fileName= "d:"+File.separator+"hello.txt";
File file=new File(fileName);
Reader read=new InputStreamReader(newFileInputStream(file));
char[] b=new char[100];
int len=read.read(b);
System.out.println(new String(b,0,len));
read.close();
ps: 未完,待续
相关文章推荐
- 初识JAVA中的泛型概念
- SpringMVC+Hibernate4+Spring3整合开发实现CRUD
- JVM学习之java垃圾回收机制
- Exercise thinking in java
- springmvc学习笔记(1)-框架原理和入门配置
- java并发编程:线程安全管理类--原子操作类--AtomicInteger
- struts2工作原理
- java EE ME SE有什么关系
- Java 垃圾回收机制
- JAVA并发学习之基础概念
- 《netty权威指南》私有协议栈开发中遇到的坑
- JAVA_检测字符串是不是一串数字的几个方法
- JAVA并发学习之volatile
- Shiro系列之Shiro+Spring MVC整合(Integration)
- Hadoop-格式化HDFS报错java.net.UnknownHostException: localhost.localdomain: localhost.localdomain
- JAVA并发学习之ThreadLocal
- 二叉搜索树的后序遍历序列Java
- Java IO体系
- 跟着项目学javaweb(std):1(整体结构)
- Java_派生类的3中继承方式