Java学习笔记07:Java语法IO流File
Java语法IO流:File
- IO介绍
- File
- 字节流
- 字符流
- CommonsIO
IO流
程序=>数据源(文件,数据库,网络...)
流分类:
- 节点流:可以直接从数据源或者目的地读写数据
- 处理流:不直接连接到数据源或目的地,是其他流进行封装,目的是简化操作和提高性能
节点流和处理流的关系:
- 节点流处于IO操作的第一线,所有的操作必须通过他们进行
- 处理流可以对其他流进行处理(提高效率或者操作灵活性)
具体的流类别分类:
- 字节流:按照字节读取数据(InputStream,OutputStream)
- 字符流:按照字符读取数据(Reader、Writer),因为文件的编码不同,从而有了对字符进行高效操作的字符流对象
底层原理:底层还是基于字节流操作,自动搜寻指定的码表
- Reader
- InputStreamReader
- FileReader
- BufferReader
- LineNumberReader
- FilterReader
- PushbackReader
- CharArrayReader
- PipeReader
- StringReader
- InputStreamReader
- Writer
- OutputStreamWriter
- FileWriter
- BufferedWriter
- FilterWriter
- CharArrayWriter
- PipeWriter
- StringWriter
- OutputStreamWriter
File
-
File.separator
//获取路径类型: / \
构建File对象
//1.构建file对象
File file = new File(path);
System.out.println(file.length());
//大小 file.length
String parent = File.separator + "Users" + File.separator + "huangfl" + File.separator + "repos"+ File.separator+"IdeaWorkfroce"+File.separator+"BaseGrammer"+File.separator+"src"+File.separator+"com"+File.separator+"IO";
//2.构建file对象 父元素路径, 名称
File file1 = new File(parent, "archive.jpg");
System.out.println(file1.length());
1.查看文件的目录
File src = new File("archive.jpg");
System.out.println(src.getAbsoluteFile());
//获取src的相对路径
System.out.println(System.getProperty("user.dir"));
2.构建一个不存在的文件
File src = new File("asdasd.jpg")
//实际这个文件是构建存在的
- getName() //获取文件名字
- getPath() //获取文件路径,如果是相对路径得到相对路径 如果是绝对路径就是绝对路径
- getParent() //获取父组件的路径,如果是绝对路径得到绝对路径,如果是相对路径结果就是null
- 判断状态
-
不存在
- exists()
-
存在
-
文件 exists()
-
文件夹 isDirectory()
String path = " slkjs;fdsf"; File src = new File(path); System.out.println(src.exists()); //true System.out.println(src.isFile()); //true System.out.println(src.isDirectory()); //false
-
-
length
- 返回文件字节的长度
-
createNewFile()
- 不存在的时候才会创建,不存在这不会创建,只能创建文件,不能创建文件夹
-
delete()
- 删除已经存在的文件
-
mkdir() mkdirs()
- 创建目录,如果父目录链不存在一同创建
-
list
- 下级名称
-
listFiles()
- 下级File
-
listRoots
- 跟路径
-
list()
- 获取下级名称,遍历数组
package com.IO;
import java.io.File;
public class demo02 {
public static void main(String[] args) {
String s = "/Users/huangfl/repos/IdeaWorkfroce/BaseGrammer/src/com/IO";
File file = new File(s);
String[] str = file.list();
for(String item:str ){
System.out.println("item: "+item);
}
}
}
- listFiles()
- 获取下级名称对象
File[] subFiles = file.listFiles();
for(File item: subFiles){
System.out.println(item.getAbsolutePath());
}
/*
/Users/huangfl/repos/IdeaWorkfroce/BaseGrammer/src/com/IO/archive.jpg
/Users/huangfl/repos/IdeaWorkfroce/BaseGrammer/src/com/IO/demo02.java
/Users/huangfl/repos/IdeaWorkfroce/BaseGrammer/src/com/IO/PathDemo.java
*/
- listRoots()
- 获取所有的盘符
- 计算文件的大小
public static void count(File src){
if(null!=src&&src.exists()){
if(src.isFile()){
src.length()
}else{
for(File s:src.listFiles()){
count(s);
}
}
}
}
字符 ==> 字节 (编码)
字节 ==> 字符 (解码)
- 编码-->字节(UTF-8)
String msg = "性命 生命 使命";
byte[] datas = msg.getBytes();
System.out.println(datas.length());
//对于UTF-8而言,一个汉字占用3个字节,一个字母占用1个字节
//所以这里应该输出20,要计算其中两个空格
- 编码其他字符集(UTF-16LE)
String msg = "性命生命使命";
byte[] datas = msg.getBytes("UTF-16LE");
System.out.println(datas.length());
//对于UTF-16LE而言,无论是汉字还是字节都是占用两个字节 所以输出为12;
- 编码为GBK
byte[] datas = msg.getBytes("GBK");
System.out.println(data.length());
//如果是汉字就是两个字节,如果是字母或者空格就是一个字节
- 导致乱码的原因
String msg = "我是中国人";
byte[] datas = msg.getBytes();
//正确解码方式
msg =new String(datas,0,datas.length,"UTF8");
//1.字节长度不够
msg = new String(datas,0,datas.length-2,"UTF8");
//2.字节编码格式不对
msg = new String(datas,0,datas.length,"GBK");
抽象类
| 抽象类 | 说明 | 常用方法 |
|---|---|---|
| InputStream | 字节输入流的父类,数据单位为字节 | * int read() * void close() |
| OutputStream | 字节输出流的父类,数据单位为字节 | * void wirte(int) * void flush() *void close() |
| Reader | 字符输入流的父类,数据单位为字符 | * int read() * void close() |
| Writer | 字符输出流的父类,数据单位为字符 | * void wirte(int) * void flush() *void close() |
一切文件都可以处理为字节,但是不是所有的字节都可以处理为字符
处理音频视频只能使用字节流来处理
IO基本操作步骤:
- 创建源
- 选择流
- 操作
- 释放资源
package com.IO;
import java.io.*;
public class operationFlow {
public static void main(String[] args) throws IOException {
//1.创建源
File src = new File("/Users/huangfl/repos/IdeaWorkfroce/BaseGrammer/src/com/abcde.txt");
//2.选择流
InputStream is = new FileInputStream(src);
//3.操作
char data1 =(char)is.read();
char data2 =(char)is.read();
char data3 =(char)is.read();
int data4 = is.read();
System.out.println(data1+"--"+data2+"--"+data3+"--"+data4);
//3.操作
int temp;
while( (temp=is.read)!=1 ){
System.out.println((char)temp);
}
//释放资源
is.close();
}
}
当read()返回结果为-1的时候表示这个已经结束,并且这个元素不在范围内;
文件字节输出流
package com.IO;
import java.io.*;
class OutputDemo{
public static void main(String[] args) throws IOException {
//1.create
//2.select
//3.modify
//4.close
File src = new File("wallen.txt");
OutputStream os = new FileOutputStream(src,true);
//true 表示叠加,false表示重写
String msg = "wallen is textsds";
byte[] datas = msg.getBytes(); //字符==>字节 编码
os.write(datas,0,datas.length);
os.flush(); //reset
os.close();
}
}
通过文件的输入输出流实现文本的复制
package com.IO;
import java.io.*;
public class Copy {
public static void main(String[] args) throws IOException {
//通过文件的输入输出流实现对文本的复制操作
File src = new File("dest.txt"); //源头
File dest = new File("wallen.txt"); //目的地
InputStream is = new FileInputStream(src);
OutputStream os = new FileOutputStream(dest,true);
//modify
byte[] flush = new byte[1024];
int len = -1;
while ((len=is.read(flush))!=-1){
os.write(flush,0,len);
}
os.flush();
os.close();
is.close();
}
}
FileReader && FileWriter
- FileReader 通过字符的方式读取文件,仅仅适合字符文件
- FileWriter: 通过直接的方式写出或者追加到数据中,仅仅适合字符文件
浙公网安备 33010602011771号