一、基本概念
(一)概念
流:流动、流向;从源头移动到目的地。
源头和目的地就是指数据源
数据源的存在形式:文件、数组、数据库、网络连接
(二)分类
1、流向:
(1)输入流
(2)输出流
2、数据:
(1)字节流
输入流:InputStream
基本方法 read(byte[] b);read();close()
输出流:OutputStream
基本方法 write();write();close()
(2)字符流
输入流:reader
输出流:writer
3、功能:
(1)节点流
(2)处理流
三、操作
(一)举例
1、关联房子(找到房子)———-》读取文件
2、选择搬家公司 ———-》建立流与文件的联系
3、搬家操作
(1)卡车大小
(2)运输容量(卡车不一定每次都是满载)
4、打发,结束关系 —————》释放资源
二、字节流操作
(一)读取文件
建立联系
选择流
操作
释放资源
// 数据源
File src = new File("G:/eclipsephoton/javaio/test1.txt");
// 选择流
InputStream is = null;
try {
// 建立联系
is = new FileInputStream(src);
// 操作
// 搬家汽车容量
byte[] car = new byte[10];
// 每次运输容量(小于等于汽车容量)
int len = 0;
while ((len = is.read(car)) != -1) {
String str = new String(car, 0, len);
System.out.println(str);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("找不到文件");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
(二)写入文件
1、建立联系
2、选择流
3、操作
4、关闭联系
//确定数据源,目的地
File file = new File("G:/eclipsephoton/javaio/out.txt");
//选择流
OutputStream os = null;
try {
//建立联系
os = new FileOutputStream(file,true);
//操作
String str="hello i am studnet!i am learning java Language\r\n";
byte[] data = str.getBytes();
os.write(data, 0, data.length);
os.flush();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("文件找不到");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("输出失败");
}finally {
if(os!= null)
try {
os.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
(三)拷贝文件
1、建立联系,源头、目的地
2、选择流,输入流、输出流
3、操作
4、释放资源:关闭
三、字符流操作
(一)纯文本文件读取
1、建立联系
2、选择流
3、读取
4、关闭
File src = new File("G:\\eclipsephoton\\javaio\\test1.txt");
Reader reader = null;
try {
reader = new FileReader(src);
char[] flush = new char[10];
int len = 0;
while (-1 != (len = reader.read(flush))) {
String str = new String(flush, 0, len);
System.out.println(str);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("文件找不到");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("文件读取错误");
} finally {
if(reader != null)
try {
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
(二)纯文本文件写入
1、建立联系
2、选择流
3、读取
4、关闭
File file = new File("G:/eclipsephoton/javaio/Testaa.txt");
Writer writer = null;
try {
writer = new FileWriter(file);
String str="“全栈是什么?就是不但要有底层能力,还要有上层平台能力,需要有从芯片到硬件再到软件,再到应用的完整能力,包括对行业的理解能力,这样,才能给客户提供全栈的能力。而不仅仅是自己说具有全栈能力就真的具有全栈能力。”华为EBG中国区IT解决方案销售部部长张英梗在华为云全栈私有云解决方案发布会说道。";
writer.write(str);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(writer != null) {
try {
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
(三)纯文本文件拷贝
File src = new File("G:/eclipsephoton/javaio/test1.txt");
File des = new File("G:/eclipsephoton/javaio/test1adsffasdf.txt");
Reader reader = null;
Writer writer = null;
try {
reader = new FileReader(src);
writer = new FileWriter(des);
int len = 0;
char[] car = new char[1024];
while(-1 != (len = reader.read(car))) {
writer.write(car, 0, len);
}
writer.flush();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("文件找不到");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(writer != null) {
try {
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(reader != null) {
try {
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
三、处理流操作
(一)缓冲流,位于节点流之上
1、字节缓冲流
bufferInputStream
BufferOutputStream
2、字符缓冲流
BufferReader
BufferWriter
四、转换流操作
(一)编码与解码的概念
编码:字符 ————-编码字符集———》二进制
解码:二进制—————解码字符集——–》字符
(二)乱码:
1、编码与解码的字符不统一
/解码 byte-->char
String str = "中国";
// 编码char --->字符
byte[] data = str.getBytes();//使用平台默认字符集。我是utf-8
System.out.println(new String(data));
//设定编码集
data = str.getBytes("gbk");
System.out.println(new String(data));
2、字节缺少
String str = "中国";
byte[] data = str.getBytes();
System.out.println(data.length);
System.out.println(new String (data,0,4));
6
中�
(三)转化流,字节转字符,InputStreamReader
InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
BufferedReader br = new BufferedReader(
new InputStreamReader(
new FileInputStream(new File("G:/eclipsephoton/javaio/test1.txt")),"utf-8")
);
System.out.println(br.readLine());