一、IO介绍
简介:
在java程序中,对数据的输入输出操作以“流”方式进行。
J2SDK提供了各种各样的“流”类,用以获取不同种类的数据;程序中通过标准的方法输入或输出数据。java“流”类一般位于java.io包中。
核心类:
在整个java.io包中,最重要的就是5个类和3个接口。
类 | 说明 |
---|---|
File | 文件类 |
InputStream | 字节输入流 |
OutputStream | 字节输出流 |
Reader | 字符输入流 |
Writer | 字符输出流 |
Closeable | 关闭流接口 |
Flushable | 刷新流接口 |
Serializable | 序列化接口 |
流分类:
- 按方向:
输入流:数据源到程序(InputStream、Reader)
输出流:程序到目的地(OutputStream、Writer) - 按数据:
字节流:按照字节读取数据(InputStream、OutputStream)
字符流:按照字符读取数据(Reader、Writer)
- 按功能
节点流:可以从数据源或目的地读取数据
处理流(包装流):不直接连接到数据源或目的地,是其它流进行包装(简化操作,提高性能)
二、File
(一)
例题:
import java.io.File;
/*
* 名称或路径
* getName():名称
* getPath():看构建的时候 相对或绝对
* getAbsolutePath():始终绝对
* getParent():上一路径,无时返回null
*
* 文件的状态
* 1、不存在
* 2、存在
* 文件:isFile
* 文件夹:isDirectory
*
* length():字节数
*
*/
public class FileDemo03 {
public static void main(String[] args){
File src=new File("D:/JavaDate/Test/Test1/9.jpg");
System.out.println("名称"+src.getName());
System.out.println("路径"+src.getPath());
System.out.println("相对路径"+src.getAbsolutePath());
System.out.println("父路径"+src.getParent());
System.out.println("父对象"+src.getParentFile().getName());
System.out.println("是否存在"+src.exists());
System.out.println("是否文件"+src.isFile());
System.out.println("是否文件夹"+src.isDirectory());
System.out.println("长度"+src.length());
}
}
import java.io.File;
import java.io.IOException;
/*
* 其他信息
* createNewFile();不存在才创建
* delete();删除已经存在的文件
*/
public class FileDemo06 {
public static void main(String[] args) throws IOException{
File src=new File("D:/JavaDate/Test/Test1/io.txt");
boolean flag=src.createNewFile();
System.out.println(flag);
//不是文件夹
src=new File("D:/JavaDate/Test/Test");
flag=src.createNewFile();
System.out.println(flag);
flag=src.delete();
System.out.println(flag);
}
}
(二)
import java.io.File;
/*
* 创建目录
* 1、mkdir():确保上级目录存在,不存在创建失败
* 2、mkdirs():上级目录可以不存在,不存在一同来创建
*
* 列出下一级
* 1、list():列出下级名称
* 2、listFiles():列出下级File对象
* 列出所有的盘符
* listroot()
*
*/
public class DirDemo01 {
public static void main(String[] args){
File dir=new File("D:/JavaDate/Test/Test1/dir/test");
boolean flag=dir.mkdirs();
System.out.println(flag);
File dir=new File("D:/JavaDate/Test/Test1");
//列出下级名称 list
String[] subNames=dir.list();
for(String s:subNames){
System.out.println(s);
}
System.out.println();
//下级对象 listFiles()
File[] subFiles=dir.listFiles();
for(File s:subFiles){
System.out.println(s.getAbsolutePath());
}
System.out.println();
//所有盘符
File[] roots=dir.listRoots();
for(File r:roots){
System.out.println(r.getAbsolutePath());
}
}
}
import java.io.File;
/*
* 递归:方法自己调用自己
* 打印子孙级目录和文件名称
*/
public class DirDemo03 {
public static void main(String[] args){
File src=new File("D:\\JavaDate\\Test\\Test1");
printName(src,0);
}
//打印子孙级目录和文件的名称
public static void printName(File src,int deep){
//控制层次感
for(int i=0;i<deep;i++){
System.out.print("-");
}
//打印名称
System.out.println(src.getName());
if(null==src||!src.exists()){//递归头
return;
}else if(src.isDirectory()){//目录
for(File s:src.listFiles()){
printName(s,deep++);//递归体
}
}
}
}
(三)
文件编码
字符集:java字符使用16位的双字节存储,但是在实际文件存储的数据有各种字符集,需要正确操作,否则就有乱码的发生。
例题:
import java.io.UnsupportedEncodingException;
/*
* 编码:字符串...>字节
*
*/
public class ContentEncode {
public static void main(String[] args) throws UnsupportedEncodingException{
String msg="性命生命使命";
//编码:字节数组
byte[] datas=msg.getBytes();//默认使用工程的字符集
System.out.println(datas.length);
//编码:其它字符集
datas=msg.getBytes("UTF-8");
System.out.println(datas.length);
}
}
import java.io.UnsupportedEncodingException;
/*
* 解码:字节...>字符串
*/
public class ContentDecode {
public static void main(String[] args) throws UnsupportedEncodingException{
String msg="性命生命使命";
//编码:字节数组
byte[] datas=msg.getBytes();//默认使用工程的字符集
//解码:字符串
msg=new String(datas,0,datas.length,"GBK");
System.out.println(msg);
//乱码:
//1)、字节数不够
msg=new String(datas,0,datas.length-1,"GBK");
System.out.println(msg);
//2)、字符集不统一
msg=new String(datas,0,datas.length,"utf8");
System.out.println(msg);
}
}