JAVAIO流(09)
JAVAio流的简介
- 通过学习本文档后能够掌握到的知识点
- 1、JAVA的io是什么
- 2、字符流和字节流
- 3、如何使用io
- 4、递归查询所有的文件夹的文件
- 5、正则表达式
- 6、XML的处理及基本概念
子曰:“学而不思则罔,思而不学则殆。”
1. 什么是IO
1.1概念
IO其实指的是INPUT和OUTPUT,输入输出。
IO对数据进行输入和输出,比如键盘输入、音频录入、写字板输入。屏幕输出、打印输出。JAVA中将这些输入输出数据的操作抽象的称之为“流”,所以就有了输入流和输出流两种。一个只能读数据(输入流),一个只能写数据(输出流)。实际上这些流就是数据的一些序列,流序列种的数据既可以是原始的二进制也可以是进过一定编码的数字,字符。
通过处理数据的类型,流可以分为字节流和字符流,他们的区别就在于一个是处理字节(byte)一个处理字符(char)。
其中处理字节的在JAVA中用的都是inputstream和outputstream两个接口。
而处理字符的在java中用的都是reader和writer接口.
处理类型\流类型 | 字节流 | 字符流 |
---|---|---|
输入 | InputStream | Reader |
输出 | OutputStream | Writer |
其中InputStream中关键的几个方法是:
read()方法,此方法有三个重载。分别是public int read();public int read(byte[]);publicr read(byte[],int off,int len);
第一个是读一位字节(8)位二进制的数,然后加上3个字节的全零字节组合成一个32位的整数型。值是0-255.
第二个和第三个方法都是连续多读字节然后返回对应的数组中。
接着另一个重要的方法为:close方法,此方法是读取数据时需要关闭通道,读取数据的通道!inputstream这个类就相当于程序读文件数据的一根管子。
OutPutStream
最重要的两个方法就是:write()方法将数据写人对应的地方。close();关闭管道。
Reader:Reader是操作字符的管道,关键是流通的是字符。主要的方法是:read()以及close():
Writer:与Output类似主要的方法也是:write()和close():主要差别在数据的类型。
1.2实例
package chapter09;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class TestStandInputStram {
public static void main(String[] args) {
// System.out.println("aaa");
// try {
// int a =System.in.read();
// System.out.println(Character.toChars(a));
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//此方法来赋值文本文件
//创建文件读入流
try {
FileInputStream in = new FileInputStream("baidu.htm");
FileOutputStream writer = new FileOutputStream("TEST.txt");
//将定义一个指针指向对应的流位置
int a = in.read();
while(a!=-1) {
writer.write(a);
System.out.print((char)a);
//指向下个位置
a=in.read();
}
in.close();
writer.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
System.out.println("文件不存在");
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("文件为空");
e.printStackTrace();
}
}
}
2.节点流和处理流
节点流:直接进行对文件的操作,称之为节点流。
处理流:不直接对数据进行操作,将节点流处理一下叫处理流。(所谓的处理就是将其过滤,比如将字节变成一整句)
简单来说,节点流一个个字符或者字节读。而处理流可以一句话一句话的读。效率高,不占内存!
3. 递归扫描整个文件
package chapter09;
import java.io.File;
import java.nio.file.Files;
/**
*
* <p>Title: ListAllFiles</p>
* <p>Description:this class is used to test File Object </p>
* @author HAND_WEILI
* @date 2018年7月17日
*/
public class ListAllFiles {
/**
* file类中一些常用的方法,再次记录
* boolean isFile()是一个文件吗
* boolean isExists()这个文件存在吗?
* boolean isdirectory()目录是否有效
* String getName() 获取文件的名字
* String Path() 获取文件的路径
* System.getProperty("file.separator");系统的分隔符
* long length()文件长度返回字节。
* canRead()能否读
* canwriter()能否写
* Sting 【】list () 将目录下的文件名保存在字符数组放回
* ================
* 创建或者操作文件
* renameTo()"改名字
* delete()删除
* mkdir()创建当前目录目录子对象
*
*
* 接下来一个个练习。
*
*
*
*/
public static void main(String [] args) {
String s =System.getProperty("file.separator"); //获取当前系统的文件分隔符
System.out.println(s);
//ListFiles(new File("C:\\Users\\HAND_WEILI\\Desktop\\test\\12")); //扫描c
//readDirectoryTree(new File("C:\\Users\\HAND_WEILI\\Desktop\\test\\12"),0);
readDirectoryTree(new File("D:\\Git"),0);
}
public static void ListFiles(File dir) {
int time=0; //此方法用来定义自己被调用了多少次
String a="||==";
//如果不存在或者路径不存在就返回
if(!dir.exists()||!dir.isDirectory()) return;
String [] files = dir.list(); //将所有目录名给放入了一个files数组中for(File file:files){}
// System.out.println(
// "文件总数为============================================="+files.length);
for(int i = 0 ; i<files.length;i++) {//循环遍历
File file = new File(dir,files[i]); //通过file(path,file)父类的路径名和子类的路径
if(file.isFile()) {
//先打空格数后打文件
for(int j=0;j<time;j++) {
System.out.print(" ");
}
System.out.println(
file.getName()+"\t"); //判断子节点中是不是一个文件如果是一个文件就将目录名加文件名和长度打出
}else { //如果不是文件那就是个目录就输出目录
for(int j=0;j<time;j++) {
System.out.print("|==");
}
System.out.println(
file.getName()+"\t<dir>"); //此处应该还是同级目录
time++;
//System.out.println("调用次数======================================"+time);//输出time
ListFiles(file); //使用递归将自己从新读取。
}
}
}
/**
*
* <p>Title: readDirectoryTree</p>
* <p>Description:this method is used to show directory contract </p>
* @param f replace file
* @param size replace print == nubmber
*/
public static void readDirectoryTree(File f ,int size) {
//第一将文件读入,判断是否存在不存在排除
if(!f.exists()||!f.isDirectory())return; //如果文件不存在就返回
//第二判断文件是文件还是文件夹
File[] files =f.listFiles(); //获取目标文件中所有的文件
for(File f1:files) {
//判断是文件还是文件夹
if(f1.isFile()) { //判断是文件
for(int j=0;j<size;j++) {
System.out.print(" "); //打印空格
}
System.out.println(f1.getName());//打印文件名
}else {
for(int j=0;j<size;j++) {
System.out.print(" "); //打印空格
}
System.out.println(f1.getName()); //打印目录文件名
//文件夹输出空格数量+名字,文件夹先输出名字后,再次递归调用次方发。size增加.
readDirectoryTree(f1,size+4);
}
}
}
}
在做比较复杂的问题时,应该给出算法!此处算法为代表的是解决问题的方法!
1.创建一个文件,放入对应的目录名。
2.判断是否存在此文件,是目录还是文件。
3.读取文件下的文件列表成为一个集合。
4.循环判断文件是否存在!
5.判断文件是文件还是文件夹,如果是文件直接打印出其文件名,OTHERWISE使用递归将文件夹重新调用本方法!
流程图:
4.正则表达式
基本概念
不是不想写,背太痛了。不好打字。
拍照片吧 哈哈 。
关于pattern和matcher两个类的使用
package chapter09;
import java.util.regex.Pattern;
/**
*
* <p>Title: RegexSplitter</p>
* <p>Description:用来测试对应的Pattern类 </p>
* @author HAND_WEILI
* @date 2018年7月17日
*/
public class RegexSplitter {
public static void main(String[] args) {
//此方法非常方便,以前的方法是需要自己将string 转换成字符串。然后进行循环判断
Pattern p = Pattern.compile("[,\\s]+"); //定义模式类用正则直接删除掉一些不要用的字符。
String [] result=
p.split("one,two,three for, five"); //分隔。
for(int i = 0 ; i <result.length ; i++) {
System.out.println(result[i]);
}
String s = "关关雎鸠,在和直走,窈窕淑女,君子好逑";
String [] s1 =s.split(",");
for(String s3 :s1) {
System.out.println(s3);
}
String s4 = s.replace(",", ""); //字符的不变性 ,要么用StringBuffer, StringBuilder。
System.out.println(s4);
//==================================================================
//判断邮件是否合法 从头开始扫描 aaa@qq.com \w代表所有的单字符
String p2 = "^[^@]aaa@qq.com[\\w]+.[\\w]+$";
String email = "aaa@qq.com";
boolean of = Pattern.matches(p2, email);
System.out.println(of);
}
}
5、XML文件的使用
转换的逻辑图,概念就是xml用来进行数据交互的。
代码。晕,手好痛~
package chapter09;
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.*;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
/**
*
* <p>Title: DOMReaderXML</p>
* <p>Description:使用DOM的方式来解析 </p>
* @author HAND_WEILI
* @date 2018年7月17日
*/
public class DOMReaderXML {
public static void main(String[] args) {
Document d = Doucmentreader.reader("test.xml"); //获取到文档 此处的文件时项目下的文件,如果不是就需要将其写绝对定位
Element rootElement = d.getDocumentElement(); //获取父节点
NodeList nlist = rootElement.getChildNodes();//获取自己点列表
for(int i=0 ;i<nlist.getLength();i++) {//遍历
//获取每一个节点
Node n = nlist.item(i);
System.out.println(n.getTextContent());
//进行判断是否为node.element_node
//输出node.getTextContenrt;
}
}
}
/**
*
* <p>Title: Doucmentreader</p>
* <p>Description: 此类用来进行解析的</p>
* @author HAND_WEILI
* @date 2018年7月17日
*/
class Doucmentreader {
public static Document reader(String xmlName) {
Document d = null;
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance(); //第一步加载文档建造工厂,直接创建实例不要NEW
try {
DocumentBuilder db = dbf.newDocumentBuilder(); //第二步加载建造者
d=db.parse(new File(xmlName));//第三步加载文档
return d; //需要直接在这里返回出去
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return d;
}
}
6、总结
今天关于io的知识主要是如何读取,常用方法,以及文件的遍历和xml文件的转换加上正则。非常有收获,不过有些细节不太牢固。需要回来复习及添加新的知识。加油我的威!
上一篇: 人脸考勤识别项目
下一篇: 人脸识别项目openface