IO流
文件
文件流
文件在程序中是以流的形式来操作的,从文件读取到内存称为输入流、从内存输出到文件称为输出流
常用操作
1 2 3 4 5
| new File(String pathname); file.createNewFile();
new File(File parent, String pathname);
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
System.out.println("文件名字=" + file.getName()); System.out.println("文件绝对路径=" + file.getAbsolutePath()); System.out.println("文件父级目录=" + file.getParent()); System.out.println("文件大小(字节)=" + file.length()); System.out.println("文件是否存在=" + file.exists()); System.out.println("是不是一个文件=" + file.isFile()); System.out.println("是不是一个目录=" + file.isDirectory());
file.mkdirs();
file.mkdir();
|
IO流原理及流的分类
I/O流用于数据处理、读写文件。数据的输入输出以流的方式进行。
按照数据操作单位可以分为字节流、字符流,按照数据的流向可以分为输入流、输出流,按照处理对象可以分为节点流和处理流。
输入流
- FileInputStream文件输入流:从文件读取数据。
1 2 3 4 5 6 7 8 9 10 11
| FileInputStream f = new FileInputStream("C:/java/hello");
File f = new File("C:/java/hello"); FileInputStream in = new FileInputStream(f);
readData = in.read();
readLength = in.read(byte[] buff);
in.close();
|
- BufferedInputStream缓冲字节输入流
- ObjectInputStream对象字节输入流
Reader
1 2 3 4 5 6
| FileReader f = new FileReader(File/String);
f.read();
f.read(char[]);
|
输出流
OutputStream
- FileOutputStream:创建文件,并向文件中写入数据。
1 2 3 4 5 6 7 8 9 10 11 12
| FileOutputStream f = new FileOutputStream("C:/java/hello");
File f = new File("C:/java/hello"); FileOutputStream fOut = new FileOutputStream(f);
fOut.write(char w);
String str = "hello,world"; fOut.write(int str.getBytes());
fOut.write(byte[] w);
|
- ByteArrayOutputStream
- DataOutputStream
Writer
1 2 3 4 5 6
| FileWriter f = new FileWriter(File/String);
f.write();
f.close();
|
文件拷贝
1 2 3 4 5 6 7 8 9 10
|
String src = "e:\\koala.jpg"; String dest = "e:\\koalacopy.jpg"; FileInputStream In = new FileInputStream(src); FileOutputStream Out = new FileOutputStream(dest);
while((readLen = In.read(buf)) != -1){ Out.write(buf); }
|
节点流和处理流
节点流:可以从一个特定的数据源(存放数据的地方)读写数据。 可以对文件、数组、管道、字符串进行操作,和 数据源直接相关。
处理流:对节点流进行包装,使用了修饰器设计模式,为程序提供更强大的读写功能。
处理字符流
属于字符流,按照字符来读取数据。
1 2 3 4 5 6 7 8 9
| BufferedReader br = new BufferedReader(new FileReader("E:\\text.txt"));
String line; while ((line = br.readLine()) != null){ System.out.println(line); }
br.close();
|
1 2 3 4 5 6 7 8 9 10 11
| BufferedWriter br = new BufferedWriter(new FileWriter("E:\\write.txt"));
br.write("HELLO 韩顺平");
br.newLine(); br.write("HELLO 韩顺平");
br.close();
|
surround with快捷键:Ctrl+alt+T
处理字节流
BufferedInputStream
- BufferedOutputStream
字节流拷贝
对象处理流
希望在保存数据的同时,保存数据的类型。需要对基本数据类型或对象进行序列化和反序列化,实现Serializable(推荐)、Externalizable接口之一。
1 2 3 4 5 6
| ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath))
oos.write();
oos.close();
|
1 2 3 4 5 6 7
| ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath));
System.out.println(ois.readInt()); System.out.println(ois.readBoolean());
ois.close();
|
注意事项:
- 读写顺序一致
- 实现序列化或反序列化的对象需要实现接口
- 序列化的类中建议添加,SerialVersionUID,以提高版本兼容性
- 序列化时,默认将所有属性都序列化,除了static、transient修饰的成员
- 序列化时,属性的类型也需要实现序列化接口
- 序列化具有可继承性:如果某类实现了序列化,则其子类也默认实现序列化
标准输入输出流
标准输入:System.in
标准输出:System.out
转换流:将字节流包装成字符流
处理纯文本数据时,使用字符流效率更高,并且可以有效的解决中文问题。
乱码问题:没有指定编码方式
1 2 3 4 5 6 7 8
| InputSteamReader isr = new InputStreamReader(new FileInputStream(filePath),'gbk');
BufferedReader br = new BufferedReader(isr);
String s = br.readLine();
br.close();
|
1
| System.out.println(next);
|
打印流:只有输出流,没有输入流
1 2 3 4 5 6 7 8
| PrintStream out = System.out;
out.print(string);
System.setOut(new PrintStream(path));
out.close();
|
1
| System.out.println(next);
|
Properties类
是专门用于读写配置文件的集合类
配置文件格式:键=值
1 2 3 4 5 6 7 8
| Properties properties = new Properties();
properties.load(new FileReader(file));
properties.list(System.out);
String user = properties.getProperty("user");
|
1 2 3 4
| Properties properties = new Properties();
properties.setProperty("charset", "utf8");
|