JAVA I/O框架(二)
文章目录
五. 字符流
字符流的父类(抽象类)
Reader:字符输入流
- public int read(){ }
- public int read(char[] c){ }
- public int read(char[] b, int off, int len ){ }
Writer:字符输出流
- public void write(int n){ }
- public void write(String str){ }
- public void write(char[] c){ }
1. 文件字符流
FileReader:
- public int read(char[ ] c)
从流中读取多个字符,将读到内容存入c数组,返回实际读到的字符数;如果达到文件的尾部,则返回-1
FileWriter:
- public void write(String str)
一次写多个字符,将b数组中所有字符,写入输出流
实例:
//文件字符输入流
import java.io.FileReader;
public class Demo02 {
public static void main(String[] args) throws Exception{
//创建文件字符输入流
FileReader fr = new FileReader("D:\\a.txt");
//读取 单个字符读取
// int data=0;
// while ((data=fr.read())!=-1){
// System.out.print((char)data);
// }
//自定义缓冲区
char[] str=new char[1024];
int count=0;
while ((count=fr.read(str))!=-1){
System.out.println(new String(str,0,count));
}
//关闭
fr.close();
}
}
---------------结果---------------
好好学习
//文件字符输出流
import java.io.FileWriter;
public class Demo03 {
public static void main(String[] args) throws Exception{
//创建文件字符输出流
FileWriter fw = new FileWriter("D://a.txt");
//写入
for (int i = 0; i < 10; i++) {
fw.write("Java是最好的语言\r\n");
}
//关闭
fw.close();
System.out.println("程序结束!");
}
}
---------------结果---------------
程序结束!
-------------文件内容-------------
Java是最好的语言
Java是最好的语言
Java是最好的语言
Java是最好的语言
Java是最好的语言
用字符流复制文件
import java.io.FileReader;
import java.io.FileWriter;
public class Demo04 {
public static void main(String[] args) throws Exception{
//创建文件字符输入输出流
FileReader fr = new FileReader("D://a.txt");
FileWriter fw = new FileWriter("D://b.txt");
//读写
int data=0;
while ((data=fr.read())!=-1){
fw.write((char)data);
}
//关闭
fr.close();
fw.close();
System.out.println("执行结束!");
}
}
---------------结果---------------
执行结束!
-------------文件内容-------------
Java是最好的语言
Java是最好的语言
Java是最好的语言
Java是最好的语言
Java是最好的语言
注意:
- 用文件字符流复制文件,不能复制图片或其他二进制文件
- 使用字节流可以复制任意文件。
2. 字符缓冲流
缓冲流: BufferedReader/ BufferedWriter
- 高效读写
- 支持输入换行符。
- 可一次写一行、读一行。
实例:
//使用字符缓冲流来读取文件
import java.io.BufferedReader;
import java.io.FileReader;
public class Demo05 {
public static void main(String[] args) throws Exception{
//创建字符缓冲流
FileReader fr = new FileReader("D://a.txt");
BufferedReader br = new BufferedReader(fr);
//读取 第一种方式
// int data=0;
// while ((data=br.read())!=-1){
// System.out.print((char) data);
// }
//读取 第二种方式
// int count=0;
// char[] chr = new char[1024];
// while ((count=br.read(chr))!=-1){
// System.out.print(new String(chr,0,count));
// }
//读取 第三种方式
String line=null;
while ((line=br.readLine())!=null){
System.out.println(line);
}
//关闭
br.close();
System.out.println("执行结束");
}
}
---------------结果---------------
Java是最好的语言
Java是最好的语言
Java是最好的语言
Java是最好的语言
Java是最好的语言
执行结束
实例:
//演示字符缓冲输出流
import java.io.BufferedWriter;
import java.io.FileWriter;
public class Demo06 {
public static void main(String[] args) throws Exception{
//创建字符缓冲输出流
FileWriter fw = new FileWriter("D://b.txt");
BufferedWriter bw = new BufferedWriter(fw);
//输出
for (int i = 0; i < 5; i++) {
bw.write("Hello World!");
bw.newLine();//写入一个换行符
bw.flush();
}
//关闭
fw.close();
System.out.println("执行结束");
}
}
---------------结果---------------
执行结束
-------------文件内容-------------
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
3. 打印流
PrintWriter
封装了 print()/ println方法,支持写入后换行
支持数据原样打印
//演示PrintWriter的使用
import java.io.PrintWriter;
public class Demo07 {
public static void main(String[] args) throws Exception{
//创建打印流
PrintWriter pw = new PrintWriter("D://a.txt");
//打印
pw.println(97);
pw.println(true);
pw.println(3.14);
pw.println('a');
//关闭
pw.close();
System.out.println("执行结束");
}
}
---------------结果---------------
执行结束
-------------文件内容-------------
97
true
3.14
a
4. 转换流
桥转换流: InputStreamReader/ OutputStreamWriter
可将字节流转换为字符流
可设置字符的编码方式。
实例:
//使用InputStreamReader读取文件,指定使用编码
import java.io.FileInputStream;
import java.io.InputStreamReader;
public class Demo08 {
public static void main(String[] args) throws Exception{
//创建转换流
FileInputStream fis = new FileInputStream("D://a.txt");
InputStreamReader isr = new InputStreamReader(fis,"gbk");
//读取文件
int data=0;
while ((data=isr.read())!=-1){
System.out.print((char) data);
}
//关闭
isr.close();
}
}
---------------结果---------------
Java是最好的语言
Java是最好的语言
Java是最好的语言
Java是最好的语言
Java是最好的语言
//使用OutputStreamWriter写入文件,使用指定的编码
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
public class Demo09 {
public static void main(String[] args) throws Exception{
//创建OutputStreamWriter
FileOutputStream fos = new FileOutputStream("D://b.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos,"gbk");
//写入
for (int i = 0; i < 5; i++) {
osw.write("HELLO WORLD\r\n");
osw.flush();
}
//guanbi
osw.close();
System.out.println("执行结束");
}
}
-------------文件内容-------------
HELLO WORLD
HELLO WORLD
HELLO WORLD
HELLO WORLD
HELLO WORLD
六. File类
概念:
- 代表物理盘符中的一个文件或者文件夹
方法:
- createNewFile()–创建一个新文件
- mkdir()–创建一个新目录
- delete()–删除文件或空目录
- exists()–判断File对象所代表的对象是否存在
- getAbsolutePath()–获取文件的绝对路径
- getName()–取得名字
- getParent()–获取文件/目录所在的目录
- isDirectory()–是否是目录
- isFile()–是否是文件
- length()–获得文件的长度
- listFiles()–列出目录中的所有内容
- renameTo()–修改文件名为
1. 分隔符
public class Demo01 {
public static void main(String[] args){
//(1)分隔符
separator();
}
//分隔符
public static void separator(){
System.out.println("路径分隔符:\t"+ File.pathSeparator);
System.out.println("名称分隔符:\t"+File.separator);
}
}
---------------结果---------------
路径分隔符: ;
名称分隔符: \
2. 文件操作
public class Demo01 {
public static void main(String[] args) throws Exception{
//(2)文件操作
fileOpe();
}
//文件操作
public static void fileOpe() throws Exception{
//创建文件
File file = new File("D://c.txt");//创建文件对象,电脑上还没有
if(!file.exists()){//如果文件已存在则不执行
boolean a =file.createNewFile();//创建文件,返回值为逻辑值,true为创建成功
System.out.println("创建结果:"+a);
}
//删除文件 第一种方法:
// boolean b= file.delete();
// System.out.println("删除结果:"+b);
//第二种方法 使用jvm退出时删除
// file.deleteOnExit();//文件会在虚拟机关闭后删除
// Thread.sleep(5000);
//获取文件信息
System.out.println("文件绝对路径:"+file.getAbsoluteFile());
System.out.println("获取路径:"+file.getPath());
System.out.println("获取文件名称:"+file.getName());
System.out.println("获取父路径:"+file.getParent());
System.out.println("获取文件长度:"+file.length());
System.out.println("文件创建时间:"+new Date(file.lastModified()).toLocaleString());
//判断
System.out.println("是否可写:"+file.canWrite());
System.out.println("是否是文件:"+file.isFile());
System.out.println("是否隐藏:"+file.isHidden());
}
}
---------------结果---------------
文件绝对路径:D:\c.txt
获取路径:D:\c.txt
获取文件名称:c.txt
获取父路径:D:\
获取文件长度:26
文件创建时间:2021-4-9 21:59:24
是否可写:true
是否是文件:true
是否隐藏:false
3. 文件夹操作
public class Demo01 {
public static void main(String[] args) throws Exception{
//(3)文件夹操作
directoryOpe();
}
//文件夹操作
public static void directoryOpe() throws Exception{
//创建文件夹
File dir = new File("D://aaa//bbb");
System.out.println(dir.toString());
if(!dir.exists()){
//dir.mkdir();//只能创建单级目录
boolean b = dir.mkdirs();//创建多级目录
System.out.println("创建结果:"+b);
}
//删除文件夹
//直接删除
// System.out.println("删除结果:"+dir.delete());//只删除最底层目录,且是空目录
//虚拟机删除
// dir.deleteOnExit();
// Thread.sleep(5000);//休眠五秒后,删除最底层目录
//获取文件夹信息
System.out.println("获取绝对路径:"+dir.getAbsolutePath());
System.out.println("获取路径:"+dir.getPath());
System.out.println("获取名称:"+dir.getName());
System.out.println("获取父目录:"+dir.getParent());
System.out.println("文件创建时间:"+new Date(dir.lastModified()).toLocaleString());
//判断
System.out.println("是否是文件夹:"+dir.isDirectory());
System.out.println("是否是隐藏:"+dir.isHidden());
//遍历文件夹
File dir2 = new File("D:pics");
String[] lis = dir2.list();
System.out.println("------------------遍历文件目录--------------------");
for (String s : lis) {
System.out.println(s);
}
}
}
---------------结果---------------
D:\aaa\bbb
获取绝对路径:D:\aaa\bbb
获取路径:D:\aaa\bbb
获取名称:bbb
获取父目录:D:\aaa
文件创建时间:2021-4-11 13:05:51
是否是文件夹:true
是否是隐藏:false
------------------遍历文件目录--------------------
aaa
bbb.jpg
ccc.jpg
4. FileFilter接口(文件过滤器)
public interface FileFilter
- boolean accept(File pathname)
当调用File类中的 listFiles()方法时,支持传入 FileFilter接口接口实现类,对获取文件进行过滤,只有满足条件的文件的才可出现在 listFiles()的返回值中.
import java.io.File;
import java.io.FileFilter;
public class Demo02 {
public static void main(String[] args) {
//FileFilter接口的使用
File dir = new File("D://pics");
File[] file = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
if (pathname.getName().endsWith(".jpg")) {
return true;
}
return false;
}
});
for (File file1 : file) {
System.out.println(file1.getName());
}
}
}
---------------结果---------------
bbb.jpg
ccc.jpg
5. 递归遍历和递归删除
import java.io.File;
public class Demo03 {
public static void main(String[] args) {
//递归遍历文件
listDir(new File("D://myfiles"));
System.out.println("------------分隔符--------------");
//递归删除文件
deleteDir(new File("D://myfiles"));
}
//递归遍历文件
public static void listDir(File dir){
File[] files = dir.listFiles();
System.out.println(dir.getAbsolutePath());
if(files!=null && files.length>0){
for (File file : files) {
if(file.isDirectory()){
listDir(file);//递归
}else{
System.out.println(file.getAbsolutePath());
}
}
}
}
//递归删除文件
public static void deleteDir(File dir){
File[] files = dir.listFiles();
if(files!=null && files.length>0){
for (File file : files) {
if(file.isDirectory()){
deleteDir(file);//递归
}else{
//删除文件
System.out.println(file.getAbsolutePath()+"删除"+file.delete());
}
}
}
System.out.println(dir.getAbsolutePath()+"删除"+dir.delete());
}
}
---------------结果---------------
D:\myfiles
D:\myfiles\TXT4.txt
D:\myfiles\文件1.rtf
D:\myfiles\文件夹1
D:\myfiles\文件夹1\TXT1.txt
D:\myfiles\文件夹1\TXT2.txt
D:\myfiles\文件夹2
D:\myfiles\文件夹2\TXT3.txt
------------分隔符--------------
D:\myfiles\TXT4.txt删除true
D:\myfiles\文件1.rtf删除true
D:\myfiles\文件夹1\TXT1.txt删除true
D:\myfiles\文件夹1\TXT2.txt删除true
D:\myfiles\文件夹1删除true
D:\myfiles\文件夹2\TXT3.txt删除true
D:\myfiles\文件夹2删除true
D:\myfiles删除true
补充:Properties
Properties:属性集合
特点
- 1存储属性名和属性值
- 2属性名和属性值都是字符串类型
- 3没有泛型
- 4和流有关
实例:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.util.Properties;
import java.util.Set;
public class Demo04 {
//propertics集合的使用
public static void main(String[] args) throws Exception{
//创建
Properties properties = new Properties();
//添加
properties.setProperty("uername","张三");
properties.setProperty("age","20");
System.out.println(properties.toString());
//遍历 stringpropertyNames()
Set<String> proname = properties.stringPropertyNames();
for (String s : proname) {
System.out.println(s+"==="+properties.getProperty(s));
}
//和流有关的地方
//list方法
PrintWriter pw = new PrintWriter("D://b.txt");
properties.list(pw);
pw.close();
//store保存方法
FileOutputStream fos = new FileOutputStream("D://c.properties");
properties.store(fos,"注释 ");
//load加载
Properties properties1 = new Properties();
FileInputStream fis = new FileInputStream("D://c.properties");
properties1.load(fis);
fis.close();
System.out.println(properties1.toString());
}
}
---------------结果---------------
{age=20, uername=张三}
age===20
uername===张三
{age=20, uername=张三}
七. 总结:
-
流的概念
- 内存与存储设备之间传输数据的通道。
-
流的分类
- 按流向分:输入流、输岀流;
- 按处理单位分:字节流、字符流;
- 按功能分:节点流、过滤流;
-
序列化、反序列化
- 将对象通过流写入到文件,或将对象通过流读取到内存,必须实现 Serializable接口。
-
File对象
- 代表物理盘符中的一个文件或者文件夹
上一篇
JAVA I/O框架(一)
链接