流概述
流是一组有序的数据序列,根据操作的类型,可以分为 输入流 和输出流。I/O流提供了一条通道程序,可以使用这条通道把源中的字节序列送到目的地。 虽然I/O流通常与磁盘文件存取有关,但是程序的源和目的地也可以是键盘、鼠标、内存或显示器窗口等。
文件编码
字符集
由字符到字节 叫做编码
由字节到字符 叫做解码
类 File
File类是**文件和目录路径名的抽象表示形式。**一个File对象可以代表一个文件或目录,但不是完全对应的。建立File对象不会对文件系统产生影响。
File类定义了一些与平台无关的方法来操作文件,可以通过调用File类中的方法,实现创建、删除、重命名文件等操作。File类的对象主要用来获取文件的一些信息,如文件所在的目录、文件的长度、文件读写权限等。数据流可以将数据写入到文件中,文件页是数据流最常用的数据媒体。
File类的实例的三种构造方法
pathSeparator与系统有关的路径分隔符
Separator与系统有关的默认名称分隔符
注意:不同的操作系统路径分隔符 与名称分隔符不一样
package com.bisxt.io;
import java.io.File;
import java.io.IOException;
public class FileTest {
public static void main(String[] args){
File file = new File("word.txt");
if(file.exists()){
file.delete();
System.out.println("文件已经删除");
}else{
try {
file.createNewFile();
System.out.println("文件已经创建");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
File类的常用方法:
IO_标准步骤
创建源
选择流
操作(读 写)
释放系统资源
文件输入/输出流
程序运行期间,大部分数据都在内存中进行操作,当程序结束或关闭时,这些数据将消失,如果需要将数据永久保存,可以使用文件输入/输出流与指定的文件建立连接,将需要的数据永久保存到文件中。
FilelnputStream 类与 FileOutputStream 类都用来操作磁盘文件。如果用户的文件读取需求比较简单,则可以使用FilelnputStream类,该类继承自InputStream类。FileOutputStream类与FilelnputStream类对应,提供了基本的文件写入能力。FileOutputStream 类是 OutputStream 类的子类。
FilelnputStream 类常用的构造方法如下:
FilelnputStream(String name)
FilelnputStream(File file)
第一个构造方法使用给定的文件名name创建一个FilelnputStream对象,第二个构造方法使用File对象创建 FilelnputStream 对象。第一个构造方法比较简单,但第二个构造方法允许在把文件连接输入流之前对文件作进一步分析。
FileOutputStream 类有与 FilelnputStream 类相同的参数构造方法,创建一个FileOutputStream 对象时,可以指定不存在的文件名,但此文件不能是一个已被其他程序打开的文件。
FileInputStream 从文件系统中的某个文件中获得输入字节。哪些文件可用取决于主机环境。
FileInputStream 用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader。
文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流。文件是否可用或能否可以被创建取决于基础平台。特别是某些平台一次只允许一个 FileOutputStream(或其他文件写入对象)打开文件进行写入。在这种情况下,如果所涉及的文件已经打开,则此类中的构造方法将失败。
FileOutputStream 用于写入诸如图像数据之类的原始字节的流。要写入字符流,请考虑使用 FileWriter。
例题向word.txt文本文档里面写入内容
注:下面的程序重复执行后会把原先的内容覆盖掉!!
package com.bisxt.io;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class TestFile03 {
public static void main(String[] args) {
//选择源
File file = new File("word.txt");
FileOutputStream fileInputStream = null;
try {
//选择流
fileInputStream = new FileOutputStream(file);
//操作读写
String str = "有的时候选择比努力重要,且影响重大,但努力也是必不可少的";
byte bt[] = str.getBytes();
fileInputStream.write(bt);
System.out.println("向文件写内容");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭流,释放系统资源
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
类 FileInputStream的常用方法
类 FileOutputStream的常用方法
FileReader类和FileWriter类
使用FileOutputStream类向文件中写入数据与使用FilelnputStream类从文件中将内容读出来,都存在一点不足,即这两个类都只提供了对字节或字节数组的读取方法。由于汉字在文件中占用两个字节,如果使用字节流,读取不好可能会出现乱码现象,此时采用字符流Reader或Writer类即可避免这种现象。
FileReader和FileWriter字符流对应了FilelnputStream和FileOutputStream类。**FileReader流顺序地读取文件,只要不关闭流,每次调用read0方法就顺序地读取源中其余的内容,直到源的末尾或流被关闭。**下面通过一个应用程序介绍FileReader与FileWriter类的用法。
带缓存的输入/输出流
缓存是I/O的一种性能优化。缓存流为I/O流增加了内存缓冲区。有了缓存区,使得在流上执行skip()、mark()和reset()方法都成为可能。
BufferedInputStream类 与 BufferedOutputStream类
BufferedInputStream类可以对所有InputStream类进行带缓存区的包装以达到性能的优化。BufferedInputStream类有两个构造方法。
- BufferedInputStream(InputStream in)
- BufferedInputStream(InputStream in ,int size)
**第一种形式的构造方法创建了一个带有32个字节的缓存流;第二种形式的构造方法按指定的大小来创建缓存区。**一个最优的缓存区的大小取决于它所在的操作系统、可用的内存空间以及机器配置。从构造方法可以看出,BufferedInputStream对象位于InputStream对象之前,下图描述了字节数据读取文件的过程
使用BufferedOutputStream输出信息和用OutputStream输出信息完全一样,只不过BufferedOutputStream有一个flush()方法用来将缓存区的数据强制输出完。
BufferedOutputStream类也有两个构造方法: - BufferedOutputStream(OutputStream in)。
- BufferedOutputStream(OutputStream in,int size)。
第一种构造方法创建一个有32个字节的缓存区,第二种构造方法以指定的大小来创建缓存区。
注意:flush()方法就是用于即使在缓存区没有满的情况下,也将缓存区的内容强制写入到外设,习惯上称这个过程为刷新。flush()方法只对使用缓存区的OutputStream类的子类有效。当调用close()方法时,系统在关闭流之前,也会将缓存区中的信息刷新到磁盘文件中。
例题:利用FileInputStream FileOutputStream BufferedOutputStream BufferedInputStream 实现文件的复制;查看下面的代码:
package com.bisxt.io;
import java.io.*;
public class TestFile04 {
public static void main(String[] args) {
//选择源
File fileSource = new File("E:\\LJ.mp4");
File destPosition = new File("F:\\LJ123.mp4");
BufferedInputStream fileInputStream = null;
BufferedOutputStream fileOutputStream = null;
try {
//选择流
long start = System.currentTimeMillis();
fileInputStream = new BufferedInputStream(new BufferedInputStream(new FileInputStream(fileSource)));
fileOutputStream = new BufferedOutputStream(new BufferedOutputStream(new FileOutputStream(destPosition)));
byte[] temp = new byte[1024*1024];
int len ;
while((len =fileInputStream.read(temp)) != -1){
fileOutputStream.write(temp,0,temp.length);
}
fileOutputStream.flush();
long end = System.currentTimeMillis();
System.out.println(end-start);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}