IO流的本质:本地设备和不同设备之间数据的传输
IO流的分类:
按照数据类型分类
字节流:一般针对二进制文件【视频,音频,图片】
字符流:一般针对文本文件【hml,json,html,txt,md...】
按照流向分类
输入流:从外界到内存
输出流:从内存到外界
综合分类
字节流
字节输出流 xxxInputStream
字节输出流 xxxOutputStream
字符流
字符输入流 xxxReader
流的操作的三要素:(*********)
1.数据源:数据需要从哪里到内存?
2.目的地:数据从内存到哪里去?
3.交通工具:
a.弄明白到底需要输入流还是输出流。也有可能两个都需要
b.根据确定的流向在IO流框架中选取自己认为最适合的流
public class IOStream {
public static void main(String[] args) {
}
public static void copy(String srcFileName, String descFileName) {
try (FileInputStream fis = new FileInputStream(srcFileName);
FileOutputStream fos = new FileOutputStream(descFileName);){
int by = 0;
while ((by = fis.read()) != -1) {
fos.write(by);
fos.flush();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
}
public static void copy1(String srcFileName, String descFileName) {
try (FileInputStream fis = new FileInputStream(srcFileName);
FileOutputStream fos = new FileOutputStream(descFileName);){
byte[] bys = new byte[1024];
int len = 0;
while ((len = fis.read(bys)) != -1) {
fos.write(bys, 0, len);
fos.flush();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
}
public static void copy2(String srcFileName, String descFileName) {
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFileName));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(descFileName));) {
byte[] bys = new byte[1024];
int len = 0;
while ((len = bis.read(bys)) != -1) {
bos.write(bys, 0, len);
bos.flush();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
输入流
需求:将文本文件的数据读取出来显示在控制台
InputStream
FileInputStream
FileInputStream的构造方法:
1.FileInputStream(File file)创建一个从file读取数据的输入流
2.FilInputStream(String name)创建一个从name文件读取数据的输入流
FileInputStream的成员方法
1.int read(); 一次读取一个字节
a.一次性读取一个字节
b.每读取一个字节,指针会移动到下一个需要读取的内容前
c.读到文件末尾返回整数-1
d.返回的是实际读取的内容
2.int read(byte[] b);一次读取一个字节数组
a.一次性读取一个字节数组
b.每读取一个字节数组,指针都会移动到下一个字节数组的长度位置
c.返回的是每次实际读取的长度
3.int read(byte[] b, int off, int len); 一次读取一个字节数组的一部分
4.void close(); 关闭此文件输入流并释放与此流有关的所有系统资源
注意:
1.作为输出流,文件可以不存在,会自动创建,作为输入流,文件必须存在
2.处理中文的时候不方便
编码:字符/字符数组/字符串–>二进制
解码:二进制- - > 字符/字符数组/字符串
编码表:将字符转换成对应数字的一张对照表
编码的处理:
1.字符
2.字符串
getBytes(“GBK”);
String(by, “GBK”);
3.文本文件
OutputStreamwriter (转换流,是字符流通向字节流的桥梁,可 使用指定的charset将要写入流中的字符编码成字节
1.能够将字符流转换成字符流
2.能够处理编码解码问题
构造方法:
OutputStreamwriter(OutputStream out)创建使用默认字符编码的字符集输出转换流
OutputStreamwriter(OutputStream out, Charset cs)创建使用cs字符集的字符输出转换流
OutputStreamwriter(OutputStream out, charsetEncider enc)创建使用enc字符集编码器的转换流
OutputStreamwriter(OutputStream out, String charsetName)创建使用指定字符集的转换流
public class CharsetDemo {
public static void main(String[] args) throws UnsupportedEncodingException, Exception {
// 字符
char ch = 'a';
System.out.println((int)ch);
System.out.println((char)97);
// 字符串编码
String s = "Hello中国";
byte[] by = s.getBytes("GBK");
System.out.println(Arrays.toString(by));
// 字符串解码
String str = new String(by, "GBK");
System.out.println(str);
// 常用的编码表: UTF-8 GBK Unicode Ascii ISO-8859-1
Writer w = new OutputStreamWriter(new FileOutputStream("osw.txt"));
w.append('a');
w.flush();
w.append("hello");
w.flush();
w.write("玉珍");
w.flush();
char[] chs = {'o', 'p', 'q'};
w.write(chs);
w.close();
}
}