---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
一、IO流
java通过IO流技术,可以操作本地或者其他主机上的文件
1,IO流的分类
1.1,按处理的数据分为字符流和字节流
字符流:专门用于处理文本文件,自动查询编码表,GBK
字节流:可以处理任意文件
1.2,按流向分为读取流和输出流
输入流读取文件
输入的字符流: Reader 这个流对象中的最高的父类
输入的字节流: InputStream 这个流对象中的最高父类
输出流 写入文件
输出的字符流:Writer 这个流对象中的最高父类
输出的字节流:OutputStream 这个流对象中的最高父类
二、字符流FileReader与FileWriter
1,字符流写一个文本文件
1.1,创建一个FileWriter对象,该对象一被初始化就必须要明确被操作的文件,而且该文件会被创建到指定目录下,如果文件已存在,文件将被覆盖
1.2,调用written方法将数据写入流中
1.3,刷新流对象中缓冲中的数据,将数据刷到目的地中
1.4,关闭流资源
//字符流写一个文本文件
import java.io.*;
class FileWriterDemo
{
public static void main(String[] args)
{
FileWriter fw = null;
try{
fw = new FileWriter("demo.txt",true);
fw.write("abcdefg");
fw.flush();
}
catch(IOException e){
System.out.println(e);
}finally{
try{
if(fw!=null)
fw.close();
}catch(IOException e){}
}
}
}
2, 字符流读取一个文本文件
2.1,创建FileReader对象,该对象一被初始化就必须要明确被操作的文件,数据源
2.2,read(字符数组)提高读取的效率,read方法返回一个int 值,表示数组中的有效字符个数
2.3,将数组变成字符串输出
2.4,关闭流资源
//字符流读取文件
import java.io.*;
class FileReaderDemo
{
public static void main(String[] args)
{
FileReader fr = null;
try
{
fr = new FileReader("demo.txt");
int x = 0 ;
char[] ch = new char[10];
//read(字符数组)读取字符,放到数组中
//缓冲的作用,提供读取的效率
//返回数组中,放了多好个有效的字符
while( (x = fr.read(ch))!=-1){
System.out.print(new String(ch,0,x));
}
}
catch (IOException e)
{
}
finally{
try
{
if(fr!=null)
fr.close();
}
catch (IOException e)
{
}
}
}
}
三、带有缓冲区对象BufferedReader与BufferedWriter
1,BufferedWriter
1.1,创建字符输出流对象操作文件
1.2,为了提高效率加入缓冲技术,将字符流对象作为参数传递给BufferedWriter
1.3,关闭缓冲区对象BufferedWriter
import java.io.*;
class BufferedWriterDemo
{
public static void main(String[] args) throws IOException
{
FileWriter fw = new FileWriter("d:\\BufferedWriter.txt");
BufferedWriter bfw = new BufferedWriter(fw);
for(int x = 0;x<5;x++)
{
bfw.write("abcde"+x);
bfw.newLine();
bfw.flush();
}
bfw.close();
}
}
2,BufferedReader
2.1,创建字符输出流对象操作文件
2.2,为了提高效率加入缓冲技术,将字符流对象作为参数传递给BufferedReader
2.3,关闭缓冲区对象BufferedReader
import java.io.*;
class BufferedReaderDemo
{
public static void main(String[] args) throws IOException
{
FileReader fr = new FileReader("d:\\BufferedWriter.txt");
BufferedReader bfr = new BufferedReader(fr);
String s = null;
while((s = bfr.readLine())!=null)
{
System.out.println(s);
}
bfr.close();
}
}
四、复制文本文件
通过字符的缓冲区复制文本文件
/*
通过字符的缓冲区,复制文本文件
*/
import java.io.*;
class CopyText
{
public static void main(String[] args)
{
//读写文件操作
//先读(数据源),后写(数据目的)
//建立缓冲区对象,用来读写
BufferedReader bfr = null;
BufferedWriter bfw = null;
try
{
bfr = new
BufferedReader(new FileReader("q:\\COPYRIGHT"));
bfw = new
BufferedWriter(new FileWriter("d:\\COPYRIGHT"));
//BufferedReader提供读一行的方法 readLine
//返回一个字符串,文件末尾,返回null
//BufferedWriter提供了换行的方法 newLine
//newLine方法有跨平台性,Window \r\n
//Linux \n
String line = null;
while(( line = bfr.readLine() )!=null){
bfw.write(line);
bfw.newLine();
bfw.flush();
}
}
catch (IOException e)
{
System.out.println(e);
throw new RuntimeException("复制失败");
}finally{
try
{
if(bfw!=null)
bfw.close();
}
catch (IOException e)
{
}
try
{
if(bfr!=null)
bfr.close();
}
catch (IOException e)
{
}
}
}
}
五、字节流
字节流处理任意文件,FileOutputStream用于写文件的字节流,FileInputStream 用于读取文件的字节流,读写操作,字节流只能读写字节数组。
以复制图片为例
1,建立FileOutputStream与FileInputStream对象确立数据源和目的
2,FileInputStream对象的read方法读取数据,FileOutputStream对象的write方法写数据
3,关闭读写资源
import java.io.*;
class CopyPicture
{
public static void main(String[] args)
{
FileInputStream fis = null;
FileOutputStream fos = null;
try
{
fis = new FileInputStream("E:\\1.jpg");
fos = new FileOutputStream("E:\\1_copy.jpg");
int len = 0;
byte[] b = new byte[1024*1024];
while((len = fis.read(b))!=-1)
fos.write(b,0,len);
}
catch (IOException e)
{
throw new RuntimeException("文件复制失败");
}finally
{
try
{
if(fis!=null)
fis.close();
}
catch (IOException e)
{
throw new RuntimeException("读取关闭失败");
}
try
{
if(fos!=null)
fos.close();
}
catch (IOException e)
{
throw new RuntimeException("写入关闭失败");
}
}
}
}
六,转换流
InputStreamReader 字节转成字符,OutputStreamWriter 字符转成字节。规律,构造方法中接收的都是字节流,都是用字符流的方法,操作字节流
以获取键盘录入,默认输出到控制台为例
1,键盘录入的内容是字符串,用readLine方法读取更快捷方便,但是读取键盘录入返回的是字节输入流,因而需将字节流转成字符流操作,这个类就是java.io.InputStreamReader
2,System.out这个输出流是字节输出流,将字符串输出应将将字符流转成字节流进行操作,这个类就是OutputStreamWriter ,字符转成字节流。
import java.io.*;
class TransStreamDemo
{
public static void main(String[] args)throws IOException
{
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
OutputStream out = System.out;
OutputStreamWriter ops = new OutputStreamWriter(out);
BufferedWriter bufw = new BufferedWriter(ops);
String str = null;
while((str = bufr.readLine())!=null)
{
if("over".equals(str))
break;
bufw.write(str);
bufw.write(str);
bufw.newLine();
}
bufr.close();
bufw.close();
}
}
七、打印流
打印流:只操作数据目的,不操作数据源,在点对点通信,可以使用打印流将数据打印到另一台主机,在互联网的应用中,可以使用打印流将数据打印到客户端浏览器
1,PrintWriter 接收参数类型
1.1,字节输出流
1.2,字符输出流
1.3,接收File对象
1.4,字符串形式的文件名
2,PrintStream 接收参数类型
2.1,字节输出流
2.2,接收File对象
2.3,字符串形式的文件名
import java.io.*;
class PrintWriterDemo
{
public static void main(String[] args)throws IOException
{
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw = new PrintWriter(new FileWriter("PrintWriterDemo.txt"),true);
String str = null;
while((str = bufr.readLine())!=null)
{
if("over".equals(str))
break;
pw.println(str.toUpperCase());
}
bufr.close();
pw.close();
}
}
八、File类的一个应用
使用File对象,遍历当前硬盘上的一个目录
实现步骤:
1. 将遍历的目录封装到File类的构造方法中,File(String pathname)
2. 调用File类中的一个方法 listFiles(),返回String pathname目录下的内容,返回的是一个File类型数组
3. 遍历数组,
4,取到了一个目录下的内容,但是获取不到子目录下的内容,使用递归对子目录进行遍历,获取子目录下的内容
import java.io.*;
class FileDemo
{
public static void main(String[] args)
{
getAllFiles(new File("c:\\demo"));
}
public static void getAllFiles(File file){
File[] files = file.listFiles();
for( File f : files){
if(f.isDirectory())//f遍历到得是一个目录
getAllFiles(f);
else
System.out.println(f);
}
}
}
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
详细请查看:<a href="http://edu.csdn.net" target="blank">http://edu.csdn.net</a>