File
File的构造方法
public class dome {
public static void main(String[] args) {
File f1 = new File("D:\\Java\\hello");
System.out.println(f1);
File f2 = new File("D:","Java\\hello");
System.out.println(f2);
File f3 = new File("D:");
File f4 =new File(f3,"Java\\hello");
System.out.println(f4);
}
}
File创建功能
public class dome {
public static void main(String[] args) throws IOException {
//如果存在就flast,否则true
//创建文件
File f1 = new File("D:\\Java\\hello.txt");
System.out.println(f1.createNewFile());//不能与目录名相同
//创建目录
//如果存在就flast,否则true
File f2 = new File("D:\\Java\\JavaFile");
System.out.println(f1.mkdir());
System.out.println(f2.mkdirs());
}
}
File的判断以及获取功能
public class dome {
public static void main(String[] args) throws IOException {
File f1 = new File("D:\\Java\\JavaFile\\hello.txt");
System.out.println(f1.isDirectory()); //判断是不是目录
System.out.println(f1.isFile()); //判断是不是文件
System.out.println(f1.exists()); //判断路径名是否存在
System.out.println("-------");
System.out.println(f1.getAbsolutePath());//返回绝对路径
System.out.println(f1.getPath()); //返回封装路径
System.out.println(f1.getName()); //返回文件名称
System.out.println("-------");
File f2 = new File("D:\\Java");
String[] list = f2.list(); //返回此目录中的文件名
for(String ss : list){
System.out.println(ss);
}
System.out.println("-------");
File[] files = f2.listFiles();
for(File f : files){
// System.out.println(f); 返回绝对路径
// System.out.println(f.getName()); 返回文件名
//真正用途
if(f.isFile()){//如果是文件就输出
System.out.println(f.getName());
}
}
}
}
File的删除
public class dome {
public static void main(String[] args) throws IOException {
// D:\Java\JavaFile\hello.txt 绝对路径
// Java_Code\Filedele 相对路径
File f = new File("Java_Code\\Filedele.txt");
f.createNewFile();
System.out.println(f.delete());
File f1 = new File("Java_Code\\date");
f1.mkdir();
System.out.println(f1.delete());//目录下有内容需要先删文件
}
}
案例:递归遍历目录
public class dome {
public static void main(String[] args) throws IOException {
File f = new File("D:\\WeChat");
// String[] list = f.list();
// for(String it : list){
// System.out.println(it);
// }
getAllFilePath(f);
}
public static void getAllFilePath(File e){
File[] files = e.listFiles();
if(files!=null){
for(File it : files){
if(it.isDirectory()){
getAllFilePath(it);
}
else {
System.out.println(it.getPath());
}
}
}
}
}
字节流
那么这两种流都在什么情况下使用呢?
如果数据通过Window自带的记事本软件打开,我们还可以读懂里面的内容就使用字符流
否则使用字节流。如果你不知道该使用哪种类型的流,就使用字节流
字节流写数据
public class dome {
public static void main(String[] args) throws IOException {
//创建字节输出流
FileOutputStream out = new FileOutputStream("Java_Code\\date\\test.txt");//创建了文件
out.write(100);//用ALCSS码写进去
out.write(57);
//释放资源
out.close();//关闭此文件的输出流并且释放与此流相关的任何系统资源
}
}
输入的三种方式
public class dome {
public static void main(String[] args) throws IOException {
FileOutputStream out = new FileOutputStream("Java_Code\\Date\\test.txt");
// out.write(100);
// out.write(25);
// byte[] bytes = {100,90,97,98};
// byte[] bytes = "abcde".getBytes();
// out.write(bytes);
byte[] bytes = "abcde".getBytes();
out.write(bytes,1,3);
out.close();
}
}
输入时的两个小问题
1.追加写入
2.换行
public class dome {
public static void main(String[] args) throws IOException {
FileOutputStream f = new FileOutputStream("Java_Code\\Date\\test.txt");
// FileOutputStream f = new FileOutputStream("Java_Code\\Date\\test.txt",true);在末尾追加写入
for(int i=0;i<=4;i++){
f.write("hello".getBytes());
f.write("\t\n".getBytes());
/*
在windows:\r\n
在Linux :\n
在mac :\r
*/
}
f.close();
}
}
字节流读数据
一次一个字节
public class dome {
public static void main(String[] args) throws IOException {
FileInputStream f = new FileInputStream("Java_Code\\Date\\test.txt");
int bye;
while((bye=f.read())!=-1){
System.out.print((char)bye);
}
}
}
一次读入一个字节组
public class dome {
public static void main(String[] args) throws IOException {
FileInputStream f = new FileInputStream("Java_Code\\Date\\test.txt");
byte[] b= new byte[1024];//整数倍
int len;
while((len=f.read(b))!=-1){
System.out.println(new String(b,0,len));
}
f.close();
}
}
复制图片
public class dome {
public static void main(String[] args) throws IOException {
FileInputStream f = new FileInputStream("D:\\Java\\domepng.png");
FileOutputStream f1 = new FileOutputStream("Java_Code\\Date\\test.png");
byte[] b= new byte[10240];
int len;
while((len=f.read(b))!=-1){
f1.write(b,0,len);
}
f.close();
f1.close();
}
}
字节缓冲流
public class dome {
public static void main(String[] args) throws IOException {
// BufferedOutputStream f = new BufferedOutputStream(new FileOutputStream("Java_Code\\Date\\test.txt"));//字节缓冲输入流
BufferedInputStream f0 = new BufferedInputStream(new FileInputStream("Java_Code\\Date\\test.txt")); //字节缓冲输出流
// f.write("hooo".getBytes());
byte[] b = new byte[1024];
int len;
while((len=f0.read(b))!=-1){
System.out.println(new String(b,0,len));
}
// f.close();
f0.close();
}
}
案例:复制视频(字节缓冲流复制一个数组较快)
public class dome {
public static void main(String[] args) throws IOException {
long l = System.currentTimeMillis();
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("Java_Code\\Date\\text.mp4"));
BufferedInputStream in = new BufferedInputStream(new FileInputStream("D:\\Java\\domemp4.mp4"));
int len;
byte[] b = new byte[20*1024];
while((len = in.read(b))!=-1){
out.write(b,0,len);
}
out.close();
in.close();
long l1 = System.currentTimeMillis();
System.out.println(l1-l+"毫秒");
}
}
字符流
编码与解码
public class dome {
public static void main(String[] args) throws IOException {
String s = "中国";//默认UTF-8编码
byte[] bys = s.getBytes("UTF-8");//[-28, -72, -83, -27, -101, -67]
// byte[] bys = s.getBytes();//[-28, -72, -83, -27, -101, -67]
// byte[] bys = s.getBytes("GBK");//[-42, -48, -71, -6]
// System.out.println(Arrays.toString(bys));
String res = new String(bys);//中国
// String res = new String(bys,"GBK");//中国
System.out.println(res);
}
}
public class dome {
public static void main(String[] args) throws IOException {
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("Java_Code\\Date\\dome.txt"));
// OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("Java_Code\\Date\\dome.txt"),"GBK");
out.write("中国");
out.close();
InputStreamReader in = new InputStreamReader(new FileInputStream("Java_Code\\Date\\dome.txt"));
// InputStreamReader in = new InputStreamReader(new FileInputStream("Java_Code\\Date\\dome.txt"),"GBK");
char[] b = new char[1024];
int len;
while((len=in.read(b))!=-1){
System.out.println(new String(b,0,len));
}
in.close();
}
}
字符流写数据的5种方式
public class dome {
public static void main(String[] args) throws IOException {
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("Java_Code\\Date\\test.txt"));
//1
out.write(97);//此时写不进去数据,因为数据最终要通过FileOutputStream写进去,此时还在缓冲区
out.flush();//通过刷新流写进数据
out.write(98);
//2
char[] c ={97,98,99};
out.write(c);//也需要刷新流
//3
out.write(c,1,2);//也需要刷新流
//4
String s = "wtret";
out.write(s);//也需要刷新流
//5
out.write(s,1,3);//也需要刷新流
out.close();//此时会自动执行一次刷新流,且释放资源后就不能在写数据了
}
}
字符流读数据的两种方式
public class dome {
public static void main(String[] args) throws IOException {
InputStreamReader in = new InputStreamReader(new FileInputStream("D:\\Java\\dometxt.txt"));
// int c;
// while((c=in.read())!=-1){
// System.out.print((char)c);
// }
int len;
char[] c = new char[1024];
while((len=in.read(c))!=-1){
System.out.println(new String(c,0,len));
}
in.close();
}
}
案例:
public class dome {
public static void main(String[] args) throws IOException {
// OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("Java_Code\\Date\\test.txt"));
// InputStreamReader in = new InputStreamReader(new FileInputStream("D:\\Java\\dometxt.txt"));
// int len;
// char[] c = new char[1024];
// while((len=in.read(c))!=-1){
// out.write(c,0,len);
// }
// out.close();
// in.close();
//涉及到编码问题还需要第一张方式
FileReader fr = new FileReader("Java_Code\\Date\\test.txt");
FileWriter fw = new FileWriter("D:\\Java\\dometxt.txt");
int len;
char[] c = new char[1024];
while((len=fr.read(c))!=-1){
fw.write(c,0,len);
}
fr.close();
fw.close();
}
}
字符缓冲流
public class dome {
public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new FileWriter("Java_Code\\Date\\test.txt"));
bw.write("hello\r\n");
bw.write("你好\r\n");
bw.flush();
BufferedReader br = new BufferedReader(new FileReader("Java_Code\\Date\\test.txt"));
int len;
char[] c = new char[1024];
while((len=br.read(c))!=-1){
System.out.println(new String(c,0,len));
}
br.close();
bw.close();
}
}
字符缓冲流的特有功能
public class dome {
public static void main(String[] args) throws IOException {
// BufferedWriter bw = new BufferedWriter(new FileWriter("Java_Code\\Date\\test.txt"));
// for(int i=0;i<=10;i++){
// bw.write("hello"+i);
// bw.newLine();//输入一个又系统决定的换行符,例如windows的\r\n
// }
// bw.close();
BufferedReader br = new BufferedReader(new FileReader("Java_Code\\Date\\test.txt"));
String s;
while((s=br.readLine())!=null){//一次读入一行数据,如果没有,则输出null,不包括换行
System.out.println(s);
}
br.close();
}
}
总结
需要学习的案例
单级文件夹复制
public class dome {
public static void main(String[] args) throws IOException {
File fd = new File("D:\\javatest");
String dname = fd.getName();
File fsrc = new File("Java_Code\\Date",dname);
if(!fsrc.exists()){
fsrc.mkdir();
}
File[] files = fd.listFiles();
for(File it :files){
String s = it.getName();
File fsrc1 = new File(fsrc,s);
cop(it,fsrc1);
}
}
public static void cop(File boot,File src) throws IOException {
BufferedOutputStream bo = new BufferedOutputStream(new FileOutputStream(src));
BufferedInputStream br = new BufferedInputStream(new FileInputStream(boot));
int len ;
byte[] b = new byte[1024];
while((len=br.read(b))!=-1){
bo.write(b,0,len);
}
bo.close();
br.close();
}
}
多级文件夹复制
public class dome {
public static void main(String[] args) throws IOException {
dir(new File("D:\\Javatest"),new File("Java_Code\\Date"));
}
public static void dir(File boot,File src)throws IOException{
File f = new File(src,boot.getName());
if(!f.exists()){
f.mkdir();
}
File[] files = boot.listFiles();
for(File it : files){
File ff = new File(f,it.getName());
if(!it.isFile()){
dir(it,f);
}
else cop(it,ff);
}
}
public static void cop(File boot,File src)throws IOException{
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(src));
BufferedInputStream in = new BufferedInputStream(new FileInputStream(boot));
int len;
byte[] b = new byte[20*1024];
while((len=in.read(b))!=-1){
out.write(b,0,len);
}
out.close();
in.close();
}
}
异常处理
public class dome {
public static void main(String[] args) {
}
//JDK9处理异常
public static void show3() throws IOException{
BufferedReader fr = new BufferedReader(new FileReader("D:\\Java\\dometxt.txt"));
BufferedWriter fw = new BufferedWriter(new FileWriter("Java_Code\\Date\\test.txt"));
try(fr;fw){
int len;
char[] a = new char[1024];
while ((len = fr.read(a)) != -1) {
fw.write(a, 0, len);
}
}
catch (IOException e){
e.printStackTrace();
}
}
//JDK7处理异常--通常用这个
public static void show2() {
try(BufferedReader fr = new BufferedReader(new FileReader("D:\\Java\\dometxt.txt"));
BufferedWriter fw = new BufferedWriter(new FileWriter("Java_Code\\Date\\test.txt"));){
int len;
char[] a = new char[1024];
while ((len = fr.read(a)) != -1) {
fw.write(a, 0, len);
}
}
catch (IOException e){
e.printStackTrace();
}
}
//处理异常
public static void show1() {
BufferedReader fr=null;
BufferedWriter fw = null;
try {
fr = new BufferedReader(new FileReader("D:\\Java\\dometxt.txt"));
fw = new BufferedWriter(new FileWriter("Java_Code\\Date\\test.txt"));
int len;
char[] a = new char[1024];
while ((len = fr.read(a)) != -1) {
fw.write(a, 0, len);
}
}
catch (IOException e){
e.printStackTrace();
}finally {
fr.close();
fw.close();
}
}
//抛出异常
public static void show() throws IOException{
BufferedReader fr = new BufferedReader(new FileReader("D:\\Java\\dometxt.txt"));
BufferedWriter fw = new BufferedWriter(new FileWriter("Java_Code\\Date\\test.txt"));
int len;
char[] a = new char[1024];
while((len=fr.read(a))!=-1){
fw.write(a,0,len);
}
fr.close();
fw.close();
}
}
特殊操作流
标准输入输出流
public class dome {
public static void main(String[] args) {
BufferedReader fr = new BufferedReader(new InputStreamReader(System.in));//从键盘输入数据,标准输入流
//和Scanner一样
PrintStream out = System.out;
out.printf("你好");
System.out.printf("你好");//标准输出流
}
}
字节打印流与字符打印流
public class dome {
public static void main(String[] args) throws IOException {
// //字节打印流
// PrintStream ps = new PrintStream("Java_Code\\Date\\test.txt");
//
// //字节输出流的方法
// ps.write(97);
//
// //特有方法
// ps.print("hello");
// ps.println("20");
// ps.close();
//字符打印流
PrintWriter pw = new PrintWriter(new FileWriter("Java_Code\\Date\\test.txt"),true);//如果true,则自动刷新
pw.println("aa");
/*
pw.write("aa");
pw.write("\r\n");
pw.flush();
*/
pw.close();
}
}
案例:字符打印流复制文件
public class dome {
public static void main(String[] args) throws IOException {
BufferedReader fr = new BufferedReader(new FileReader("D:\\Java\\dometxt.txt"));
PrintWriter pw = new PrintWriter(new FileWriter("Java_Code\\Date\\test.txt"));
String s;
while((s=fr.readLine())!=null){
pw.println(s);
}
fr.close();
pw.close();
}
}
对象序列化流与反序列化流
public class dome {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//对象序列化流
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("Java_Code\\Date\\test.txt"));
Student s = new Student("张三",2,3,4);//对象序列化需要类继承Serializable
oos.writeObject(s);
oos.close();
//对象反序列化流
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("Java_Code\\Date\\test.txt"));
Object o = ois.readObject();
Student ss = (Student)o;
System.out.println(ss.getName());
ois.close();
}
}
IO框架
特殊文本,日志技术
Properties
public class dome {
public static void main(String[] args) throws Exception {
//创建一个Properties对象
Properties properties = new Properties();
//将文件加载进properties中
properties.load(new FileReader("Java_Code\\Date\\test.properties"));
// System.out.println(properties);
//从文件中寻找数据
String s1 = properties.getProperty("王伟伟");
System.out.println(s1);
Set<String> strings = properties.stringPropertyNames();
for(String it : strings){
System.out.println(it+"----->"+properties.getProperty(it));
}
//存储进数据
properties.setProperty("李华","121323");
properties.store(new FileWriter("Java_Code\\Date\\test.properties"),"此文本储存的是密码");
}
}
XML
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 注释-->
<!-- 上面的生命必须放在第一行,必须存在-->
<users>
<users id = "1">
<name>李华</name>
<age>12</age>
<sex>男</sex>
<![CDATA[
3 < 2
]]>
<!-- 特殊数据区,可以写任何数据-->
</users>
<users id = "2">
<name>张三</name>
<age>13223</age>
<sex>女</sex>
</users>
<!--
< 代替 <
> 代替 >
& 代替 &
'代替 '
"代替 "
-->
</users>