一、IO
1.概述
流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作
- input:输入
- ouput:输出
2.分类
-
按数据处理类型的不同,分为字节流和字符流
-
按数据流向的不同,分为输入流和输出流。(入和出是相对于内存来讲的)
-
按功能不同,分为节点流和处理流
-
- 节点流:直接操作数据源
- 处理流:对其他流进行处理
3.四大抽象类
3.1.InputStream
3.2.OutputStream
3.3.Reader
3.4.Writer
4.文件流
4.1.FileInputStream
4.1.1.概述
- 以字节的方式进行文件中内容读取操作
- 需要先通过 相对路径 或 绝对路径 找到这个文件
- 概念神级别:只要有路径,不管是压缩包还是文件、文件夹都可以读,与之对应的是FileOutputStream
- 相对路径:相对于当前文件路径去找其他资源
-
- ./ 当前目录,…/ 上级目录 …/…/ 上上级目录
- 在eclipse中 ./定位到当前项目
- ./src/input.txt
- 绝对路径:就是以当前系统更根路径去找其他资源
- E:/eclipse/tlfile/Test01/src/Day20/Test_01.java
4.1.2.常用方法
4.1.3.Read使用
public class IO_01_FileInputStream_01 {
public static void main(String[] args) {
FileInputStream fis = null;
try {
//打开对应文件数据
fis=new FileInputStream("./src/Day19/Test_01.java");
//read:读取文件中一个字节,返回下一个字节对应的ASCLL码值
//到达文件末尾(读完了,没有可读数据)返回-1
System.out.println((char)fis.read());
System.out.println((char)fis.read());
System.out.println((char)fis.read());
System.out.println((char)fis.read());
System.out.println((char)fis.read());
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
//一定要记得关闭资源
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public class IO_02_FileInputStream_02 {
public static void main(String[] args) {
// java7 后可自动关闭资源
try (FileInputStream fis=new FileInputStream("./src/Day19/Test_01.java")){
int temp=0;
//只要 read() 不返回-1就一直循环,返回-1说明已读完
while((temp=fis.read())!=-1){
//如果不用char进行强转,输出的就是ASCLL码值
System.out.println((char)temp);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
4.1.4.Read 重载使用
public class IO_03_FileInputStream_03 {
public static void main(String[] args) {
// java7 后可自动关闭资源
try (FileInputStream fis=new FileInputStream("./src/Day19/Test_01.java")){
//read方法重载,可以传入byte数组,用来提高读取效率,一次读取一个数组
//available():获取可读取的个数
System.out.println("可读取个数:"+fis.available());
//byte[] bytes=new byte[fis.available()];这样就是一次读取全部字节
byte[] bytes=new byte[1024];
int temp=0;
//只要 read() 不返回-1就一直循环,返回-1说明已读完
while((temp=fis.read(bytes))!=-1){
//0就是开始位置,temp就是读取长度,为了防止多读,
//因为数组并没有重新创建,只是新数据覆盖了旧数据
System.out.println(new String(bytes,0,temp));
//new String(bytes)作用:根据已有的字节(字符)数组bytes进行创建String对象
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
4.2.FileReader
4.2.1.概述
- 字符输入流,一般适用于纯文本文件,用来解决读取汉字乱码问题
- 例如压缩包,图片,视频等等,都要使用字节流
- Read():一次读取一个字符,返回赌赢的ASCLL码 到达文件末尾,返回-1
- Read(char[]):一次读取一个char数组,返回本次读取到的个数
4.2.2.使用方式
public class IO_04_FileReader {
public static void main(String[] args) {
// FileReader:字符流,一次读取一个字符
try (FileReader fr=new FileReader("./src/Day19/Test_01.java")){
char[] chars=new char[1024];
int temp=0;
//只要 read() 不返回-1就一直循环,返回-1说明已读完
while((temp=fr.read(chars))!=-1){
System.out.println(new String(chars,0,temp));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
4.3.FileOutputStream
4.3.1.概述
- 字节输出流用于将内存中数据写出在硬盘中
- 如果文件不存在,则会自动创建,但是不会创建目录(文件夹),如果目录不存在,就会报错
- 构造方法 可以传入两个参数 , ( 文件路径 ,写出方式 ) 写出方式:true 表示追加写出 false 表示覆盖写出, 不写则默认是false
- 覆盖写出会在创建输出流对象的时候,会把文件中的内容清空
4.3.2.常用方法
4.3.3.构造方法
//可以传入两个参数 , ( 文件路径 ,写出方式 ) 写出方式:true 表示追加写出 false 表示覆盖写出
FileOutputStream fos=new FileOutputStream("./src/test.txt",false);
//如果只写文件路径则 默认写出方式 为 false
4.3.4.使用方式
public class IO_05_FileOutputStream {
public static void main(String[] args) {
try (
//可以传入两个参数 , ( 文件路径 ,写出方式 ) 写出方式:true 表示追加写出 false 表示覆盖写出
FileOutputStream fos=new FileOutputStream("./src/test.txt",false);
//如果只写文件路径则 默认写出方式 为 false
){
byte[] bytes={99,66,55,33,22,11};
//写出自己数组中所有内容
fos.write(bytes);
//写出数组中特定范围内元素
fos.write(bytes, 0, 2);
//写出int类型
fos.write(97);
//不能直接写出字符串,需要转换为字节数组
bytes="你好".getBytes();//String中的方法,很重要
fos.write(bytes);
//刷缓存
fos.flush();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
4.4.FileWriter
public class IO_06_FileWriter {
public static void main(String[] args) {
try ( //字符输出
FileWriter fw=new FileWriter("./src/test.txt");
){
//写出int型
fw.write(97);
char[] chars={'a','b','和'};
fw.write(chars);
fw.write(chars, 0, 2);
//写出字符串
fw.write("嗨嘿哈");
//写出字符串中特定个数
fw.write("嗨嘿哈", 0, 2);
//刷缓存
fw.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
}
5.缓冲流
特点:
- 主要是为了提高效率而存在的,减少物理读取次数
- 提供readLine()、newLine()这样便捷的方法(针对缓冲字符流)
- 在读取和写入时,会有缓存部分,调用flush为刷新缓存,将内存数据写入到磁盘
5.1.BufferedReader
public class IO_07_BufferedReader {
public static void main(String[] args) {
//节点流的构造方法是传入文件路径
//所有的处理流的构造方法传入的都是节点流对象
//只要处理流关闭,节点流也会关闭
try(
//字节输入,,,,概念神,只要有路径,什么都能输入,和FileOutputStream相对,只要有路径,什么都能输出
FileInputStream fis =new FileInputStream("./src/test.txt");
//字节输入缓冲
BufferedInputStream bis=new BufferedInputStream(fis);
//字符输入
FileReader fr=new FileReader("./src/test.txt");
//字符输入缓冲
BufferedReader br=new BufferedReader(fr);
) {
//读取一行数据 ,返回读到的字符串,到达文件末尾返回null
//readLine()
String temp=null;
while ((temp=br.readLine()) != null) {
System.out.println(temp);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
5.2.BufferedWriter
public class IO_08_BufferedWriter {
public static void main(String[] args) {
try (
//字节输出
FileOutputStream fos=new FileOutputStream("./src/test.txt",true);
//字节输出缓冲流
BufferedOutputStream bos=new BufferedOutputStream(fos);
//字符输出
FileWriter fw =new FileWriter("./src/test.txt",true);
//字符输出缓冲流
BufferedWriter bw=new BufferedWriter(fw);
){
bw.write("你好");
//新的 换行方法
bw.newLine();
bw.write("你也好");
//刷缓存
bw.flush();
} catch (Exception e) {
// TODO: handle exception
}
}
}
6.转换流
public class IO_09_InputStreamReader {
public static void main(String[] args) {
try (
//字节输入流
FileInputStream fis =new FileInputStream("./src/test.txt");
//转换为字符流
InputStreamReader isr=new InputStreamReader(fis);
//字符输入缓冲流
BufferedReader br =new BufferedReader(isr);
){
System.out.println(br.readLine());
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class IO_10_InputStreamReader {
public static void main(String[] args) {
try (
FileInputStream fis=new FileInputStream("./src/a.txt");
//如果编码不一致会出现乱码问题,此时可以通过构造方法解决
//通过记事本保存的时候,选择另存为,设置编码为ANSI(GBK)格式
//由于我们的开发环境是UTF-8,所以读到的是乱码
//要么把eclipse的开发环境修改为GBK,要么把文件的编码改为UTF-8,要么就是创建流对象的之前指定编码
InputStreamReader isr =new InputStreamReader(fis,"GBK");
BufferedReader br=new BufferedReader(isr);
){
System.out.println(br.readLine());
} catch (Exception e) {
// TODO: handle exception
}
}
}
7.打印流
7.1.概述
7.2.使用方式
public class IO_11_PrintStream {
public static void main(String[] args) {
try (
//打印流中提供了很多println方法,可以更加方便的打印各种类型
FileOutputStream fos=new FileOutputStream("./src/test.txt");
PrintStream ps=new PrintStream(fos);
){
ps.println("hahha");
ps.println(true);
ps.println(66.6);
//平常用的打印语句就是这个打印流,只不过System中有三个标准流
//in 是标准输入(控制台)out 是标准输出(控制台) err是错误打印
System.out.println(666);
//可以指定System中的打印流对象,可以让后面的输出语句将内容输出到指定文件而不是控制台
System.setOut(ps);
System.out.println("666666");
System.out.println("哈哈哈");
} catch (Exception e) {
e.printStackTrace();
}
}
}