Java中设计文件内容的,就需要使用IO完成。
IO流分为字节流和字符流,整个IO体系的分类如下图所示:

操作文本文件使用字节流或者字符流都行,操作非文本文件(图片,视频,音频)必须使用字节流。
在谈及IO流之前,需要讨论一下File这个类
/*
* java.io.File类
* 1.凡是与输入、输出相关的类、接口等都定义在java.io包下
* 2.File是一个类,可以有构造器创建其对象。此对象对应着一个文件(.txt .avi .doc .ppt .mp3 .jpg)或文件目录
* 3.File类对象是与平台无关的。
* 4.File中的方法,仅涉及到如何创建、删除、重命名等等。只要涉及文件内容的,File是无能为力的,必须由io流来完成。
* 5.File类的对象常作为io流的具体类的构造器的形参。
*/
/*
* 路径:
* 绝对路径:包括盘符在内的完整的文件路径
* 相对路径:在当前文件目录下的文件的路径
* File 类下的一些方法
* getName() 获取该文件名
getPath() 获取该文件的完整路径名
getAbsoluteFile() 获取该文件的完整路径名
getAbsolutePath() 获取该文件的完整路径名
getParent() 获取该文件的父文件完整路径名
renameTo(File newName) 重命名文件
*/
举个栗子:
File file1 = new File("d:/io/helloworld.txt");
File file2 = new File("hello1.txt");
File file3 = new File("d:\\io\\io1");
File file4 = new File("d:\\io2");
System.out.println(file1.getName());
System.out.println(file1.getPath());
System.out.println(file1.getAbsoluteFile());
System.out.println(file1.getParent());
System.out.println(file1.getAbsolutePath());
System.out.println();
System.out.println(file3.getName());
System.out.println(file3.getPath());
System.out.println(file3.getAbsoluteFile());
System.out.println(file3.getParent());
System.out.println(file3.getAbsolutePath());
//renameTo(File newName):重命名
//file1.renameTo(file2):file1重命名为file2.要求:file1文件一定存在,file2一定不存在
boolean b = file1.renameTo(file2);
System.out.println(b);
boolean b1 = file4.renameTo(file3);
System.out.println(b1);运行结果:helloworld.txt
d:\io\helloworld.txt
d:\io\helloworld.txt
d:\io
d:\io\helloworld.txt
io1
d:\io\io1
d:\io\io1
d:\io
d:\io\io1
false
false/** exists() 判断该文件或者目录是否存在
canWrite() 判断应用程序是否可以修改此抽象路径名表示的文件
canRead() 判断应用程序是否可以读取此抽象路径名表示的文件
isFile() 测试此抽象路径名表示的文件是否是一个标准文件
isDirectory() 判断是否是目录
lastModified() 返回最后一次修改时间
length() 返回该文件长度
*/
举个栗子:
File file1 = new File("d:/io/helloworld.txt");
System.out.println(file1.exists());
System.out.println(file1.canWrite());
System.out.println(file1.canRead());
System.out.println(file1.isFile());
System.out.println(file1.isDirectory());
System.out.println(new Date(file1.lastModified()));
System.out.println(file1.length());运行结果(由于文件不存在,得如下结果):false
false
false
false
false
Thu Jan 01 08:00:00 CST 1970
0/** createNewFile()创建新文件
delete() 删除文件 当且仅当成功删除文件或目录时,返回
true;否则返回 falsemkDir():创建一个文件目录。只有在上层文件目录存在的情况下,才能返回true
mkDirs():创建一个文件目录。若上层文件目录不存在,一并创建
*/
举个栗子:
File file1 = new File("d:/io/helloworld.txt");
System.out.println(file1.delete());
if(!file1.exists()){
boolean b = file1.createNewFile();
System.out.println(b);
}
File file2 = new File("d:\\io1\\io2");
if(!file2.exists()){
boolean b = file2.mkdirs();
System.out.println(b);
}运行结果:false
true
true说完 IO 体系的 File 类 ,我们正式开始讨论 IO:
抽象基类 节点流(文件流) 缓冲流(处理流的一种,可以提升文件操作的效率)
InputStream FileInputStream BufferedInputStream
OutputStream FileOutputStream BufferedOutputStream (flush())
Reader FileReader BufferedReader (readLine())
Writer FileWriter BufferedWriter (flush())
使用字符流和字节流对文本文件进行复制:
将 ok.txt 的内容复制到一个名为 出师表.txt (该文件自动创建)的文件中
private static void testCopyFile() {
long beginString = System.currentTimeMillis();
FileReader fileReader = null;
FileWriter fileWriter = null;
File file1 = new File("ok.txt");
File file2 = new File("出师表.txt");
try {
fileReader = new FileReader(file1);
fileWriter = new FileWriter(file2);
char[] bytes = new char[1024];
int len;
while ((len = fileReader.read(bytes))!=-1) {
fileWriter.write(bytes);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
if (fileWriter != null) {
try {
fileWriter.close();
} catch (IOException e) {
}
}
if (fileReader != null) {
try {
fileReader.close();
} catch (IOException e) {
}
}
}
long endString = System.currentTimeMillis();
System.out.println("耗时:"+(endString - beginString));
}运行结果:
耗时:2使用字符流复制文件时使用了 FileReader 和 FileWriter 来读写文件,通过创建一个 固定大小的 char[] 来装载
使用字符流和字节流对非文本文件(图片,音频,视频)进行复制:
private static void testCopyPhoto() {
long beginString = System.currentTimeMillis();
BufferedOutputStream bos = null;
BufferedInputStream bis = null;
File file1 = new File("1.jpg");
File file2 = new File("3.jpg");
/**
* 文本文件不仅可以使用字符流处理,还可以使用字节流处理,
* 但是图片,视频,音频只能使用字节流处理
**/
// File file1 = new File("ok.txt");
// File file2 = new File("出师表2.txt");
try {
FileInputStream fis = new FileInputStream(file1);
FileOutputStream fos = new FileOutputStream(file2);
bos = new BufferedOutputStream(fos);
bis = new BufferedInputStream(fis);
byte[] bytes = new byte[1024];
int len;
while ((len = bis.read(bytes)) != -1) {
bos.write(bytes);
bos.flush();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
if (bos != null) {
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
long endString = System.currentTimeMillis();
System.out.println("耗时:"+(endString - beginString));
}运行结果:
耗时:69使用字符流复制文件时使用了缓冲流,BufferedInputStream 和 BufferedOutputStream能提高文件传输的速度。
未完待续.......
本文详细介绍了Java中的IO流概念及分类,包括字节流和字符流,并通过实例演示了如何使用File类进行文件操作,以及如何利用不同类型的IO流复制文本和非文本文件。

被折叠的 条评论
为什么被折叠?



