目录
2、字节流FileInputStream和FileOutputStream
3、字符缓冲流BufferedReader和BufferedWriter
4、字节缓冲流BufferedInputStream和BufferedOutputStream
5、转换流:InputStreamReader和OutputStreamWriter
7、对象操作流ObjectInputStream和ObjectOutputStream
1、字符流FileReader和FileWriter
FileReader:
构造方法:
FileReader(File file) 在给定从中读取数据的 File 的情况下创建一个新 FileReader。 |
FileReader(FileDescriptor fd) 在给定从中读取数据的 FileDescriptor 的情况下创建一个新 FileReader。 |
FileReader(String fileName) 在给定从中读取数据的文件名的情况下创建一个新 FileReader。 |
常用方法:
int read() 从此流中读取一个数据字符。 |
int read(char[] b,int off,int len) 从off开始将len个字符读入到byte数组中。 |
构造方法: FileWriter:
构造方法摘要 | |
---|---|
FileWriter(File file) 根据给定的 File 对象构造一个 FileWriter 对象。 | |
FileWriter(File file, boolean append) 根据给定的 File 对象构造一个 FileWriter 对象。 | |
FileWriter(FileDescriptor fd) 构造与某个文件描述符相关联的 FileWriter 对象。 | |
FileWriter(String fileName) 根据给定的文件名构造一个 FileWriter 对象。 | |
FileWriter(String fileName, boolean append) 根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。 |
主要方法:
void write(int c) 向输出流中写入单个字符。 |
void write(char [] c, int offset, int len) 向输出流中写入字符数组中开始为offset长度为len的某一部分。 |
void write(String s, int offset, int len) 向输出流中写入字符串中开始为offset长度为len的某一部分。 |
代码示例:
File file = new File("test.txt");
// 创建文件
file.createNewFile();
// creates a FileWriter Object
FileWriter writer = new FileWriter(file);
// 向文件写入内容
writer.write("This\n is\n an\n example\n");
writer.flush();
writer.close();
// 读取文件的方式一:逐个字符来读取文本文件
// 创建 FileReader 对象
FileReader fr = null;
try {
fr = new FileReader(file);
int ch = fr.read();
while (ch != -1) {
System.out.print((char) ch);
ch = fr.read();
}
System.out.println();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fr != null)
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//读取文件方式二:使用数组来读取文本文件
FileReader fr1 = null;
try {
fr1 = new FileReader(file);
char [] buf = new char[1024];
int num = 0;
while((num = fr1.read(buf))!=-1) {
System.out.println(new String(buf,0,num));
}
}catch(IOException e) {
e.printStackTrace();
}finally {
try {
if(fr1!=null)
fr1.close();
}catch(IOException e) {
e.printStackTrace();
}
}
//方法三:用缓冲区读取文本文件
//内部实现时是使用数组形式来缓冲字符数据的
FileReader fr2 = null;
BufferedReader bufr = null;
try {
fr2 = new FileReader(file);
bufr = new BufferedReader(fr2);
String line = null;
//BufferedReader提供了按行读取文本文件的方法readLine()
//readLine()返回行有效数据,不包含换行符,未读取到数据返回null
while((line = bufr.readLine())!=null) {
System.out.println(line);
}
}catch(IOException e) {
e.printStackTrace();
}finally {
try {
if(bufr!=null)
bufr.close();
}catch(IOException e) {
e.printStackTrace();
}
}
2、字节流FileInputStream和FileOutputStream
FileInputStream:
构造方法:
构造方法摘要 | |
---|---|
FileInputStream(File file) 通过打开一个到实际文件的连接来创建一个 FileInputStream ,该文件通过文件系统中的 File 对象 file 指定。 | |
FileInputStream(FileDescriptor fdObj) 通过使用文件描述符 fdObj 创建一个 FileInputStream ,该文件描述符表示到文件系统中某个实际文件的现有连接。 | |
FileInputStream(String name) 通过打开一个到实际文件的连接来创建一个 FileInputStream ,该文件通过文件系统中的路径名 name 指定。 |
主要方法:
int read() 从此流中读取一个数据字节。 |
int read(byte[] b) 从此流中将b.length个字节的数据读入到一个byte数组中 |
int read(byte[] b,int off,int len) 从off开始将len个字节读入到byte数组中 |
FileOutputStream:
构造方法摘要 | |
---|---|
FileOutputStream(File file) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。 | |
FileOutputStream(File file, boolean append) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。 | |
FileOutputStream(FileDescriptor fdObj) 创建一个向指定文件描述符处写入数据的输出文件流,该文件描述符表示一个到文件系统中的某个实际文件的现有连接。 | |
FileOutputStream(String name) 创建一个向具有指定名称的文件中写入数据的输出文件流。 | |
FileOutputStream(String name, boolean append) 创建一个向具有指定 name 的文件中写入数据的输出文件流。 |
主要方法:
public void write(int c) |
public void write(byte[] c) 向输出流中写入一个字节数组。 |
public void write(byte[] b, int offset,int len) 向输出流中写入字节串中开始为offset长度为len的某一部分。 |
代码示例:
File fileIn = new File("1.jpg");
File fileOut = new File("2.jpg");
FileInputStream fin=new FileInputStream(fileIn);
FileOutputStream fout=new FileOutputStream(fileOut);
int len=0;
byte[] buff=new byte[1024];
while((len=fin.read(buff)) != -1) {
fout.write(buff, 0, len);
}
fin.close();
fout.close();
3、字符缓冲流BufferedReader和BufferedWriter
BufferedReader:
构造:
BufferedReader br = new BufferedReader(new FileReader(file));
常用方法:
int read() 从该输入流中读取一个字符。 |
int read(char[] cbuf) 从该输入流中读取一个字符数组。 |
String readLine() 从该输入流中读取一个文本行。 |
BufferedWriter:
构造:
BufferedWriter bw=new BufferedWriter(new FileWriter(file));
常用方法:
void write(int c) 向输出流中输出一个字符。 |
void write(String str) 向输出流中输出字符串。 |
void newLine() 向输出流中输出一个行分隔符。 |
代码示例:
File fileIn = new File("1.txt");
File fileOut = new File("2.txt");
FileReader fr = new FileReader(fileIn);
FileWriter fw = new FileWriter(fileOut);
BufferedReader bfr = new BufferedReader(fr);
BufferedWriter bfw = new BufferedWriter(fw);
//一行一行字的写
String line = null;
while((line = bfr.readLine()) != null){
bfw.write(line);
bfw.newLine();
bfw.flush();
}
//一个字一个字的写
/*int ch = 0;
while((ch = bfr.read()) != -1){
bfw.write(ch);
}*/
bfr.close();
bfw.close();
4、字节缓冲流BufferedInputStream和BufferedOutputStream
BufferedInputStream:
构造:
BufferedInputStream bfin=new BufferedInputStream(new FileInputStream(fileIn));
常用方法:
int read() 从输入流中读取一个字节。 |
int read(byte[] b,int off,int len) 给定偏移量处开始将各字节读取到指定的 byte 数组中。 |
BufferedOutputStream:
构造:
BufferedOutputStream bfout=new BufferedOutputStream(new FileOutputStream(fileOut));
常用方法:
void write(int b) 向输出流中输出一个字节。 |
void write(byte[] b,int off,int len) 从 byte 数组中从偏移量 off 开始的 len 个字节写入此缓冲的输出流。 |
复制图片代码示例:
File fileIn = new File("1.jpg");
File fileOut = new File("2.jpg");
BufferedInputStream bfin=new BufferedInputStream(new FileInputStream(fileIn));
BufferedOutputStream bfout=new BufferedOutputStream(new FileOutputStream(fileOut));
int len=0;
byte[] buff=new byte[1024];
while((len=bfin.read(buff))!=-1) {
bfout.write(buff, 0, len);
}
bfin.close();
bfout.close();
5、转换流:InputStreamReader和OutputStreamWriter
InputStreamReader:
将一个字节流中的字节解码成字符
构造方法 |
---|
InputStreamReader(InputStream in) |
InputStreamReader(InputStream in, Charset cs) 创建一个使用给定字符集的InputStreamReader。 |
InputStreamReader(InputStream in, CharsetDecoder dec) |
InputStreamReader(InputStream in, String charsetName) 创建一个使用命名字符集的InputStreamReader。 |
为了最大的效率,可以在BufferedReader中包装一个InputStreamReader。 例如:
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
常用方法:
String getEncoding() |
int read() |
int read(char[] cbuf, int offset, int length) |
返回false并不能保证下一次读取将被阻止。 |
OutputStreamWriter:
将写入的字符编码成字节后写入一个字节流
构造方法:
构造方法 |
---|
OutputStreamWriter(OutputStream out) |
OutputStreamWriter(OutputStream out, Charset cs) |
OutputStreamWriter(OutputStream out, CharsetEncoder enc) |
OutputStreamWriter(OutputStream out, String charsetName) |
为了最大的效率,可以在BufferedWriter中包装一个OutputStreamWriter。 例如:
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileOut)));
常用方法:
void flush() |
String getEncoding() |
void write(char[] cbuf, int off, int len) |
void write(int c) |
void write(String str, int off, int len) |
File fileIn = new File("1.txt");
File fileOut = new File("2.txt");
BufferedReader bfr = new BufferedReader(new InputStreamReader(new FileInputStream(fileIn)));
BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileOut)));
//以字符串方式
String line = null;
while((line = bfr.readLine()) != null){
bfw.write(line);
bfw.newLine();
bfw.flush();
}
/*
//以字符方式
int ch = 0;
while((ch = bfr.read()) != -1) {
bfw.write(ch);
}
*/
bfr.close();
bfw.close();
6、打印流PrintWriter和PrintStream
PrintWriter:
BufferedReader中的readline()方法,用于读取一行从对方传过来的数据。
而数据的输出需要用到PrintWriter的println()的方法,用于将本方的文本数据传给对方。
构造方法:
构造方法: |
---|
PrintWriter(File file) 使用指定的文件创建一个新的PrintWriter,而不需要自动的线路刷新。 |
PrintWriter(File file, String csn) 使用指定的文件和字符集创建一个新的PrintWriter,而不需要自动进行线条刷新。 |
PrintWriter(OutputStream out) 从现有的OutputStream创建一个新的PrintWriter,而不需要自动线路刷新。 |
PrintWriter(OutputStream out, boolean autoFlush) 从现有的OutputStream创建一个新的PrintWriter。 |
PrintWriter(String fileName) 使用指定的文件名创建一个新的PrintWriter,而不需要自动执行行刷新。 |
PrintWriter(String fileName, String csn) 使用指定的文件名和字符集创建一个新的PrintWriter,而不需要自动线路刷新。 |
PrintWriter(Writer out) 创建一个新的PrintWriter,没有自动线冲洗。 |
PrintWriter(Writer out, boolean autoFlush) 创建一个新的PrintWriter。 |
常用方法:
|
void println() 通过写入行分隔符字符串来终止当前行。 |
代码示例:
//从键盘读取数据
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(System.out);
String line = null;
while((line = bufr.readLine())!= null){
//设置结束标志
if("over".equals(line))
break;
out.println(line);
out.flush();
}
out.close();
bufr.close();
PrintStream:
PrintStream流永远不会抛出异常,因为做了try{}catch(){}会将异常捕获,出现异常情况会在内部设置标识,通过checkError()获取此标识。
由印刷的所有字符PrintStream被转换成使用平台的默认字符编码字节。 在需要编写字符而不是字节的情况下,应使用PrintWriter类。
构造方法 |
---|
PrintStream(File file) 使用指定的文件创建一个新的打印流,而不需要自动换行。 |
PrintStream(File file, String csn) 使用指定的文件和字符集创建新的打印流,而不需要自动换行。 |
PrintStream(OutputStream out) 创建一个新的打印流。 |
PrintStream(OutputStream out, boolean autoFlush) 创建一个新的打印流。 |
PrintStream(OutputStream out, boolean autoFlush, String encoding) 创建一个新的打印流。 |
PrintStream(String fileName) 使用指定的文件名创建新的打印流,无需自动换行。 |
PrintStream(String fileName, String csn) 创建一个新的打印流,不需要自动换行,具有指定的文件名和字符集。 |
7、对象操作流ObjectInputStream和ObjectOutputStream
还不会
8、合并流与切割流SequenceInputStream
案例:媒体文件切割与合并,传输大数据文件。
SequenceInputStream表示其他输入流的逻辑级联。 它从一个有序的输入流集合开始,从第一个读取到文件的结尾,然后从第二个文件读取,依此类推,直到最后一个输入流达到文件的结尾。
构造方法:
构造方法 |
---|
SequenceInputStream(Enumeration<? extends InputStream> e) 将所有InputStream类型添加到 Vector集合里,然后将集合放到构造方法。 (Enumeration是迭代器的古老版本,在诸如Vector和Properties这些传统类所定义的方法中仍然存在) |
SequenceInputStream(InputStream s1, InputStream s2) |
方法摘要:
int available() 返回当前底层输入流可以读取(或跳过)的字节数,而不会被下一次调用当前底层输入流的方法阻塞。 |
void close() 关闭此输入流并释放与流相关联的任何系统资源。 |
int read() 从该输入流读取下一个数据字节。 |
int read(byte[] b, int off, int len) 从该输入流读取最多 len个字节的数据到字节数组。 |
合并文件代码示例:
File file1 = new File("1.txt");
File file2 = new File("2.txt");
//合并两个文件
FileInputStream fis1 = new FileInputStream(file1);
FileInputStream fis2 = new FileInputStream(file2));
java.io.SequenceInputStream sequenceInputStream = new java.io.SequenceInputStream(fis1, fis2);
/*合并多个文件
Vector<FileInputStream> v = new Vector<>();
v.add(fis1);
v.add(fis2);
v.add(fis3);
Enumeration<FileInputStream> em = v.elements();
SequenceInputStream sis = new SequenceInputStream(em);
*/
FileOutputStream fileOutputStream = new FileOutputStream("3.txt");
int data;
while ((data = sequenceInputStream.read()) != -1) {
fileOutputStream.write(data);
}
9、RandomAccessFile
RandomAccessFile可以自由访问文件的任意位置。如果需要访问文件的部分内容,而不是把文件从头读到尾,可以选择使用RandomAccessFile。同时RandomAccessFile可以向已存在的文件追加内容。
RandomAccessFile对象包含一个记录指针,用以标识当前读写处的位置,当程序创建一个新的RandomAccessFile对象时,该对象的文件记录指针对于文件头(也就是0处),当读写n个字节后,文件记录指针将会向后移动n个字节。除此之外,RandomAccessFile可以自由移动该记录指针。
RandomAccessFile包含两个方法来操作文件记录指针:
- long getFilePointer():返回文件记录指针的当前位置
- void seek(long pos):将文件记录指针定位到pos位置
构造方法:
构造方法 |
---|
RandomAccessFile(File file, String mode) 创建一个随机访问文件流从File参数指定的文件中读取,并可选地写入文件。 |
RandomAccessFile(String name, String mode) 创建随机访问文件流,以从中指定名称的文件读取,并可选择写入文件。 |
插入步骤:
1)创建临时文件,保存被插入文件的插入点后面的内容。
2)再重新定位到插入点,将需要插入的内容添加到文件后面。
3)最后将临时文件的内容添加到文件后面。
10、File类:
构造方法:
构造方法 |
---|
File(File parent, String child) |
File(String pathname) |
File(String parent, String child) |
File(URI uri) |
常用方法:
boolean isDirectory() 当且仅当该抽象路径名表示的文件存在且为目录时true,否则false。 |
boolean isFile() 当且仅当该抽象路径名表示的文件存在且为普通文件时true; 否则 false。 |
boolean exists() 当且仅当存在由此抽象路径名表示的文件或目录时true; 否则 false。 |
boolean createNewFile() 如果命名文件不存在并被成功创建true; 如果命名文件已经存在 false。 |
boolean delete() 当且仅当文件或目录被成功删除时true; 否则 false。 |
String getAbsolutePath() 返回此抽象路径名的绝对路径名字符串。 |
String getName() 返回由此抽象路径名表示的文件或目录的名称。 |
String getPath() 将此抽象路径名转换为路径名字符串。 |
String getParent() 返回此抽象路径名的父 null的路径名字符串,如果此路径名未命名为父目录,则返回null。 |
String[] list() 一组字符串,命名由此抽象路径名表示的目录中的文件和目录。 如果目录为空,则该数组将为空。 如果此抽象路径名不表示目录,或返回I / O错误,则返回null 。 |
String[] list(FilenameFilter filter) 一组字符串,命名由该抽象路径名表示的目录中由指定的filter接受的文件和filter 。 如果目录为空,或者过滤器没有接受名称,则该数组将为空。 如果此抽象路径名不表示目录,或返回I / O错误,则返回null 。 |
File[] listFiles() 返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。 |
File[] listFiles(FileFilter filter) 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。 |
File[] listFiles(FilenameFilter filter) 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。 |
boolean mkdir() 当且仅当该目录被创建时true; 否则 false。 |
boolean mkdirs() 当且仅当该目录已创建true,以及所有必需的父目录; 否则 false。 |
boolean renameTo(File dest) 重命名由此抽象路径名表示的文件。 |
过滤器:
String[] list()
String[] list(FilenameFilter)
File[] listFiles()
File[] listFiles(FileFilter filter)
File[] listFiles(FilenameFilter filter)
FilenameFilter--文件名过滤器 FileFilter--文件过滤器 都是接口
一个方法
boolean accept(File pathname) 测试指定的抽象路径名是否应包含在路径名列表中。 |
使用案例:
File[] listFiles(FileFilter filter)
if(file.isDirectory()){
File[] files = file.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {//将.java结尾的文件存储到files中
return pathname.isDirectory || pathname.getName().endsWith(".java");
}
});
for (File file1 : files) {
System.out.println(file1);
}
}
File[] listFiles(FilenameFilter filter)
if(file.isDirectory()){
File[] files = file.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return new File(dir,name).isDirectory() || name.endsWith(".java");
}
});
for (File file : files) {
System.out.println(file);
}
}