IO流
1.java.io.File
1.凡是与输入输出相关的类、接口都定义在java.io下
2.File是一个类,可以由构造器创建其对象。此对象对应着一个文件(.txt .avi .ppt .doc .mp3 .jpg)或文件目录
3.File类对象是与平台无关的(Java的跨平台特性)
4.File中的方法,仅涉及到如何创建,删除,重命名等(表面功夫),只要涉及到文件内容的,File是无能为力的,必须由io流来完成
5.File类的对象常常作为io流的具体类的构造器的形参
访问文件名:
getName()
getPath()
getAbsoluteFile()
getAbsolutePath()
getParent()
renameTo(File newName)//重命名
boolean b = file1.renameTo(file2);//要求1.file1文件存在,file2文件不存在。2.file1 file2 类型相同(文件或文件目录)
文件检测
exists()
canWrite()
canRead()
isFile()
isDirectory()
获取常规文件信息
lastModified()
length()
文件操作相关
createNewFile()
delete()
目录操作相关
mkDir() //创建一个文件目录,只有在上层文件目录存在的情况下,才返回true
mkDirs()//创建一个文件目录,若上层文件目录不存在,一并创建
list() //返回当前文件夹下的内容,是String[]形式的 String[] str = file1.list();
listFiles()//返回当前文件夹下的内容,是File[]形式的,可以继续后面对文件的操作 File[] files = file1.listFiles();
IO流
1.流的分类
按操作数据单位不同分为:字节流(8 bit),字符流(16 bit)(处理的文本文件)
按数据流的流向不同分为:输入流,输出流
按流的角色的不同分为:节点流(直接作用于文件的),处理流
2.IO的体系:
抽象基类 结点流(文件流) 缓冲流(处理流的一种,可以提升文件操作的效率)
InputStream FileInputStream BufferedInputStream
OutputStream FileOutputStream BufferedOutputStream (flush())
Reader FileReader BufferedReader(String readLine(file);)//还可以一行一行的读取
Writer FileWriter BufferedWriter (flush())
doc文件要复制要用字节流,不能用字符流
注:String readLine(file); 中是读不到换行的,若想写的话,要自己加bw.write(str + "\n") ;或者 bw.newLine();
对于非文本文件(视频,图片,音频),只能使用字节流实现文件的复制FileInputStream、FileOutputStream
对于文本文件,还可以只用字符流FileReader、FileWriter
FileReader、FileWriter
在使用时,只是在读取那里char[] c = new char[20];其他地方与 FileInputStream、 FileOutputStream差不多
字节流的文件读取操作
@Test
public void testInputFileStream1() {
//2.创建一个FileInputStream类的对象
FileInputStream fis = null;
try {
//1.创建一个File类的对象
File file = new File("tests.txt");
fis = new FileInputStream(file);
//3.调用FileInputStream的方法,实现file文件的读取
/*public int read(byte[] b)
*读取文件的一个字节,当执行到文件结尾时,返回-1
*/
byte[] b = new byte[5];
int len;
while((len = fis.read(b)) != -1) {
String str = new String(b, 0, len);//注意不是b.length,否则最后一步没有覆盖完的字符也会输出出来
System.out.print(str);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
//4.关闭相应的流
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//使用try-catch方式处理异常更合理:保证流关闭操作一定可以执行
@Test
public void testInputFileStream() {
//2.创建一个FileInputStream类的对象
FileInputStream fis = null;
try {
//1.创建一个File类的对象
File file = new File("tests.txt");
fis = new FileInputStream(file);
//3.调用FileInputStream的方法,实现file文件的读取
/*
*read():读取文件的一个字节,当执行到文件结尾时,返回-1
*/
int b;
while((b = fis.read()) != -1) {
System.out.print((char)b);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
//4.关闭相应的流
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Test
public void testFileOutputStream() {
//1.创建一个File对象,指明要写入的文件位置
//输出的物理文件可以不存在,当执行过程中,若不存在,会自动创建。若存在,会将原有的文件覆盖
File file = new File("Love.txt");
//2.创建一个FileOutputStream类的对象,将file的对象作为形参传递给FileOutputStream 的构造器中
FileOutputStream fos = null;
try {
fos = new FileOutputStream(file);
//3.调用FileOutputStream的方法,进行写入操作
//fos.write("I love China!");
fos.write(new String("I love you! I love China").getBytes());
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(fos != null) {
try {
//4.关闭对应的文件
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
字符流的文件读取操作
//从硬盘读取一个文件,并写入到另一个位置(相当于复制)
@Test
public void testCopyFile() {
long start = System.currentTimeMillis();
String src = new String("C:\\Users\\hasee\\Desktop\\QQ截图20171106155140.png");
String dest = new String("C:\\Users\\hasee\\Desktop\\4.jpg");
copyFile(src, dest);
long end = System.currentTimeMillis();
System.out.println("花费的时间为: " + (end - start));
}
public void copyFile(String src, String dest){
// File file1 = new File("Love");//注意后缀,有和没有是不同的
// File file2 = new File("Love2.txt");
//File file1 = new File("C:\\Users\\hasee\\Desktop\\QQ截图20171107180120.png");//注意后缀,有和没有是不同的
File file1 = new File(src);
File file2 = new File(dest);//两种格式都可以复制过来
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream(file1);
fos = new FileOutputStream(file2);
byte[] b = new byte[5];
int len;
while((len = fis.read(b)) != -1) {
//fos.write(b);错误的写法两种:fos.write(b, 0, b.length);
fos.write(b, 0, len);
}
}catch(Exception e){
e.printStackTrace();
} finally {
if(fos != null) {
try {
fos.close();
}catch(IOException e) {
e.printStackTrace();
}finally {
if(fis != null) {
try {
fis.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
}
}
}
缓冲流的文件读取操作(一般推荐使用缓冲流直接操作文件,效率更快)
package test;
import java.io.*;
import org.junit.Test;
public class TestBuffered {
@Test
public void TestCopyFile() {
long start = System.currentTimeMillis();
String src = new String("Love.txt");
String dest = new String("hello2.txt");
copyFile(src, dest);
long end = System.currentTimeMillis();
System.out.println("总的输出时间为:" + (end - start));
}
public void copyFile(String src, String dest) {
//1.提供读入、写出文件
File file1 = new File(src);
File file2 = new File(dest);
//2.创建相应的节点流,FileInputStream、FileOutputStream
//3.将创建的节点流的对象作为参数传递给缓冲器的构造器
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
FileInputStream fis = new FileInputStream(file1);
FileOutputStream fos = new FileOutputStream(file2);
bis = new BufferedInputStream(fis);
bos = new BufferedOutputStream(fos);
//4.具体的文件复制操作
byte[] b = new byte[5];
int len;
while((len = bis.read(b)) != -1) {
bos.write(b, 0, len);
bos.flush();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
//5.关闭相应的流
if(bos != null) {
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
}