1、IO流:用来处理设备之间的数据传输(文件复制,上传文件和下载文件)
2、IO流分类:
(1)输出流(FileWriter):
A、往文件中写数据,传递一个文件名称
a、构造方法:FileWriter(String fileName)
b、成员方法:void write(String str);void fiush();void close()
B、输出流写数据的步骤:
a、创建输出流对象;(调用系统资源创建了一个文件;创建输出流对象;把输出流对象指向文件)
b、调用输出流对象的写数据的方法;
c、释放资源
C、FileWriter写数据的方法:
a、void write(String str):写一个字符串数据
b、void write(String str,int index,int len):写一个字符串中的一部分数据
c、void write(int ch):写一个字符数据,这里写int类型的好处是既可以写char类型的数据,也可以写char对应的int类型的值,如'a',97
d、void write(char[ ] chs):写一个字符数组数据
e、void write(char[ ] chs,int index,int len):写一个字符数组数据的一部分数据
例:
package com.itheima;
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterTest {
public static void main(String[] args) throws IOException {
FileWriter fw=new FileWriter("b.txt");
//void write(String str):写一个字符串数据
fw.write("abcde");
//void write(String str,int index,int len):写一个字符串中的一部分数据
fw.write("abcde",0,5);
//void write(int ch):写一个字符数据,这里写int类型的好处是既可以写char类型的数据,也可以写char对应的int类型的值,如'a',97
fw.write('a');
fw.write(97);
//void write(char[] chs):写一个字符数组数据
char[] chs={'a','b','c','d','e'};
fw.write(chs);
//void write(char[] chs,int index,int len):写一个字符数组数据的一部分数据
fw.write(chs,2,3);
//释放资源
fw.close();
}
}
注意:
a、相对路径:相对当前项目而言的,在项目的根目录下(例:a.txt)
b、绝对路径:以盘符开始的路径(例:d:\ a.txt)
(2)输入流(FileReader):
A、往文件中读数据到控制台,传递一个文件名称
a、构造方法: FileReader(String fileName)
b、成员方法:int read();int read(char[ ] cbuf):一次读一个字符数组的数据,返回的是实际读取字符的个数
例:
package com.itheima;
import java.io.FileReader;
import java.io.IOException;
public class FileReaderDemo2 {
public static void main(String[] args) throws IOException {
//创建输入流对象
FileReader fr=new FileReader("fr2.txt");
//调用输入流对象的读数据方法
//int read(char[] cbuf):一次读一个字符数组的数据,返回的是实际读取字符的个数
/*
* char[] chs=new char[5];
* //第一次读数据
* int len=fr.read(chs);
* System.out.println("len:"+len);
* System.out.println(new String(chs,0,len));
* //第二次读数据
* len=fr.read(chs);
* System.out.println("len:"+len);
* System.out.println(new String(chs,0,len));
* //第三次读数据
* len=fr.read(chs);
* System.out.println("len:"+len);
* System.out.println(new String(chs,0,len));
*/
//char[] chs=new char[5];
char[] chs=new char[1024];//这里可以是1024及其整数倍
int len; //1、fr.read(chs);//2、len=fr.read(chs); //3、len!=-1
while((len=fr.read(chs))!=-1){
System.out.println(new String(chs,0,len));
}
//释放资源
fr.close();
}
}
B、输入流读数据的步骤:
a、创建输入流对象
b、调用输入流对象的读数据的方法
c、释放资源
注意:
(1)读数据首先要看文件是否存在,如果报错java.io.FileNotFoundException: fr.txt (系统找不到指定的文件),则在该项目下创建一个file文件
(2)读数据/写数据都要导入相应的包,并抛出异常
*close()和flush()方法的区别:
(1)flush():刷新缓冲区,流对象还可以继续使用;
(2)close():先刷新缓冲区,然后通知系统释放资源,流对象不可以再被使用了
3、实现数据的换行:
(1)windows:
;
(2)linux:
;
(3)mac:
*数据的追加写入:FileWriter(String fileName,boolean append)
4、输入/输出缓冲流:
(1)BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供各个字符、数组和字符串的高效写入
(2)BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现各个字符、数组和行的高效读取
(3)缓冲流读取数据的两种方式:
a、一次读写一个字符:
例:
int ch;
while((ch=br.read())!=-1) {
System.out.print((char)ch);
}
b、一次读写一个字符数组:
例:
char[] chs=new char[1024];
int len;
while((len=br.read(chs))!=-1) {
System.out.print(new String (chs,0,len));
}
注意:在创建一个输出缓冲流对象时,后面一定要记得加new FileWriter,如:BufferedWriter bw=new BufferedWriter(new FileWriter("bw.txt"))
5、缓冲流的特殊功能:
(1)BufferedWriter
void newLine():写一个换行符,这个换行符由系统决定
(2)BufferedReader
String readLine():一次读取一行数据,但不读取换行符
6、复制文本文件的5种案例:
package com.itheima;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CopyFileDemo {
public static void main(String[] args) throws IOException {
//创建输入流对象
/*
* FileReader fr=new FileReader("FileWriterDemo.java"); //创建输出流对象 FileWriter
* fw=new FileWriter("Copy.java"); //一次读写一个字符数据 int ch;
* while((ch=fr.read())!=-1){ fw.write(ch); }
*
* //一次读写一个字符数组 char[] chs=new char[1024]; int len;
* while((len=fr.read(chs))!=-1){ fw.write(chs,0,len); }
*
* //释放资源 fw.close(); fr.close(); } }
*/
/*
* method1("FileWriterDemo.java","Copy.java");//需要修改5个地方
* method2("FileWriterDemo.java","Copy.java");
* method3("FileWriterDemo.java","Copy.java");
* method4("FileWriterDemo.java","Copy.java");
* method5("FileWriterDemo.java","Copy.java");
*/
String srcFileName="FileWriterDemo.java";
String destFileName="Copy.java";
method1(srcFileName,destFileName);//只需要修改一个地方
method2(srcFileName,destFileName);
method3(srcFileName,destFileName);
method4(srcFileName,destFileName);
method5(srcFileName,destFileName);
}
//缓冲流:一次读写一个字符串
public static void method5(String srcFileName,String destFileName) throws IOException {
//创建输入缓冲流对象
BufferedReader br=new BufferedReader(new FileReader(srcFileName)) ;
//创建输出缓冲流对象
BufferedWriter bw=new BufferedWriter(new FileWriter(destFileName)) ;
//一次读写一个字符串
String line;
//1、br.readLine()
//2、line=br.readLine()
//3、line!=null
while((line=br.readLine())!=null) {
bw.write(line);
bw.newLine();
bw.flush();
}
//释放资源
bw.close();
br.close();
}
//缓冲流:一次读写一个字符数组
public static void method4(String srcFileName,String destFileName) throws IOException {
//创建输入缓冲流对象
BufferedReader br=new BufferedReader(new FileReader(srcFileName)) ;
//创建输出缓冲流对象
BufferedWriter bw=new BufferedWriter(new FileWriter(destFileName)) ;
//一次读写一个字符数组
char[] chs=new char[1024];
int len;
while((len=br.read(chs))!=-1){
bw.write(chs,0,len);
}
//释放资源
bw.close();
br.close();
}
//缓冲流:一次读写一个字符
public static void method3(String srcFileName,String destFileName) throws IOException {
//创建输入缓冲流对象
BufferedReader br=new BufferedReader(new FileReader(srcFileName)) ;
//创建输出缓冲流对象
BufferedWriter bw=new BufferedWriter(new FileWriter(destFileName)) ;
//一次读写一个字符
int ch;
while((ch=br.read())!=-1){
bw.write(ch);
}
//释放资源
bw.close();
br.close();
}
//基本流:一次读写一个字符数组
public static void method2(String srcFileName,String destFileName) throws IOException {
//创建输入流对象
FileReader fr=new FileReader (srcFileName);
//创建输出流对象
FileWriter fw=new FileWriter(destFileName);
//一次读写一个字符数组
char[] chs=new char[1024];
int len;
while((len=fr.read(chs))!=-1){
fw.write(chs,0,len);
}
//释放资源
fw.close();
fr.close();
}
//基本流:一次读写一个字符
public static void method1(String srcFileName,String destFileName) throws IOException {
//创建输入流对象
FileReader fr=new FileReader (srcFileName);
//创建输出流对象
FileWriter fw=new FileWriter(destFileName);
//一次读写一个字符
int ch;
while((ch=fr.read())!=-1){
fw.write(ch);
}
//释放资源
fw.close();
fr.close();
}
}