3.5、IO字符流
IO流用来处理设备之间的数据传输
文件复制,上传、下载文件
IO流分类
输出流
FileWriter
输入流
FileReader
常见的换行符:
Windows
\r\n
Linux
\n
Mac
\r
3.5.0、写数据
package myIo;
import java.io.FileWriter;
import java.io.IOException;
/**
* Created by JackFeng on 2020/3/8.
*/
/*
* 需求: 往文件中写数据
*
* 写数据 -- 输出流 ---FileWriter
*
*
* */
public class FileWriterDemo {
public static void main(String[] args) throws IOException {
// 创建输出流对象
// 调用系统资源创建一个文件,创建输出流对象,把输出流对象指向文件
// 不写路径 就会在 在相对路径下创建!
// FileWriter fw = new FileWriter("D:\\Practice\\Java\\JavaSE\\a.txt"); // 默认为false
FileWriter fw = new FileWriter("D:\\Practice\\Java\\JavaSE\\a.txt",true); // true 为追加写入
// 写字符串数据
// fw.write("IO你好");
// 数据没有直接写入 到文件中, 其实是写到了内存缓冲区
// fw.flush(); // 刷新缓冲区
// 释放资源 通知系统释放和该文件相关的资源
// 写数据的几种方法
/*
* 1、write(String str) 写一个字符串数据
*
* */
// 1
// fw.write("abcde");
//2
// fw.write("abcd",1,2);
// 3
// fw.write(97);
// 4 写一个数组
// char[] chs = {'a', 'b', 'c'};
// fw.write(chs);
// 5
// fw.write(chs, 0, 1);
// 数据换行 + 数据追加写入
// \n 可以换行,windows 没有换行 ,\r\n
for (int i = 0; i < 10 ; i++) {
fw.write("Hi"+i);
fw.write("\r\n");
}
fw.close(); // 先刷新缓冲区。再通知系统释放资源
}
}
3.5.1、读数据
package myIo;
import java.io.FileReader;
import java.io.IOException;
/**
* Created by JackFeng on 2020/3/8.
*/
public class FileReaderDemo {
public static void main(String[] args) throws IOException {
// 创建输入流 对象
FileReader fr = new FileReader("D:\\Practice\\Java\\JavaSE\\a.txt");
/* // 读数据方法
// 1. int read()
// 第一次读数据
int ch = fr.read();
System.out.println(ch);
System.out.println((char)ch);
// 第二次
ch = fr.read();
System.out.println(ch);
System.out.println((char)ch);
// 如果读取数据的返回值 是 -1的时候 说明结束了*/
// 标准代码
// 读取 字符串
/* int ch;
while ((ch=fr.read())!= -1){
// System.out.println(ch);
System.out.print((char)ch);
}*/
//第二种读取数据方式 一次读取一个数组的数据
// 标准代码 效率较高
// char[] chs = new char[5];
char[] chs = new char[1024]; // 一般写1024 及其整数倍
int len;
while ((len= fr.read(chs)) != -1){
System.out.print(new String(chs,0,len));
// 以数组方式读入
}
fr.close(); // 释放资源
}
}
3.5.2、文件复制
package myIo;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/**
* Created by JackFeng on 2020/3/8.
*/
public class CopyFileDemo {
public static void main(String[] args) throws IOException {
// 创建输入刘对象
FileReader fr = new FileReader("D:\\Practice\\Java\\JavaSE\\src\\myIo\\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);
}
fr.close();
fw.close();
}
}
3.5.3、字符缓冲流
BufferedWriter ---- 高效写入
BufferedReader --- 高效读取
不是直接传入文件,而是传入 FileWriter
特殊功能
BufferedWriter
Void newLine() ---- 写一个换行符,这个换行符由系统决定的
BufferedReader
String readLine() ---- 一次读取一行数据,但是不读取换行符
package myIo;
import java.io.*;
/**
* Created by JackFeng on 2020/3/8.
*/
public class BufferedDemo {
public static void main(String[] args) throws IOException {
// 创建输出缓冲流对象
BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt"));
bw.write("hello world");
// bw.flush();
for (int i = 0; i < 10 ; i++) {
bw.write("Hi"+i);
// bw.write("\r\n");
bw.newLine(); // 等同于 bw.write("\r\n");
}
bw.close();
// 创建输入缓冲流对象
BufferedReader br = new BufferedReader( new FileReader("a.txt"));
// 一次写一个字符
/* int ch;
while ((ch=br.read())!= -1){
System.out.print((char) ch);
}*/
// 一次读写一个数组
/*
char[] chs = new char[1024];
int len;
while ((len = br.read(chs))!= -1)
// System.out.print(chs,0,len); 这里会报错 需要 new String 构造
System.out.println(new String(chs,0,len));
br.close();*/
String line;
// br.readLine
while((line= br.readLine())!=null){
System.out.println(line);
}
br.close();
}
}
集合数据写入文件
package myIo;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
/**
* Created by JackFeng on 2020/3/8.
*/
public class ArrayListToFileTest {
public static void main(String[] args) throws IOException {
// 创建集合对象
ArrayList<String> array = new ArrayList<>();
// 给集合添加元素
array.add("hello");
array.add("world");
array.add("今天是2020,三八妇女节");
// 创建缓冲流输出对象
BufferedWriter bw = new BufferedWriter( new FileWriter("array.txt"));
//遍历集合写入到文件
for (int i = 0; i <array.size() ; i++) {
String s = array.get(i);
bw.write(s);
bw.newLine(); // 读取换行
bw.flush();
}
bw.close();
}
}
文件存入集合
package myIo;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
/**
* Created by JackFeng on 2020/3/8.
*/
public class FileToArrayList {
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);
}
br.close();
//遍历集合
for (int i = 0; i <array.size() ; i++) {
String s = array.get(i);
System.out.println(s);
}
}
}
学生管理添加升级版本
package myIo;
import myStudentManager.Student;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;
/**
* Created by JackFeng on 2020/3/8.
*/
public class ArratListToFileTest {
public static void main(String[] args) throws IOException {
ArrayList<Student> array = new ArrayList<>();
// 写方法添加学生对象
addStudent(array);
addStudent(array);
addStudent(array);
// 创建输出缓冲流对象
BufferedWriter bw = new BufferedWriter(new FileWriter("std.txt"));
for (int i = 0; i <array.size() ; i++) {
Student s = array.get(i);
// 链式编程
/// 姓名,年龄,。。。 采用 StringBuilder
StringBuilder sb = new StringBuilder();
sb.append(s.getId()).append(",").append(s.getName()).append(",").append(s.getAddress()).append(",").append(s.getAge());
bw.write(sb.toString()); // 转化为string
bw.newLine(); // 换行
bw.flush(); // 刷新
}
bw.close();
}
// 添加学生
public static void addStudent(ArrayList<Student> array){
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
// id 定义在外边 因为下边还要用
String id;
// 代码重复使用
while (true){
System.out.println("请输入 学生ID:");
// String id = sc.nextLine();
id = sc.nextLine();
//判断学号是否存在
// 定义标记默认为false
boolean flag = false;
for (int i = 0; i <array.size() ; i++) {
Student s = array.get(i);
if (s.getId().equals(id)){
flag = true; // 说明学号被占用
}
}
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.setAge(age);
s.setName(name);
s.setAddress(address);
// 把学生对象添进 集合
array.add(s);
System.out.println("学生信息添加成功====姓名为: "+s.getName());
}
}
期待您的进步