JAVA_IO流

一、FileWriter和FileReader

1、FileWriter写数据路径问题及关闭和刷新方法的区别

相对路径:相对当前项目而言的,在项目的根目录下(a.txt)
绝对路径:以盘符开始的路径(d:\a.txt)
在相对路径这里插入图片描述
这是相对路径(a.txt)的文件位置,在workspace工作环境下。

2、关闭和刷新方法的区别

flush():刷新缓冲区。流对象还可以继续使用。
close():先刷新缓冲区,然后通知系统释放资源。流对象不可以再被继续使用了。

例如:
fw.write("hello");
fw.flush();
fw.write("world");
fw.flush();
fw,close();
//这是可以的
fw.write("hello");
fw.flush();
fw.close();
fw.write("world");
//这是错误的

3、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常见问题:
1、如何实现数据的换行:\n可以实现换行,但是windows系统自带的记事本打开并没有换行,这是为什么呢?因为windows识别的换行不是\n,而是\r\n.
			windows:\r\n
			linux:\n
			mac:\r
2、如何实现数据的追加写入呢?
      	FileWriter(String fileName,boolean append)

在这里插入图片描述
在这里插入图片描述

4、FileReader读数据

构造方法:

FileReader(String fileName):传递文件名称

成员方法:

int read():一次读取一个字符,注意:因为返回值类型是int类型,所以结果是字符的编码,如果想要控制台出现字符需进行强制类型转换,代码在下面。
文件b.txt中数据为abcde。
在这里插入图片描述
循环语句实现全部输出:
在这里插入图片描述
输出是System.out.print不要加ln进行换行,因为print会自动识别换行字符从而进行换行,例如:在这里插入图片描述

5、一次读取一个字符复制文本文件

在这里插入图片描述

6、FileReader读数据一次一个字符数组

一次读取一个字符数组的方法:

int read(char[] cbuf)
在这里插入图片描述

7、复制文件数据到另一文件的两种方式

一次读取一个字符方式
import java.io.FileNotFoundException;
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("b.txt");
		int ch;
		while((ch=fr.read())!=-1) {
			fw.write(ch);
		}
		fw.close();
		fr.close();
				
	}
}
一次读取一个字符数组方式
//一次读取一个字符数组的方式实现复制文件
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class CopyFileDemo2 {
	public static void main(String[] args) throws IOException {
		FileReader fr = new FileReader("FileWriterDemo.java");
		FileWriter fw = new FileWriter("a.txt");
		char[] chs = new char[1024];
		int len;
		while((len=fr.read(chs))!=-1) {
			fw.write(chs,0,len);
		}
		fw.close();
		fr.close();
	}
}

二、BufferedWriter和BufferedReader

1、BufferedWriter:

将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高速写入。

BufferedReader:

从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高速读取。
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedWriterDemo {
	public static void main(String[] args) throws IOException {
		//创建输出缓冲流对象
	/*	BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));
		bw.write("hello");
		bw.close();*/
		
		//创建输入缓冲流对象
		BufferedReader br = new BufferedReader(new FileReader("b.txt"));
		
		/*//一次读取一个字符
		int ch;
		while((ch=br.read())!=-1) {
			System.out.print((char)ch);
		}
		br.close();
		System.out.println("---------------------------");
		*/
		//一次读取一个字符数组
		char[] chs = new char[1024];
		int len;
		while((len=br.read(chs))!=-1) {
			System.out.print(new String(chs,0,len));
		}
		br.close();
	}
	
}

运行结果:
在这里插入图片描述

2、缓冲流的特殊功能

BufferedWriter
void newLine():写一个换行符,这个换行符由系统决定
BufferedReader
String readLine():一次读取一行数据,但是不读取换行符
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedWriterDemoi2 {
	public static void main(String[] args) throws IOException {
		/*BufferedWriter bw = new BufferedWriter(new FileWriter("d.txt"));
		bw.write("hello");
		bw.newLine();
		bw.write("world");
		for(int x=0;x<10;x++) {
			bw.write("helloworld"+x);
			bw.newLine();
			bw.flush();
		}
		bw.close();*/
		BufferedReader br = new BufferedReader(new FileReader("d.txt"));
		String line;
		while((line=br.readLine())!=null) {
			System.out.println(line);//因为String readLine()方法不读取换行符,所以要加ln换行
		}
		br.close();
	}
}
例题:把FileWriterDemo.java文本中的数据复制到copy.txt中
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class CopyFileDemo3 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new FileReader("FileWriterDemo.java"));
		BufferedWriter bw = new BufferedWriter(new FileWriter("copy.txt"));
		
		String line;
		while((line=br.readLine())!=null) {
			bw.write(line);
			bw.newLine();
			bw.flush();
		}
		bw.close();
		br.close();
	}
}

复制文本文件的五种方式

package zhangzuoyan;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

//复制文本文件(五种方式)
public class CopyFileTest {
	public static void main(String[] args) throws IOException {
		String srcFileName="FileName";
		String destFileName="copy.txt";
		method1(srcFileName,destFileName);
		method2(srcFileName,destFileName);
		method3(srcFileName,destFileName);
		method4(srcFileName,destFileName);
		method5(srcFileName,destFileName);
	}
	//基本流一次读写一个字符
	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);
		}
		fr.close();
		fw.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) {
			fr.read(chs, 0, len);
		}
		fw.close();
		fr.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 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 method5(String srcFileName,String destFileName) throws IOException{
		BufferedReader br = new BufferedReader(new FileReader(srcFileName));
		BufferedWriter bw = new BufferedWriter(new FileWriter(destFileName));
		String line;
		while((line=br.readLine())!=null) {
			bw.write(line);
			bw.newLine();
			bw.flush();
		}
		bw.close();
		br.close();
	}
}

练习1:把集合中的数据写到文本文件中
package zhangzuoyan;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;

//把ArrayList集合中的字符串数据存储到文本文件中
//把每一个字符串数据作为文件中的一行数据

/*分析:A:创建集合对象
	B:往集合中添加字符串对象
	C:创建输出缓冲流对象
	D:遍历集合,得到每一个字符串元素,然后把该字符串元素作为数据写到文本文件
	E:释放资源*/
public class ArrayListToFileTest {
	public static void main(String[] args) throws IOException {
		ArrayList<String> array= new ArrayList<String>();
		array.add("hello");
		array.add("world");
		array.add("java");
		BufferedWriter bw = new BufferedWriter(new FileWriter("array.txt"));
		for(int x=0;x<array.size();x++) {
			String s = array.get(x);
			bw.write(s);
			bw.newLine();
			bw.flush();
		}
		bw.close();
	}
}
练习2:从文本文件中读取数据到ArrayList集合中,并遍历集合
package zhangzuoyan;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

//从文本文件中读取数据到ArrayList集合中,并遍历集合
/*分析:A:创建输入缓冲流对象
	B:创建集合对象
	C:读取数据,每次读取一行数据,把该行数据作为一个元素存储到集合中
	D:释放资源
	E:遍历集合*/
public class FileToArrayListTest {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new FileReader("array.txt"));
		ArrayList<String> array=new ArrayList<String>();
		String line;
		while((line=br.readLine())!=null) {
			array.add(line);
		}
		for(int x=0;x<array.size();x++) {
			String s =array.get(x);
			System.out.println(s);
		}
	}
}

1、IO流练习

一、键盘录入三个学生信息(学号,姓名,年龄,居住地)存入集合。然后遍历集合把每一位学生信息存入文本文件(每一个学生信息为一行数据,自己定义分割标记)

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;

//键盘录入三个学生信息(学号,姓名,年龄,居住地)存入集合。然后遍历集合把每一位学生信息存入文本文件(每一个学生信息为一行数据,自己定义分割标记)
/*分析:A:定义学生类
	B:创建集合对象
	C:写方法实现键盘录入学生信息,并把学生对象作为元素添加到集合
	D:创建输出缓冲流对象
	E:遍历集合,得到每一个学生信息,并把学生信息按照一定的格式写入文本文件
		举例:201716010106,向问天,20,北京
	F:释放资源*/
public class ArrayListToFileTest {
	public static void main(String[] args) throws IOException {
		//创建集合对象
		ArrayList<Student> array= new ArrayList<Student>();
		//写方法实现键盘录入学生信息,并把学生对象作为元素添加到集合
		addStudent(array);
		addStudent(array);
		addStudent(array);
		//创建输出缓冲流对象,
		BufferedWriter bw = new BufferedWriter(new FileWriter("array.txt"));
		//遍历集合,得到每一个学生信息,并把学生信息按照一个的格式写入文本文件中
		for(int x=0;x<array.size();x++) {
			Student s = array.get(x);
			StringBuilder sb = new StringBuilder();
			sb.append(s.getId()).append(",").append(s.getName()).append(",").append(s.getAge()).append(",").append(s.getAddress());
			bw.write(sb.toString());
			bw.newLine();
			bw.flush();
			
		}
		bw.close();
	}
	//添加学生
	public static void addStudent(ArrayList<Student> array) {
		//创建键盘录入对象
		Scanner sc =new Scanner(System.in);
		//为了让id能够被访问到,我们就把id定义在了循环的外边
		String id;
		//为了代码能够回到这里,用循环
		while(true) {
			System.out.println("请输入学生学号:");
			//String id=sc.nextLine();
			id=sc.nextLine();
			//判断学号有没有被人占用
			//定义标记
			boolean flag = false;
			//遍历集合,得到每一个学生
			for(int x =0;x<array.size();x++) {
				Student s=array.get(x);
				//获取该学生的学号,和键盘录入的学号进行比较
				if(s.getId().equals(id)) {
					
					flag=true;//说明学号被占用了
					break;
				}
			}
			if(flag) {
				System.out.println("你输入的学号已经被占用,请重新输入");
			}else {
				break;//结束循环
			}
		}
		System.out.println("请输入学生姓名:");
		String name=sc.nextLine();
		System.out.println("请输入学生年龄:");
		String age=sc.nextLine();
		System.out.println("请输入学生居住地:");
		String address=sc.nextLine();
		//创建学生对象
		Student s =new Student();
		s.setId(id);
		s.setAddress(address);
		s.setName(name);
		s.setAge(age);
		//把学生对象作为元素添加到集合
		array.add(s);
		System.out.println("添加学生成功");
	}
}

在这里插入图片描述
二、把上一题的文本文件中的学生信息读取出来存储到集合中,然后遍历集合,在控制台输出

package zhangzuoyan;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

//把上一题的文本文件中的学生信息读取出来存储到集合中,然后遍历集合,在控制台输出
/*分析:
	A:定义学生类
	B:创建输入缓冲流对象
	C:创建集合对象 
	D:读取文件数据,并把数据按照一定的格式进行分割赋值给学生对象,然后把学生对象作为元素存储到集合
	E:释放资源
	F:遍历集合*/
public class FileToArrayListTest {
	public static void main(String[] args) throws IOException {
		//创建输入缓冲流对象
		BufferedReader br = new BufferedReader(new FileReader("array.txt"));
		//创建集合对象
		ArrayList<Student> array=new ArrayList<Student>();
		//读取文件数据
		String line;
		while((line=br.readLine())!=null) {
			//分割字符串
			String[] strArray=line.split(",");
			//创建学生对象并赋值
			Student s =new Student();
			s.setId(strArray[0]);
			s.setName(strArray[1]);
			s.setAge(strArray[2]);
			s.setAddress(strArray[3]);
			//把学生对象作为元素存储到集合
			array.add(s);
		}
		//释放资源
		br.close();
		//遍历集合
		System.out.println("学号\t\t姓名\t年龄\t居住地");
		for(int x=0;x<array.size();x++) {
			Student s=array.get(x);
			System.out.println(s.getId()+"\t"+s.getName()+"\t"+s.getAge()+"\t"+s.getAddress());
		}
 	}
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值