java IO技术
核心类(5个)和接口(3个)
- file:文件类
- InputStream:字节输入流
- OutputStream:字节输出流
- Reader:字符输入流
- Writer:字符输出流
- Closeable:关闭流接口
- Flushable:刷新流接口
- Serializable:序列化接口
java中的输入输出,说的是以java的程序为中心的。
输入流:数据源到程序,(InputStream,Reader)
输出流:程序到目的地,(OutputStream,Writer)
节点流:可以直接从数据源或者目的地读写数据。
处理流(包装流):不直接连接到数据源或者目的地,是其他流进行封装,目的是简化操作和提高性能。
节点流和处理流的关系:
1.节点流处于io操作的第一线,所有的操作必须通过他们进行,
2.处理流可以对其他的流进行处理(提高效率或者操作的灵活性)
但是在不同的系统中文件的分隔符是不同的,在File类中提供了统一的分隔符,通过File.separator获得
在java中一般建议使用“/"来分隔
File类常见的一些方法
public class IoStream {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
String path="D:\\Java\\myball\\src\\images\\ground.jpg";//java 中会自动加上转义字符
//但是在不同的系统中文件的分隔符是不同的,在File类中提供了统一的分隔符
//通过File.separator
//1.在java中一般建议使用“/"来分隔
String path1="D:/Java/myball/src/images/ground.jpg";
//2.或者是使用File.separator来拼接。
String path2="D:"+File.separator+"Java"+File.separator+"myball"+File.separator+"src"+File.separator+"images"+File.separator+"ground.jpg";
System.out.println(path);
System.out.println(path1);
System.out.println(path2);
//1.构建File对象
File src=new File(path1);
System.out.println("长度:"+src.length());//图的大小
//2.
File src1=new File("D:/Java/myball/src/images","ground.jpg");
//3.
File src2=new File(new File("D:/Java/myball/src/images"),"ground.jpg");
System.out.println(src1.getAbsolutePath());
System.out.println(System.getProperty("user.dir"));
System.out.println("名称:"+src1.getName());
System.out.println("路径名:"+src1.getPath());//获得创建是的路径名
//如果创建时的是绝对路径,则返回路径,如果是相对路径,则返回相对路径
System.out.println("绝对路径:"+src1.getAbsolutePath());
System.out.println("父名称:"+src1.getParent());//返回该文件的前面的所有文件名
System.out.println("是否存在"+src1.exists());
System.out.println("是否是文件夹"+src1.isDirectory());
System.out.println("是否是文件"+src1.isFile());
src=new File("xxx");
if(!src.exists()) {
System.out.println("文件不存在");
}else {
System.out.println("文件操作");
}
File src3=new File("D:/Java/myball/src/images");//文件夹
System.out.println("文件夹的长度:"+src3.length());//0
//文件夹的长度需要递归计算子孙文件
//createNewFile()表示的是当文件不存在的时候才创建。如果文件创建失败的话,就创建失败。
File src4=new File("D:/Java/myball/src/images/java.txt");
System.out.println(src4.createNewFile());//createNewFile()不存在才创建
//createNewFile()只能创建文件,不创建文件夹。
System.out.println(src4.delete());//删除已经存在的文件。
}
}
java中的目录
创建目录对象:
mkdir:确保上一级目录存在
mkdirs:可以创建父级目录
列出下一级
1.list():列出下一级目录的名称
2.listFile():列出下一级file对象
3.listRoots():列出所有的盘符;
遍历文件测试代码
public class TestDrectory {
public static void main(String[] args) {
// TODO Auto-generated method stub
File dir=new File("D:/Java/myball/src");
String[] fileNames=dir.list();
for(String s:fileNames) {
System.out.println(s);
}
File[] files=dir.listFiles();
for(File s:files) {
System.out.println(s);
}
File[] roots=dir.listRoots();
for(File s:roots) {
System.out.println(s);
}
}
}
利用递归遍历文件夹,
public class TestDrectory {
//利用递归遍历文件夹,
public static void main(String[] args) {
// TODO Auto-generated method stub
File src=new File("D:/Java/myball/src");
printName(src,0);
}
public static void printName(File src,int level) {
for(int i=0;i<level;i++) {
System.out.print(" ");
}
System.out.println(src.getName());
if(src==null||!src.exists()) {//递归头
return;
}else if(src.isDirectory()) {//如果是目录
for(File s:src.listFiles()) {
printName(s,level+1);//递归体。
}
}
}
}
//获取文件夹的大小。
public class TestDrectory {
//获取文件夹的大小。
private static long len=0;
public static void main(String[] args) {
// TODO Auto-generated method stub
File src=new File("D:/Java/myball/src");
count(src);
System.out.println(len);
}
public static void count(File src) {
if(src!=null||src.exists()) {//如果存在
if(src.isFile()) {//计算大小,递归头。
len+=src.length();
}else {//子孙及
for(File s:src.listFiles()) {
count(s);//递归体
}
}
}
}
}
利用面向对象的方法实现文件的大小计算,计算文件夹的个数,文件的个数
public class TestDrectory {
//获取文件夹的大小。
private long len=0;
private int dirCount;
private int fileCount;
private String path;
private File src;
public TestDrectory(String path) {
super();
this.path = path;
this.src =new File(path);
count(src);
}
public void count(File src) {
if(src!=null||src.exists()) {//如果存在
if(src.isFile()) {//计算大小,递归头。
this.fileCount++;
len+=src.length();
}else {//子孙及
this.dirCount++;
for(File s:src.listFiles()) {
count(s);//递归体
}
}
}
}
public long getLen() {
return len;
}
public int getDirCount() {
return dirCount;
}
public int getFileCount() {
return fileCount;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
String path="D:/Java/myball/src";
TestDrectory td=new TestDrectory(path);
System.out.println(td.len);
System.out.println(td.dirCount);
System.out.println(td.fileCount);
}
}
java的字符编码
不同的字符集,在处理时会根据不同的规则,在进行编码和解码时,根据不同的规则进行。
如果在进行解码时,对字符长度的设定不匹配时,或者编码的字符集不匹配时,会出现乱码的现象
public class TestDrectory {
public static void main(String[] args) throws UnsupportedEncodingException {
// TODO Auto-generated method stub
//编码,
String path="姓名";//GBK编码方式,是固定每个字符两个字节
byte[] datas=path.getBytes();
System.out.println(datas.length);
//解码
String path1=new String(datas);
System.out.println(path1);
//会出现乱码。当datas的长度不匹配或者是编码的字符集不匹配时,会出现乱码现象
String path2=new String(datas,1,datas.length-1,"utf8");
System.out.println(path2);
}
}