IO流概述和分类
io流用来处理设备之间的数据传输<常见英语:文件复制,上传文件和下载文件>
io流分类
输出流FileWriter
构造方法:
FileWriter(String fileName):传递一个文件名称
输出流写数据的步骤:
1.创建输出流对象
(a.调用系统资源创建了一个文件
b.创建输出流对象
c.把输出流对象指向文件)
2.调用输出流对象的写数据的方法
写一个字符串数据
对象.write("");
数据没有直接写到文件,其实是写到了内存缓冲区
对象.flush();
3.释放资源<.通知系统释放和该文件相关的资源>
对象.close();
FileWriter写数据的方法:
void write(String str):写一个字符串数据
void write(String str,int index,int len):写一个字符串中的一部分数据
void write(int ch):写一个字符串数据,这里写int类型的好处是既可以写char类型的数据,也可以写char对应的int值 ‘a’ 97
void write(char[] chs):写一个字符数组数据
void write(char[] chs,int index, int len):写一个字符数组的一部分数据
FileWriter fw=new FileWriter("b.txt");//1.创建输出流对象
//void write(String str):写一个字符串数据
fw.write("i love the world");//调用输出流对象的写数据的方法
//void write(String str,int index,int len):写一个字符串中的一部分数据
fw.write("i love the world", 4, 7);
//void write(int ch):写一个字符串数据,
//这里写int类型的好处是既可以写char类型的数据,也可以写char对应的int值 ‘a’ 97
fw.write(97);
fw.write("a");
//void write(char[] chs):写一个字符数组数据
char[]chs= {'b','c','d','e'};
fw.write(chs);
//void write(char[] chs,int index, int len):写一个字符数组的一部分数据
fw.write( chs,1,2);
fw.close();//.释放资源
}
如何实现数据的换行
\n可以实现换行,但Windows自带的记事本打开未换行
window识别的换行是\r\n
linux \n
mac \r
如何实现数据的追加写入
FileWriter(String fileName,boolean append)追加是true 默认是false
FileWriter fw=new FileWriter("c.txt",true);//创建对象,追加数据
for(int i=0;i<10;i++) {
fw.write("hello"+i);
fw.write("\r\n");//换行}
fw.flush();
fw.close();
输入流FileReader(读数据)
需求:从文件中读取数据并显示到控制台
输入流文件的步骤:
1.创建输入流对象
2.调用输入流对象的读数据方法
3.释放资源
成员方法
int read():一次读取一个字符,
int read(char[] cbuf):一次读一个字符数组的数据,返回的是实际读取的字符个数
public static void main(String[] args) throws IOException {
FileReader fr=new FileReader("IoDemo02.java");
int ch;
while((ch=fr.read())!=-1) {
System.out.print((char)ch);
}
fr.close();
}
需求:
把项目路径下的IoDemo.java中的内容复制到项目路径下的Copy.java中
文件复制是有规律可循的
数据源:IoDemo.java------读数据-------FileReader
目的地:Copy.java----------写数据---------FileWriter
FileWriter fw=new FileWriter("Copy.java");//创建输出流对象
FileReader fr=new FileReader("IoDemo02.java");//创建输入流对象
int ch;
while((ch=fr.read())!=-1) {
fw.write(ch);
}
fw.close();
fr.close();
通过测试实际读取长度为-1时,则无数据了
FileReader fr=new FileReader("IoDemo02.java");
char[] chs=new char[1024];//实际开发中写1024或1024的整数倍
int len;
while((len=fr.read(chs))!=-1) {
System.out.print(new String(chs,0,len));
}
fr.close();
}
把项目路径下的IoDemo.java中的内容复制到项目路径下的Copy01.java中
采用int read(char[] cbuf)方法
FileWriter fw=new FileWriter("Copy01.java");
FileReader fr=new FileReader("IoDemo02.java");
char[]chs=new char[1024];
int len;
while((len=fr.read(chs))!=-1) {
fw.write(new String(chs,0,len));
}
fw.close();
fr.close();
字符缓冲流BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组、字符串的写入
创建输出缓冲流
BufferedWriter bw=new BufferedWriter(new FileWriter(“a.txt”));
BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取
BufferedWriter bw=new BufferedWriter(new FileWriter("a.txt"));
bw.write("hello world");
bw.close();
BufferedReader br=new BufferedReader(new FileReader("IoDemo02.java"));
int ch;
while((ch=br.read())!=-1)
{ System.out.print((char)ch); }
int len;
char[] chs=new char[1024];
while((len=br.read(chs))!=-1) {
System.out.print(new String(chs,0,len));
}
}
练习:字符缓冲流复制文件
把项目路径下的IoDemo.java中的内容复制到项目路径下的Copy02.java中
BufferedWriter bw=new BufferedWriter((new FileWriter("Copy02.java")));//创建输出缓冲流对象
BufferedReader br=new BufferedReader(new FileReader("IoDemo02.java"));//创建输入缓冲流对象
int ch;
while((ch=br.read())!=-1) {
bw.write((char)ch);
}
bw.close();
br.close();
}
BufferedWriter bw=new BufferedWriter(new FileWriter("Copy03.java"));
BufferedReader br=new BufferedReader(new FileReader("IoDemo02.java"));
int len;
char[]chs=new char[1024];
while((len=br.read(chs))!=-1) {
bw.write(new String(chs,0,len));
}
br.close();
bw.close();
字符缓冲流的特殊功能:
BufferedWriter void newLine():写一个换行符,这个换行符由系统决定
BufferedReader String readLine():一次读取一行数据,但是不读取换行符
BufferedWriter bw=new BufferedWriter(new FileWriter("a1.txt"));
for(int i=0;i<10;i++) {
bw.write("hello"+i);
bw.newLine();
}
bw.close();
BufferedReader br=new BufferedReader(new FileReader("a1.txt"));
String line;
while((line=br.readLine())!=null) {
System.out.println(line);
}
练习1:构造五种复制文件的方法
String srcFileName="IoDemo02.java";
String DesFileName="Copy05.java";
method1( srcFileName, DesFileName);
method2( srcFileName, DesFileName);
method3( srcFileName, DesFileName);
method4( srcFileName, DesFileName);
method5( srcFileName, DesFileName);
}
public static void method1(String srcFileName,String DesFileName) throws IOException {
FileWriter fw=new FileWriter(DesFileName);
FileReader fr=new FileReader(srcFileName);
int ch;//基本缓冲一次读一个字符
while((ch=fr.read())!=-1) {
fw.write((char)ch);
}
fw.close();
fr.close();
}
public static void method2(String srcFileName,String DesFileName) throws IOException {
FileWriter fw=new FileWriter(DesFileName);
FileReader fr=new FileReader(srcFileName);
int len;//基本缓冲一次读一个字符数组
char[]chs=new char[1024];
while((len=fr.read(chs))!=-1) {
fw.write(new String(chs));
}
fw.close();
fr.close();
}
public static void method3(String srcFileName,String DesFileName) throws IOException {
BufferedWriter bw=new BufferedWriter(new FileWriter(DesFileName));
BufferedReader br=new BufferedReader(new FileReader(srcFileName));
int ch;//字符缓冲一次读一个字符
while((ch=br.read())!=-1) {
bw.write((char)ch);
}
bw.close();
br.close();
}
public static void method4(String srcFileName,String DesFileName) throws IOException {
BufferedWriter bw=new BufferedWriter(new FileWriter(DesFileName));
BufferedReader br=new BufferedReader(new FileReader(srcFileName));
int len;//字符缓冲流一次读一个数组
char[]chs=new char[1024];
while((len=br.read(chs))!=-1) {
bw.write(new String(chs));
}
bw.close();
br.close();
}
public static void method5(String srcFileName,String DesFileName) throws IOException {
BufferedWriter bw=new BufferedWriter(new FileWriter(DesFileName));
BufferedReader br=new BufferedReader(new FileReader(srcFileName));
String line;//按行读取
while((line=br.readLine())!=null) {
bw.write(line);
bw.newLine();
}
bw.close();
br.close();
}
练习2:把ArrayList集合中的字符存储到文本文件
把每一个字符串元素作为文件中的一行数据
分析1.
创建集合对象
2.往集合对象中添加字符串元素
3.创建输出缓冲流对象
4.遍历集合,得到每一个字符串元素,然后把该字符串元素作为数据写到文本文件中
5.释放资源
ArrayList<String> arr=new ArrayList<String>();
for(int i=0;i<10;i++) {
arr.add("hello"+i);
}
BufferedWriter bw=new BufferedWriter(new FileWriter("a2.txt"));
for(int j=0;j<arr.size();j++) {
bw.write(new String(arr.get(j))
);
bw.newLine();
}
bw.close();
}
练习3:把文本中的数据读取到集合中
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
//练习把文本文件读取到集合中
/*
* 1.创建字符输入流对象
* 2.创建集合对象
* 3.读取数据添加到集合中
* 4.释放资源*/
public class test02 {
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new FileReader("a2.txt"));
ArrayList<String> arr=new ArrayList<String>();
String line;
while((line=br.readLine())!=null) {
arr.add(line);
arr.add("\r\n");
}
System.out.println(arr);
}
}