I/O流
"i" 就是指input,输入的意思。
"o" 就是指output,输出的意思。
在内存的角度定义:
输入:从硬盘到内存。
输出:从内存到硬盘。
传输的介质分为两种,一种是字节流,一种是字符流。
字节流(Byte),顾名思义,每传输一次就只是传输一个字节。
字节流有一个缺点。
字符:1个英文=1个byte 1个中文=2个byte,
那么一个中文用字节传输就会将其强行拆开,那么就会出现乱码,
虽然到TXT格式的文本里面有会重新组合出来,但总也不太好的。
文件字节输入输出:FileInputStream、FileOutputStream
文件的复制粘贴:
//构建文件输入流对象
FileInputStream fis = new FileInputStream(srcFileName);
//构建文件输出流对象
FileOutputStream fos = new FileOutputStream(destFileName);
//读取文件
int data = fis.read();
while(data!=-1){
//写入到输出流中
fos.write(data);
data = fis.read();//递归继续读取
}
System.out.println("文件复制粘贴成功!。。。。");
//关闭流
fis.close();
fos.close();
//构建文件输入流对象
FileInputStream fis = new FileInputStream(srcFileName);
//构建文件输出流对象
FileOutputStream fos = new FileOutputStream(destFileName);
//读取文件
int data = fis.read();
while(data!=-1){
//写入到输出流中
fos.write(data);
data = fis.read();//递归继续读取
}
System.out.println("文件复制粘贴成功!。。。。");
//关闭流
fis.close();
fos.close();
字符流(Cher),
字符流就没有字节流的缺点。
每一个英文字母和中文子都为一个字符,那么传输的时候就不会出现乱码。
虽然两者有差异,但在实际使用的时候也要选择适合的来使用。
还有要记得在使用完流以后记得关掉流(close)。
在使用流的时候还有节点流和处理流,处理流又叫包装流。
IO流,相当于在两个文件中间插上一条水管。
处理流就是说把水管包装的大些,让水流跟大。
两个水管的接口就是节点流,而中间的管子就是处理流。
输入:
节点流:
// 创建一个字节文件输入流
FileInputStream fis = new FileInputStream("sdn");
输入的处理流(包装流):
// 包装:将字节的文件输入流包装成字符流
InputStreamReader isr = new InputStreamReader(fis);
// 包装:将字符流包装成缓冲流
BufferedReader br = new BufferedReader(isr);
输出:
// 输出流包装
FileOutputStream fos = new FileOutputStream("ssddnn");
输出的处理流(包装流):
OutputStreamWriter osw = new OutputStreamWriter(fos);
BufferedWriter bw = new BufferedWriter(osw);
OutputStreamWriter osw = new OutputStreamWriter(fos);
BufferedWriter bw = new BufferedWriter(osw);
循环输入输出,实现复制粘贴。
String line = br.readLine();
while (line != null) {
// System.out.println(line);
bw.write(line);
bw.newLine();
line = br.readLine();
}
关闭输出、输入流:
br.close();
isr.close();
fis.close();
bw.close();
osw.close();
fos.close();
创建一个字节流数组来保存一次读取的字节,然后一次性写出。
//创建一个字节流
//创建一个字节流
InputStream ins = new FileInputStream("test.txt");
InputStream ins = new FileInputStream("test.txt");
// 创建字节数组
byte[] bytes = new byte[512];
int v = ins.read(bytes);
while (v != -1) {
// 把数组内容转化为字符串
String str = new String(bytes, 0, v);
System.out.println(str);
v = ins.read(bytes);
}
用数组的也有缺点。
创建一个长度为512的数组,那么如果一个中文字是由第512个字节个第513个字节组合起来的,那么程序也会强行拆开,出现乱码。
那么就可以用到字符数组
FileWriter fw = new FileWriter("test11.txt");
String str = "中华人民共和国";
// 把字符串转化为字符数组
char[] chars = str.toCharArray();
fw.write(chars);
fw.flush();
fw.close();
FileWriter fw = new FileWriter("test11.txt");
String str = "中华人民共和国";
// 把字符串转化为字符数组
char[] chars = str.toCharArray();
fw.write(chars);
fw.flush();
fw.close();
br.close();
isr.close();
fis.close();
bw.close();
osw.close();
fos.close();