一概述
1.IO流用来处理设备之间的数据传输
2.Java对数据的操作是通过流的方式
3.Java用于操作流的对象都在IO包中
4.流按操作数据分为两种:字节流与字符流。
5.流按流向分为:输入流(Input),输出流(Output)。
二常用的基本类
字符流,用于操作字符,针对纯文本文件
1.两个抽象基类:Writer 和 Reader,
2.FileWriter 和 FileReader 其中提高了一些读写方法,可以单个字符读取写入也,也可以以数组的形式读取写入,
由于流的操作涉及到系统资源,所以要处理异常,及关闭资源
例如://数组读写
public static void copy_1()
{ //穿件两个流对象变量
FileWriter fw = null;
FileReader fr = null;
try
{ //关联需要读写的文件
fw = new FileWriter("SystemDemo_copy.txt");
fr = new FileReader("SystemDemo.java");
//定义数组,接收读到数据
char[] buf = new char[1024];
int len = 0;
while((len=fr.read(buf))!=-1)
{ //将数组中的数据写入流
fw.write(buf,0,len);
}
}
catch (IOException e)
{
throw new RuntimeException("读写失败");
}
finally
{
if(fr!=null)
try
{ //关闭读取流
fr.close();
}
catch (IOException e)
{
}
if(fw!=null)
try
{ //关闭写入流
fw.close();
}
catch (IOException e)
{
}
}
}
//字符读写
public static void copy_1()throws IOException//异常抛出
{
//创建目的地。
FileWriter fw = new FileWriter("RuntimeDemo_copy.txt");
//与已有文件关联。
FileReader fr = new FileReader("RuntimeDemo.java");
//定义变量接收所读字符
int ch = 0;
while((ch=fr.read())!=-1)
{
fw.write(ch);
}
fw.close();
fr.close();
}
注意事项:1.定义文件路径时,可以用“/”或者“\\”。
2.在创建一个文件时,如果目录下有同名文件将被覆盖。在读取文件时,必须保证该文件已存在,否则出异常。
3.BufferedWriter 和 BufferedReader:为了提高了对数据的读写效率,出现了缓冲区.
例如:
import java.io.*;
//导入IO包
class CopyTextByBuf
{
public static void main(String[] args)
{ //创建字符流缓冲区对象
BufferedReader bufr = null;
BufferedWriter bufw = null;
try
{ //关联要操作文件
bufr = new BufferedReader(new FileReader("BufferedWriterDemo.java"));
bufw = new BufferedWriter(new FileWriter("bufWriter_Copy.txt"));
//定义字符串变量
String line = null;
while((line=bufr.readLine())!=null)
{ //读写都是以行 为单位.
bufw.write(line);
bufw.newLine();//每读写一行,则换行,否则格式错换
bufw.flush();//即使刷新缓冲区,保存数据
}
}
catch (IOException e)
{
throw new RuntimeException("读写失败");
}
finally
{ //关闭资源
try
{
if(bufr!=null)
bufr.close();
}
catch (IOException e)
{
throw new RuntimeException("读取关闭失败");
}
try
{
if(bufw!=null)
bufw.close();
}
catch (IOException e)
{
throw new RuntimeException("写入关闭失败");
}
}
}
}
字节流
1.两个抽象基类:OutputStream 和 InputStream
2.FileOutputStream 和 FileInputStream 其中提高了一些读写方法,可以单个字节读取写入也,也可以以字节数组数组的 形式读取写入,由于流的操作涉及到系统资源,所以要处理异常,及关闭资源
其中所涉及的方法和字符流基本一致,主要用于非文本文件的操作,比如mp3.图片等.
3.BufferedOutputStream 和 BufferedInputStream:为了提高了对数据的读写效率,出现了缓冲区.
*** 与字符流的区别:用法上基本相同,不过字节流操作以字节为单位,通过字节读写或着是字节数组读写.各有个的所需,所以 再选择用哪种流时,只要明确我们所要操作的数据类型即可.
三File类
1.该是将文件或者文件夹封装成对象,以便对其属性进行操作,并且该类可以和流结合.
2.构造方法
a.File f = new File("a.txt");//直接封装文件的相对路径
b.File f = new File("C:\\abc\\a.txt");//封装文件的绝对路径
c.File dir = new File("c:\\abc");//封装文件夹
File f = new File(dir,"a.txt");//通过文件夹和文件名来构造文件
3.常见成员方法
创建:
createNewFile()//创建文件,文件不存在时,返回true,存在也返回false.注意区分:创建对象的时候,并没有创建文件
makedir()//创建文件夹(单级)
makedirs()//创建多级文件夹
删除:
delete()//删除文件或空文件夹
deleteOnExit()//在虚拟机退出时删除
判断:
canExcute()//判断能否执行
canRead()//是否为可读
canWrite()//是否为可写
compareTo()//比较文件或文件夹的名字
exists()//判断是否存在
isDirectory()//判断存在的文件是否为文件夹
isFile()//判断存在的文件是否为文件
获取:
getName() //获取对象名称
getPath()//获取对象封装的路径
getAbsolutePath()//获取对象的绝对路径
getParent()//获取对象父目录
lastModified()//获取文件最后一次修改的时间
length()//获取文件的大小
特殊方法renameTo()//把该对象的名字改成参数
当2个对象路径相同时.只改名字,但当路径不同时,相当于剪切并重命名.
综合应用:将某目录下的所有.avi文件复制到指定目录下:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopyTest {
public static void main(String[] args) {
File f = new File("E:\\Java\\各类视频\\张孝祥JAVA高新技术");
String str =".avi";
String str1="E:\\Java\\各类视频\\高薪技术\\";
getDocuments(f,str,str1);
}//将f文件下的str文件复制到指定目录str1下
public static void getDocuments(File f,String str,String str1){
File[] files = f.listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory()) {
getDocuments(files[i],str,str1);
}//此处为递归思想,简单将,就是当条件满足一定时,方法不断的重复调用本身
else{
if (files[i].getName().endsWith(str)) {
copyMethod_2(files[i].getAbsolutePath(), str1+files[i].getName());
}
}
}
}
// 定义一个复制方法,通过字节流,并用到缓冲区提高效率,针对非纯文本文件,,参数为源文件和复制文件的绝对路径
public static void copyMethod_2(String source, String copy) {
// 定义缓冲字符读取流对象,初始化为空
BufferedInputStream bis = null;
// 定义缓冲字符写入流对象,初始化为空
BufferedOutputStream bos = null;
// 涉及操作系统资源,会出现异常,所以要处理
try {
// 将读取流和文件关联
bis = new BufferedInputStream(new FileInputStream(source));
// 创建要写入的目的,即数据存储位置.
bos = new BufferedOutputStream(new FileOutputStream(copy));
// 定义数组,用于接收读取到数据
byte[] bt = new byte[1024];
// 定义变量,记录读取的字节数
int len = 0;
// 通过循环,不断的读写完成复制
while ((len = bis.read(bt)) != -1) {
// 将数组中的有效字节写入到文件中
bos.write(bt, 0, len);
}
} catch (IOException e) {
throw new RuntimeException("文件读写失败");
}
// 关闭流资源
finally {
// 操作涉及到系统资源,会抛IOException异常,所以要处理
try {
if (bis != null)
bis.close();// 关闭输入流
} catch (IOException e) {
throw new RuntimeException("读取流关闭失败");
}
try {
if (bos != null)
bos.close();// 关闭输出流
} catch (IOException e) {
throw new RuntimeException("写入流关闭失败");
}
}
}
}
|
|