1、IO体系总图

2、IO体系——字节流

记忆路线:输入输出流前面加File和Buffered,这样就全记住了
3、表达式解释
表达式:由变量和常量通过运算符连接起来的式子,单个的常量和变量也是表达式
4、标准代码JDK1.6之前(掌握)
1、通过标准输入输出流,一个字节一个字节拷贝文件
/**
* 将source拷贝到dest中 source:源文件 dest:目标文件
*/
public static void copy1(String source, String dest) {
// 输入流
FileInputStream fis = null;
// 输出流
FileOutputStream fos = null;
try {
fis = new FileInputStream(source);
fos = new FileOutputStream(dest);
// 读取到的数据
int data;
while ((data = fis.read()) != -1) {
fos.write(data);
}
} catch (Exception e) {
e.printStackTrace();
} finally{
if(fis != null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(fos != null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2、通过标准输入输出流,采用小数组的方式拷贝文件
public static void copy2(String source, String dest) {
// 输入流
FileInputStream fis = null;
// 输出流
FileOutputStream fos = null;
try {
fis = new FileInputStream(source);
fos = new FileOutputStream(dest);
//bys里存的是读取到的数据
byte[] bys= new byte[1024];
//读取了几个数据
int len;
while((len=fis.read(bys)) != -1){
fos.write(bys, 0, len);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(fis != null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(fos != null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
3、通过高效流和字节数组的方式拷贝文件(这个必须掌握)
public void copy3(String source, String dest) throws Exception {
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
bis = new BufferedInputStream(new FileInputStream(source));
bos = new BufferedOutputStream(new FileOutputStream(dest));
byte[] bys = new byte[1024*20];
int len;
while((len=bis.read(bys)) != -1){
bos.write(bys, 0, len);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(bis != null){
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(bos != null){
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
5、标准代码JDK1.7(掌握)
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class CopyDemo {
public static void main(String[] args) {
/*
格式:
try(
//声明输入输出流
){
//拷贝文件
}catch(Exception e){
//异常处理
}
*/
try(
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(".project"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("a.txt"));
){
//存储读取到的数据
byte[] data = new byte[1024*8];
//存储读取到的数据的长度
int len = -1;
//通过read方法将数据读取到data数组中,读取了几个数据呢?读取了len个数据
while((len=bis.read(data)) !=-1){
bos.write(data,0,len);
}
}catch(Exception e){
e.printStackTrace();
}
}
}
5、案例(掌握)
1、将写出的字节异或上一个数,这个数就是密钥,解密的时候再次异或就可以了
2、在控制台录入文件的路径,将文件拷贝到当前项目下
3、将键盘录入的数据拷贝到当前项目下的text.txt文件中,键盘录入数据当遇到quit时就退出
6、案例代码(掌握)
1、将写出的字节异或上一个数,这个数就是密钥,解密的时候再次异或就可以了
package com.heima.test;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test1 {
/**
* @param args
* @throws IOException
* 将写出的字节异或上一个数,这个数就是密钥,解密的时候再次异或就可以了
*/
public static void main(String[] args) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("copy.jpg"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy2.jpg"));
int b;
while((b = bis.read()) != -1) {
bos.write(b ^ 123);
}
bis.close();
bos.close();
}
}
2、在控制台录入文件的路径,将文件拷贝到当前项目下
package com.heima.test;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;
public class Test2 {
/**
* 在控制台录入文件的路径,将文件拷贝到当前项目下
*
* 分析:
*
* 1,定义方法对键盘录入的路径进行判断,如果是文件就返回
* 2,在主方法中接收该文件
* 3,读和写该文件
* @throws IOException
*/
public static void main(String[] args) throws IOException {
File file = getFile(); //获取文件
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file.getName()));
int b;
while((b = bis.read()) != -1) {
bos.write(b);
}
bis.close();
bos.close();
}
/*
* 定义一个方法获取键盘录入的文件路径,并封装成File对象返回
* 1,返回值类型File
* 2,参数列表无
*/
public static File getFile() {
Scanner sc = new Scanner(System.in); //创建键盘录入对象
System.out.println("请输入一个文件的路径:");
while(true) {
String line = sc.nextLine(); //接收键盘录入的路径
File file = new File(line); //封装成File对象,并对其进行判断
if(!file.exists()) {
System.out.println("您录入的文件路径不存在,请重新录入:");
}else if(file.isDirectory()) {
System.out.println("您录入的是文件夹路径,请重新录入:");
}else {
return file;
}
}
}
}
3、将键盘录入的数据拷贝到当前项目下的text.txt文件中,键盘录入数据当遇到quit时就退出
package com.heima.test;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;
public class Test3 {
/**
* 将键盘录入的数据拷贝到当前项目下的text.txt文件中,键盘录入数据当遇到quit时就退出
*
* 分析:
* 1,创建键盘录入对象
* 2,创建输出流对象,关联text.txt文件
* 3,定义无限循环
* 4,遇到quit退出循环
* 5,如果不quit,就将内容写出
* 6,关闭流
* @throws IOException
*/
public static void main(String[] args) throws IOException {
//1,创建键盘录入对象
Scanner sc = new Scanner(System.in);
//2,创建输出流对象,关联text.txt文件
FileOutputStream fos = new FileOutputStream("text.txt");
System.out.println("请输入数据:");
//3,定义无限循环
while(true) {
String line = sc.nextLine(); //将键盘录入的数据存储在line中
//4,遇到quit退出循环
if("quit".equals(line)) {
break;
}
//5,如果不quit,就将内容写出
fos.write(line.getBytes()); //字符串写出必须转换成字节数组
fos.write("\r\n".getBytes());
}
//6,关闭流
fos.close();
}
}
方式2
public class Demo2 {
public static void main(String[] args)throws Exception {
Scanner sc = new Scanner(System.in);
String line;
FileOutputStream fos = new FileOutputStream("record.txt");
//如果输入的不是quite就将用户输入的信息写入到文本文件里面
while(!(line=sc.nextLine()) .equals("quite")){
fos.write(line.getBytes());
//System.getProperty("line.separator")获取换行符
fos.write(System.getProperty("line.separator").getBytes());
}
fos.close();
}
}
7、今天必须掌握的内容,面试题,笔试题。
1、说说字节流体系
2、说说以下代码怎么念
int data;
while ((data = fis.read()) != -1) {
fos.write(data);
}
3、说说以下段代码怎么念
byte[] data = new byte[1024*8];int len = -1;while((len=bis.read(data)) !=-1){bos.write(data,0,len);}
3、flush和close区别
flush用来刷新缓冲区的,刷新后可以再次写出,即flush后流仍然可以使用close用来关闭流释放资源的的,如果是带缓冲区的流对象的close()方法,不但会关闭流,还会再关闭流之前刷新缓冲区,关闭后不能再写出,即不能再使用该流
4、说说字节流文件拷贝:定义小数组和不定义小数组的原理
5、高效字节流结合小数组拷贝文件的两种标准代码(JDK1.7以前和JDK1.7以后)
6、练习:从控制台录入数据将数据写入到a.txt中,直到输入quite程序停止。当程序下次启动时可以继续向a.txt中追加数据
7、有五个学生,每个学生有3门课(语文、数学、英语)的成绩,写一个程序接收从键盘输入学生的信息,输入格式为:name,30,30,30(姓名,三门课成绩),然后把输入的学生信息按总分从高到低的顺序写入到一个名称"stu.txt"文件中