1.路径书写,File对象构建以及相对路径和绝对路径
package cn.io.java.mhz;
import java.io.File;
import java.io.IOException;
/**
* 名称或路径
* @author MHZ
*
*/
public class FileDemo03 {
/**
*名称分隔符,也可以使用separator
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException
{
String path="C:\\Users\\asus\\eclipse-workspace\\Java-IO\\bg.jpg";
System.out.println(File.separator);
//建议使用以下两种方式来表示路径,File.separator表示名称分隔符 '\' ,推荐使用第一种
// 1 .
path = "C:/Users/asus/eclipse-workspace/Java-IO/bg.jpg";
System.out.println(path);
//2 .常量拼接
// path = "C:"+File.separator+"Users"+File.separator+"asus"+File.separator+"eclipse-workspace"+File.separator+"Java-IO"+File.separator+"bg.jpg";
// System.out.println(path);
//构建File对象 File(String PathName)
File src = new File(path);
System.out.println(src.length());
//构建File对象 File(父亲路径,儿子) File(a,b)只要使得a和b拼出来得到的是原来的路径即可
src = new File("C:/Users/asus/eclipse-workspace/Java-IO/","bg.jpg");
src = new File("C:/Users/asus/","eclipse-workspace/Java-IO/bg.jpg");
System.out.println(src.length());
//相对路径和绝对路径
//存在盘符为绝对路径,没有盘符就是相对路径
File src1 = new File(path); //绝对路径
System.out.println(src1.getAbsolutePath());
File src2 = new File("bg.jpg"); //相对路径
System.out.println(src2.getAbsolutePath());
//构建一个不存在的文件
File src3 = new File("aa/bg.jpg");
System.out.println(src3.getAbsolutePath());
}
}
2.File的相关方法
package cn.io.java.mhz;
import java.io.File;
import java.io.IOException;
/**
* 名称或路径
* getName()
* getPath():如果是相对路径,那么返回相对路径,反之,返回绝对路径
* getAbsolutePath():返回绝对路径
* getParent():返回父路径,不存在返回null
* getParentFile():返回父亲对象
* length():返回文件的字节数,不可以返回文件夹的字节数
* creatNewFile(): 不存在才创建, 不能创建文件夹,只能创建文件,当文件存在的时候会返回false
* delete():不能重复删除,文件存在的时候才删除
* @author MHZ
*
*/
public class MyJavaIODemo001 {
public static void main(String[] args) throws IOException
{
/*基本信息*/
File src = new File("C:/Users/asus/eclipse-workspace/Java-IO/","bg.jpg");
System.out.println(src.getName());
//如果写的是绝对路径,那么返回绝对路径,反之,如果是相对路径,那么返回相对路径
System.out.println(src.getPath());
System.out.println(src.getAbsolutePath());
//如下所示,如果给的是相对路径,那么getpath()返回相对路径
File src1 = new File("bg.jpg");
System.out.println(src1.getPath());
System.out.println(src1.getAbsolutePath());
System.out.println(src.getParent());
System.out.println(src1.getParent());
//返回父对象
System.out.println(src.getParentFile().getName());
/*文件状态*/
//只有在文件存在的前提下进行查询
File src2 = new File("C:/Users/asus/eclipse-workspace/Java-IO/","bg.jpg");
System.out.println(src2.exists());
System.out.println(src2.isFile());
System.out.println(src2.isDirectory());
//完整的文件状态,首先判路径是否存在,然后判断文件和文件夹操作是哪个
File src3 = new File("xxx");
if(!src3.exists())
{
System.out.println("文件不存在");
}
else {
if(src.isFile()) {
System.out.println("文件操作");
}
else {
System.out.println("文件夹操作");
}
}
File src4 = new File("C:/Users/asus/eclipse-workspace/Java-IO/","IO.txt");
boolean flag=src4.createNewFile();
System.out.println(flag);
flag = src4.createNewFile();
System.out.println(flag);
flag = src4.delete();
System.out.println(flag);
flag = src4.delete();
System.out.println(flag);
}
}
3.创建目录 mkdir 及 mkdirs 区别,以及 list 及 listFiles 列出下一级 listRoots列出盘符
package cn.io.java.mhz;
import java.io.File;
/**
* 创建目录
* 1.mkdir: 确保上级目录存在,不存在创建失败
* 2.mkdirs:上级目录可以不存在,不存在一同创建
* 找出下一级
* list():列出下一级名称
* listFiles():列出下级File对象
* listRoots():列出盘符
* @author MHZ
*
*/
public class MyJavaIODemo002 {
public static void main(String[] args)
{
File dir = new File("C:/Users/asus/eclipse-workspace/Java-IO/dir/test");
//创建目录 推荐使用mkdirs
// boolean flag = dir.mkdir();
// System.out.println(flag);
boolean flag = dir.mkdirs();
System.out.println(flag);
File dir1 = new File("C:/Users/asus/eclipse-workspace/Java-IO/dir/test1");
boolean flag1 =dir1.mkdir();
System.out.println(flag1);
//list()
File dir2 = new File("C:/Users/asus/eclipse-workspace/Java-IO/");
String[] subNames = dir2.list();
for(String temp:subNames)
{
System.out.println(temp);
}
//listFiles():下级对象
File[] FileNames = dir2.listFiles();
for(File temp:FileNames)
{
System.out.println(temp.getAbsolutePath());
}
//所有盘符
File[] roots = dir2.listRoots();
for(File R : roots)
{
System.out.println(R.getAbsolutePath());
}
}
}
4.由于使用length无法得到文件夹的相关占用信息,故要通过递归搜索的方式找到所有此文件夹下的文件来计算,并加和。
使用面向对象的方式来书写,把文件夹所需要的信息封装起来,包括子孙级目录的输出及文件个数等等信息
package cn.io.java.mhz;
import java.io.File;
/**
* 统计文件夹的信息 输出文件夹的所有目录
* @author MHZ
*
*/
public class MyJavaIODemo003 {
public static class Dic{
private long len;
private int fileSize;
private int dicSize;
private File url;
public Dic(String src)
{
this.len = 0;
this.fileSize = 0;
this.dicSize = 0;
this.url = new File(src);
}
public Dic()
{
}
//得到文件夹的字节总数
public long getLen() {
return this.len;
}
//得到文件夹中文件的个数
public int getFileSize() {
return this.fileSize;
}
//得到文件夹中文件夹的个数
public int getDicSize() {
return this.dicSize;
}
//递归 依次搜索每一个文件夹和文件
public void dicCount(File url)
{
if(null!=url||url.exists()) {
if(url.isFile()) {
len+=url.length();
this.fileSize++;
}
else {
this.dicSize++;
for(File F:url.listFiles())
{
dicCount(F);
}
}
}
else return;
}
//打印文件夹子孙级目录
public void dicprintName(File url,int deep)
{
for(int i=0;i<deep;i++)
System.out.print("-");
System.out.println(url.getName());
if(null==url||!url.exists()) {
return;
}
else if(url.isDirectory())
{
for(File F:url.listFiles()) {
dicprintName(F,deep+1);
}
}
}
}
public static void main(String[] args)
{
Dic src = new Dic("D:/360"); //静态类只能使用静态类和静态方法
src.dicCount(src.url);
System.out.println(src.getDicSize());
System.out.println(src.getFileSize());
System.out.println(src.len);
src.dicprintName(src.url, 0);
}
}
5.字符的编码与解码
字符串-->字节 : 编码 字节-->字符串:解码 以及出现乱码问题可能出现的原因,可能是长度不足导致的,也可能是编码和解码字符集不统一所造成的
package cn.io.java.mhz;
import java.io.UnsupportedEncodingException;
/**
* 字符串-->字节 : 编码
* 字节-->字符串:解码
* @author MHZ
*
*/
public class MyJavaIODemo004 {
public static void main(String[] args) throws UnsupportedEncodingException
{
String msg = "性命生命使命";
//编码:字节数组
byte[] datas = msg.getBytes();
System.out.println(datas.length); //使用GBK编码 , 一个中文占两个字节,一个英文占一个字节
//编码成其他的字符集
datas = msg.getBytes("UTF-8");
System.out.println(datas.length); //utf-8一个中文占3个字节,一个英文占一个字节
//编码成Unicode
datas = msg.getBytes("Unicode"); //unicode每个字符不论是英文还是中文都是占两个字节
System.out.println(datas.length);
//解码
msg = new String(datas,0,datas.length,"Unicode");
System.out.println(msg);
//乱码问题,主要有两种
//1.字节数不足
msg = new String(datas,0,datas.length-3,"Unicode");
System.out.println(msg);
//2.字符集不匹配
msg = new String(datas,0,datas.length,"UTF-8");
System.out.println(msg);
}
}
6.IO标准步骤:F.创建数据源 S.选取数据流 T.选择操作方式 FO.通知系统释放资源
package cn.io.java.mhz;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
/**
* 体会基本步骤
* 1.选取数据源
* 2.选取数据流
* 3.选择操作方式:读还是写
* 4.通知系统释放资源
* @author MHZ
*
*/
public class MyJavaIODemo005 {
public static void main(String[] args) throws IOException
{/*1.理解基本步骤*/
try {
//1.创建数据源
File src = new File("C:\\Users\\asus\\eclipse-workspace\\Java-IO\\src\\mhz.txt");
//2.选取数据流
InputStream is = new FileInputStream(src); //从文件系统中的文件获取输入字节
//3.选择操作方式
int data1 = is.read(); //第一个数据
int data2 = is.read();
int data3 = is.read();
int data4 = is.read(); //第一个数据
int data5 = is.read();
int data6 = is.read();
System.out.println((char)data1);
System.out.println((char)data2);
System.out.println((char)data3);
System.out.println((char)data4);
System.out.println((char)data5);
System.out.println((char)data6);
//4.通知系统释放资源
is.close();
}catch(FileNotFoundException E) {
System.out.println(E.getMessage());
}
//标准写法
InputStream is1 = null;
/*2.标准化*/
try {
File src1 = new File("C:\\Users\\asus\\eclipse-workspace\\Java-IO\\src\\mhz.txt");
is1 = new FileInputStream(src1);
int temp=is1.read();
while(temp!=-1)
{
System.out.println((char)temp);
temp = is1.read();
}
}catch(FileNotFoundException E)
{
E.printStackTrace();
}catch(IOException E)
{
E.printStackTrace();
}finally {
is1.close();
}
}
}
7.文件字节流,分段读取
package cn.io.java.mhz;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
/**
* 文件字节流
* 分段读取
* @author MHZ
*
*/
public class MyJavaIODemo006 {
public static void main(String[] args)
{
InputStream is =null;
try {
File src = new File("C:\\Users\\asus\\eclipse-workspace\\Java-IO\\src\\mhz.txt");
is = new FileInputStream(src);
//3.操作:分段读取
byte[] flush = new byte[1024];
int len = is.read(flush); //接收长度
while(len!=-1)
{
//字节数组-->字符串 解码
String str = new String(flush,0,len);
System.out.println(str);
len = is.read(flush);
//System.out.println(len);
}
}catch(FileNotFoundException E)
{
E.printStackTrace();
}catch(IOException E)
{
E.printStackTrace();
}finally {
try {
if(null!=is)
is.close();
}catch(IOException E)
{
E.printStackTrace();
}
}
}
}
8.文件字节流,输出到文件,写入操作
package cn.io.java.mhz;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
/**
* 文件字节输出流
* @author MHZ
*
*/
public class MyJavaIODemo007 {
public static void main(String[] args)
{
//1.创建源,不存在将会自动创建
File src = new File("dest.txt");
//2.选择流
OutputStream os =null;
try {
os = new FileOutputStream(src,true);
//3.操作
String msg = "IO is so easy\r\n";
byte[] datas = msg.getBytes(); //编码
os.write(datas,0,datas.length);
os.flush(); //刷新
}catch(FileNotFoundException E)
{
E.printStackTrace();
}catch(IOException E)
{
E.printStackTrace();
}finally {
//4. 释放资源
try {
if(null!=os) {
os.close();
}
}catch(Exception E)
{
E.printStackTrace();
}
}
}
}
9.文件拷贝:读取一段内容,写入一段内容,合二为一 ,使用文件输入流和文件输出流
package cn.io.java.mhz;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* 文件拷贝:读取一段内容,写入一段内容,合二为一
* 使用文件输入流和输出流
* @author MHZ
*
*/
public class MyJavaIODemo008 {
public static void main(String[] args)
{
fileCopy("src\\cn\\io\\java\\mhz\\MyJavaIODemo001.java","codeCopy.txt");
}
//文件拷贝
static void fileCopy(String url1,String url2)
{
InputStream is = null;
OutputStream os =null;
File src = new File(url1);
File src1 = new File(url2);
try {
is = new FileInputStream(src);
os = new FileOutputStream(src1,true);
byte[] str = new byte[1024];
int len = is.read(str);
while(len!=-1)
{
os.write(str);
os.flush();
len = is.read(str);
}
os.flush();
}catch(FileNotFoundException E)
{
E.printStackTrace();
}catch(IOException E)
{
E.printStackTrace();
}finally {
//流分别关闭,先打开的后关闭
try {
if(null!=os)
{
os.close();
}
}catch(IOException E)
{
E.printStackTrace();
}
try {
if(null!=is)
{
is.close();
}
}catch(IOException E)
{
E.printStackTrace();
}
}
}
}
10.文件字符流,字节流适用于处理一些音频,视频,图片之类的文件,但是遇到文本之类的,字节流可能会出现乱码问题,这个时候我们可以采用字符流的方式进行文件的读取,写入,拷贝工作
package cn.io.java.mhz;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
/**
* 文件字节流适用于处理音频,视频以及图片等等,遇到字符流的时候使用字符流可避免乱码问题
* 文件字符流
* 如果使用字节流处理文本的时候,可能由于字符集不统一或者字节数正好不合适的情况产生乱码的问题,这种时候就有必要采用这种字符流的形式来处理这种情况
* @author MHZ
*
*/
public class MyJavaIODemo010 {
public static void main(String[] args)
{
//1.创建源
File src = new File("C:\\Users\\asus\\eclipse-workspace\\Java-IO\\codeCopy.txt");
File src1 = new File("Copy2.txt");
//2.选择流
Reader reader = null;
Writer writer = null;
try {
reader = new FileReader(src);
writer = new FileWriter(src1);
//3.操作
char[] flush = new char[1024]; //缓冲容器
int len = reader.read(flush);
while(len!=-1)
{
writer.write(flush);
writer.flush();
len = reader.read(flush);
}
writer.flush();
}catch(FileNotFoundException E)
{
E.printStackTrace();
}catch(IOException E)
{
E.printStackTrace();
}finally {
try {
if(null!=writer)
{
writer.close();
}
}catch(IOException E)
{
E.printStackTrace();
}
try {
if(null!=reader)
{
reader.close();
}
}catch(IOException E)
{
E.printStackTrace();
}
}
}
}