IO流概述
IO:输入/输出(Input/Output)
流:流是一种抽象概念,是对数据传输的总称.即数据在设备间的传输称为流,流的本质是数据传输
流是一种抽象概念,它代表了数据的无结构化传递。按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插入操作。用来进行输入输出操作的流就称为IO流。换句话说,IO流就是以流的方式进行输入输出 。
IO流是用来处理设备间数据传输问题的
IO流分类
按照数据的流向:
输入流:读数据
输出流:写数据
按照数据类型:
字节流:字节输入流,字节输出流
字符流:字符输入流,字符输出流
一般来说,IO流的分类是按照数据类型来分的
字节流
字节流读数据:
int read() :一次读取一个字节
int read( byte[ ] bys) :一次读取一个字节数组
字节流写数据:
void write( int by) :一次写一个字节
void write( byte[ ] bys) :一次写一个字节数组
void write( byte[ ] bys,int index,int len) :一次写一个字节数组的一部分
释放资源:
void close( ) :关闭流
小结:字节流可以复制任意文件数据,有4种方式,一般采用字节缓冲流一次读写一个字节数组的方式
//方法1
FileInputStream fis = new FileInputStream("文件路径名");
FileOutputStream fos = new FileOutputStream("文件路径名");
int ch;
while((ch = fis.read()) != -1) {
fos.write(ch);
}
fis.close();
fos.close();
//方法2
FileInputStream fis = new FileInputStream("文件路径名");
FileOutputStream fos = new FileOutputStream("文件路径名");
byte[] bys = new byte[1024];
int len;
while((len = fis.read(bys)) != -1) {
fos.write(bys, 0, len);
}
fis.close();
fos.close();
//方法3
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("文件路径名"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("文件路径名"));
int ch;
while((ch = bis.read()) != -1) {
bos.write(ch);
}
bis.close();
bos.close();
//方法4
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("文件路径名"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("文件路径名"));
byte[] bys = new byte[1024];
int len;
while((len = bis.read(bys)) != -1) {
bos.write(bys, 0, len);
}
bis.close();
bos.close();
字符流
字符流读数据:
int read() :一次读取一个字符
int read( char[ ] chs) :一次读取一个字符数组
String readLine( ) :一次读取一行,不包含任何终止字符(字符缓冲流特有)
字符流写数据:
void write( int ch) :一次写一个字符
void write( char[ ] chs) :一次写一个字符数组
void write( char[ ] chs,int index,int len) :一次写一个字符数组的一部分
void flush( ) :刷新流,刷新流后,数据才会写入
void newLine( ) :写一个换行符(字符缓冲流特有)
void write( String line) :一次写一个字符串(字符缓冲流特有)
释放资源:
void close( ) :关闭流,关闭时先刷新流,再关闭流
注:flush刷新缓冲后可以继续写入数据,close刷新缓冲后关闭流,不能再写入数据
小结:字符流只能复制文本文件,有5种方式,一般采用字符缓冲流的特有功能
//字符缓冲流写入数据
BufferedWriter bw = new BufferedWriter(new FileWriter("文件路径名"));
for(int i = 0;i<5;i++) {
bw.write("hello"+i);
bw.newLine();
bw.flush();
}
bw.close();
//字符缓冲流读取数据
BufferedReader br = new BufferedReader(new FileReader("文件路径名"));
String line;
while((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
递归
程序调用自身的编程技巧称为递归,一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
递归遍历目录示例:
public static void main(String[] args) {
File f = new File("Z:\\Learn\\Learn2");
getFilesPath(f);
}
public static void getFilesPath(File file) {//遍历目录得到所有文件的绝对路径
File[] files = file.listFiles();
if (files != null) {
for (File f : files) {
if (f.isDirectory()) {
getFilesPath(f);
} else {
System.out.println(f.getAbsolutePath());
}
}
}
}
字符串编码解码
String str = "中国";
//平台默认字符集编码
byte[] bys = str.getBytes();//[-28, -72, -83, -27, -101, -67]
//UTF-8编码
// byte[] bys = str.getBytes("UTF-8");//[-28, -72, -83, -27, -101, -67]
//GBK编码
// byte[] bys = str.getBytes("GBK");//[-42, -48, -71, -6]
System.out.println(Arrays.toString(bys));//输出字符串编码后生成的字节数组数据
//平台默认解码
String s = new String(bys);
//指定字符集解码
// String s = new String(bys,"UTF-8");
// String s = new String(bys,"GBK");
System.out.println(s);//输出解码后的字符串
注:字符流为简化使用FileReader和FileWriter,但若涉及到编码解码问题,还需使用InputStreamReader和OutputStreamWriter