------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ---
IO核心思想:
1,
源:键盘录入。
目的:控制台
2,需求:想把键盘录入的数据存储到一个文件中。
源:键盘
目的:文件。
3,需求:想要将一个文件的数据打印到控制台上。
源:文件。
目的:控制台。
流操作的基本规律:
最疼苦的就是流对象有很多,不知道该有哪一个。
通过三个明确来完成。
1.明确源和目的。
源:输入流: InputStream Reader
目的:输出流 OutputStream Writer
2.操作的数据是否是纯文本。
是:字符流。
不是:字节流。
3,当体系明确后,在明确要使用哪个具体的对象。
通过设备来进行区分:
源设备:内存,硬盘,键盘。
目的设备:内存,硬盘,控制台。
需求:
1,将一个文件中文本文件的存储到另外一个文件中。复制文件
源:因为是源,所以使用读取流。InputStream Reader
是不是操作文本文件。
是! 这时就可以选择Reader
这样体系就明确了。
接下来明确要使用该体系中的那个对象。
明确设备:硬盘上的一个文件。
Reader体系中可以操作文件的对象是 FileReader
FileReader fr = new FileReader("a.txt");
是否需要提高效率:
是:加入Reader体系中的缓冲区BufferedReader。
BufferedReader bufr = new BufferedReader(new FileReader("a.txt");
目的:因为是目的,所以使用读取流。OutputStream Writer
目的是否是纯文本。
是! Writer
设备:硬盘上的一个文件。
Writer体系总可以操作文件的对象就是 FileWriter
FileWriter fw = new FileWriter("b.txt");
是:加入Reader体系中的缓冲区BufferedWriter。
BufferedWriter bufw = new BufferedWriter(new FileWriter("a.txt");
——————————————————————————————————————————————————————————
2,需求:将键盘录入的数据保存到一个文件中。
这个需求中有源和目的都存在.
那么分别分析
源:InputStream Reader
是不是纯文本?
是!Reader
设备:键盘。 对应对象是 System.in.
不是选择Reader吗? System.in对应的不是字节流吗?
为了操作键盘的文本数据方便。转成字符流按照字符串操作是最方便。
既然明确了Reader,那么就将System.in转换成字符流(Reader)
用到了Reader体系中的转换流。InputStreamReader
InputStreamReader isr = new InputStreamReader(System.in);
需要提高效率么? 需要!BufferedReader
BufferedReader bufr = new BufferedReader(isr);
目的: OutputSteam Writer
是否是纯文本 是Writer
设备: 硬盘上的一个文件。使用 FileWriter;
FeileWriter fw = FeileWriter("c.txt");
需要提高效率么? 需要! BufferedWriter
BufferedWriter bufw= new BufferedWriter(fw);
————————————————————————————————————————————————————————————————
扩展一下,想要把录入的数据按照指定的编码表(UTF-8),将数据存到文件中。系统的是默认的是(GBK(系统默认的平台))
目的: OutputSteam Writer
是否是纯文本 是Writer
设备: 硬盘上的一个文件。使用 FileWriter;
但是FileWriter 是使用的默认编码表,GBK
但是存储时,需要加入指定的编码表,二指定的编码表只有转换流可以指定。
所以要使用的对象是OutputStreamWriter
二该转换流对象要接收一个字节输出流,而且还可以操作文件的的字节输出流。FileOutPutStream
OutputStreamWriter osw = new OutputStreamWriter(new FeilOutputStream("d,txt"),"UTf-8")
需要高效么 ? 需要
BufferedWriter bufw = new BufferedWriter(osw);
所以,记住,转换流什么时候使用呢,字符和字节之间的桥梁,通常涉及到字符编码转换时,
需要用到转换流。
package com.itheimaday19;
import java.io.FileWriter;
import java.io.IOException;
/*
字符流和字节类:
字节流的两个基类:
InputStream OutputStream
字符流的两个基类
Reader Writer
先学习字符流的特点。
既然IO流是用于操作数据的。
那么数据的常见体现形式是:文件。
那么先以操作文件为主来演示。
需求:
在硬盘上。创建一个文件并写入一些文件数据。
找到一个专门用于操作文件的Writer子类对象。FileWriter. 后缀名是父类名,前缀名是该流对象的功能。
*/
public class FileWriter_01 {
public static void main(String[] args) throws IOException {
//创建一个FileWriter对象。该对象一被初始化就必须要明确要操作的文件。
//而且该文件会被创建到指定目录下。如果该目录下已有同名文件,将被覆盖
//其实就是在明确数据要存储的目的地。
FileWriter fileWriter = new FileWriter("F:/demo.txt");
//调用write方法,将字符串写入到流中
// fileWriter.write("hahah");
//将数据刷到目的地中
// fileWriter.flush();
fileWriter.write("黑马程序员");
// fileWriter.flush();
fileWriter.close();//关闭流资源。但是关闭之前会刷新一次内部的缓冲区中的数据。
// 将数据刷新的目的地中。 filewriter.close();
/*
flush和close区别:
flush 刷新后,流可以继续使用。
close 刷新后,会关闭流资源不能继续使用。
*/
// 总结:java在调用windows系统的资源。所以必须关闭流资源。
}
}
package com.itheimaday19;
import java.io.FileInputStream;
import java.io.FileOutputStream;
/*
演示MP3的复制:
思路:媒体文件通过字节操作
1,创建一个目录流文件存储复制的文件
2,创建一个与之相关联的流文件
3,读取文件
4,关闭文件
*/
public class CopyMP3 {
public static void main(String[] args) {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream(
"C:\\Users\\ZY\\Desktop\\You're Beautiful.mp3");
fos = new FileOutputStream("f:/泰勒.mp3");
byte[] buf = new byte[1024 * 10];
int line = 0;
while ((line = fis.read(buf)) != -1) {
fos.write(buf, 0, line);
}
} catch (Exception e) {
throw new RuntimeException("读写失败");
}
finally {
try {
if (fis != null) {
fis.close();
}
} catch (Exception e2) {
throw new RuntimeException("读取失败");
}
try {
if (fos != null) {
fos.close();
}
} catch (Exception e2) {
throw new RuntimeException("存储失败");
}
}
}
}
package com.itheima;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/*
编写程序,将指定目录下所有.java文件拷贝到另一个目的中,并将扩展名改为.txt
*/
/*
思路:
1,对指定目录进行递归
2,获取递归过程中所有的java文件中的路径。
3.将这些路径存储到缓冲区中(集合中)
4,将集合中的数据写入到一个文件中。
*/
public class Test_9 {
public static void main(String[] args) {
//创建与之关联的文件
File dir = new File("e:\\myeclipse\\BLSithimaTwo");
//创建一个集合
List<File> list = new ArrayList<File>();
fileToList(dir, list);
// System.out.println(list.size());//打印控制台测试下有多少个.
writeToFile(list);
}
//将集合中的数据写入到一个文件中的方法。
public static void writeToFile(List<File> list) {
//明确目的文件(是一个文本需要提高效率)
BufferedWriter bufw = null;
try {
bufw = new BufferedWriter(new FileWriter("F:/JAVA.TXT"));
//高级for循环遍历list集合 获取绝对路径 并异常处理!
for (File f : list) {
String path = f.getAbsolutePath();
bufw.write(path);
bufw.newLine();//换行
bufw.flush();//刷新
}
} catch (IOException e) {
throw new RuntimeException("文件存储失败");
}
//关闭流资源并异常处理!
finally {
try {
if (bufw != null) {
bufw.close();
}
} catch (Exception e2) {
throw new RuntimeException("关闭失败");
}
}
}
//将文件存储到集合中的方法用递归!明确参数(目录和集合)
public static void fileToList(File dir, List<File> list) {
File[] files = dir.listFiles();
//高级for循环遍历 使用递归
for (File file : files) {
//判断目录是否存在
if (file.isDirectory()) {
fileToList(file, list);
} else {
//判断目录下的扩展名是否为java文件,是就存储到集合中去
if (file.getName().endsWith(".java")) {
list.add(file);
}
}
}
}
}