1.输入输出的概念
* a: 参照物
* 到底是输入还是输出,都是以Java程序为参照
* b: Output
* 把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作
* 程序到文件称为输出
* c: Input
* 把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操作
* 文件到程序称为输入
* d: IO操作
* 把上面的这种输入和输出动作称为IO操作
2.流
(1)流的概念
用来传递数据的对象
(2)流的分类
①数据方向:输入流、输出流
②数据单位:字节流、字符流(文本数据)
字节流 | 字符流 |
所有数据都可以通过字节流来处理 | 字符流处理文本数据 |
以字节为单位 | 以字符为单位 |
③数据功能:节点流、过滤流
节点流 | 过滤流 |
实际负责数据传输 | 为节点流增强功能 |
(3)字节流
来自于:java.io
InputSream/OutputStream | 字节流的父类 | close()/read()/write() |
FileInputStream/FileOutputStream | 文件流 | |
BufferedInputStream/BufferedOutputStream |
缓冲流 | 通过缓冲区,减少IO的次数 提高读写效率 |
PrintStream | 缓冲输出流 | print()/println()/System.out是一个PrintStream对象 |
ObjectInputSream/ObjectOutputStream | 对象序列化 | 只有实现Serializable接口的对象才能序列化 |
package exception.io.thread.alltest;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamTest01 {
public static void main(String[] args) throws IOException{
//利用字节流进行文件的写操作 字节输出流FileOutputStream()
FileOutputStream fos=new FileOutputStream("c:\\m.txt");
//写一个字节
fos.write(97);
//写字符数组
byte[] by={98,35,65,25,45};
fos.write(by);
//写入字符数组的一部分 by数组 1下标开始 3个长度
fos.write(by,1,3);
//写入字符串
fos.write("hello,bigtooth!".getBytes());
//关闭输出流
fos.close();
}
}
package exception.io.thread.alltest;
import java.io.FileOutputStream;
public class FileOutputStreamTest02 {
public static void main(String[] args) throws Exception{
//续写文件
FileOutputStream fos=new FileOutputStream("c:\\m.txt",true);
fos.write("China basketball".getBytes());
//换行号 \r\n
fos.write("winner\r\n".getBytes());
fos.close();
}
}
(4)处理异常的“语法糖”
//语法糖
try(创建资源对象的代码 资源对象:实现了AutoClosable接口的对象){}
catch(异常 e){}
最终资源对象会被自动关闭(Since 1.70)
(5)IO编程基本步骤:
①创建节点流 选择数据源;
②封装过滤流 选择流的功能;
③读/写数据 read/write;
④关闭流 对最外层的流close()。
(6)对象序列化:
1.只有实现Serializable接口的对象才能序列化;
2.对象的属性包括集合中的元素,均需要实现Serilizable接口;
3.利用transient修饰属性为临时属性,不参与序列化。
(7)字符流
Reader/Writer | 字符流父类 | |
OutputStreamWriter/InputStreamReader | 桥转换 | 字节流包装为字符流 |
BufferedReader/BufferedWriter | 缓冲流 | |
PrintWriter | 缓冲输出流 | |
在桥转换过程中可以指定编码方式 |
具体案例:
package exception.io.thread.alltest;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
public class InputStreamReaderTest01 {
public static void main(String[] args) throws IOException {
FileInputStream fis=new FileInputStream("c:\\m.txt");
//字符流转换流
InputStreamReader isr=new InputStreamReader(fis);
char[] ch=new char[1024];
int len=isr.read();
System.out.println(new String(ch,0,len));
isr.close();
//OutputStreamWriter和InputStreamReader是字节流和字符流的桥梁
//字符转换流
}
}
package exception.io.thread.alltest;
import java.io.FileWriter;
public class FileWriterTest01 {
public static void main(String[] args) throws Exception {
//文本输出流FileWriter
FileWriter fw=new FileWriter("c:\\g.txt");
//写一个字符
fw.write(100);
fw.flush();
//写一个字符数组
char[] ch={'a','a','w','e','r'};
fw.write(ch);
fw.flush();
//写入字符串
fw.write("\r\nhelloworld!");
fw.flush();
fw.close();
}
}
(8)File类
来自于java.io.File 用于文件的操作
File对象代表了磁盘上的一个文件或是目录
File file = new File("c:\\a.txt");
常用方法 | 作用 |
createNewFile() | 创建新文件 |
mkdir() | 创建新目录 |
delete() | 删除文件或空目录 |
exists() | 判断file对象代表的文件是否存在 |
getAbsolutePath() | 获得绝对路径 |
isDirectory()/isFile() | 判断File对象代表的是不是目录/文件 【返回值:boolean】 |
renameTo(File dest) | 改名字 最终由dest指向改名后的文件 |
listFiles() | 返回file数组,列出目录中内容(包括文件、目录) |
listFiles(File Filter) | 通过过滤器筛选过滤器中的内容 |
具体功能实例:
package exception.io.thread.alltest;
import java.io.File;
import java.io.IOException;
public class FileTest02 {
public static void main(String[] args) throws IOException {
function();
function_1();
function_2();
function_3();
function_4();
function_5();
}
//将路径封装成File类的对象
public static void function(){
File file = new File("d:\\eclipse");
System.out.println(file);
}
//File创建文件的功能 boolean 类型返回值createNewFile()方法
public static void function_1() throws IOException{
File file = new File("c:\\m.txt");
boolean b = file.createNewFile();
System.out.println(b);
}
//File类创建目录的功能 mkdir() mkdirs()
public static void function_2(){
File file = new File("c:\\m.txt");
//创建文件夹 如果存在文件夹就不再进行创建
boolean b=file.mkdir();
//创建文件夹 如果父文件夹不存在就帮你创建出来 创建多层文件夹
boolean c=file.mkdirs();
System.out.println(b+"\t"+c);
}
//File类的删除功能 delete() 返回值类型boolean 直接从硬盘删除 不走回收站
public static void function_3(){
File file = new File("c:\\a.txt");
boolean a=file.delete();
System.out.println(a);
}
public static void function_4(){
//获取绝对路径 返回String对象 getAbsolutePath(
File file=new File("a.txt");
String abosolute=file.getAbsolutePath();
System.out.println(abosolute);
//获得绝对路径 返回File对象 getAbsoluteFile()
File file01 = new File("b.txt");
File file02=file01.getAbsoluteFile();
System.out.println(file02);
//获得路径中文件的字节数 length()
long length=file02.length();
System.out.println(length);
//获得文件名或文件夹名 getName() 返回值String类型
String name=file02.getName();
System.out.println(name);
}
//File类的判断功能
public static void function_5(){
File file = new File("c:\\m.txt");
//判断是不是文件
boolean a=file.isFile();
System.out.println(a);
//判断是不是文件夹
boolean b=file.isDirectory();
System.out.println(b);
//判断是否存在
boolean c=file.exists();
System.out.println(c);
}
}
(9)对象的克隆
1.需要克隆的类必须实现Cloneable接口(标记接口,没有方法需要实现);
2.需要克隆的类必须主动覆盖clone()方法(把访问修饰符提高到public);
3.调用clone方法,完成对象的赋值。
深拷贝和浅拷贝比较:
浅拷贝:对象中的每个属性,做简单的复制,属性对象并未复制本身,而是复制地址
深拷贝:对象中的每个属性,都会做彻底复制