-----------------------------------------------个人初学,如有错误,欢迎指正-----------------------------------------------
Java I/O 初学,实例讲解
一、简介:
上篇博文介绍了Java中常用的I/O操作,本篇博文是对上篇的补充,主要列举以下实例,帮助大家更好的理解I/O操作:
1、磁盘操作。包括:
文件夹的创建,删除,重命名等
2、文件读写。
包括:
2.1、txt文档的读取,复制。
2.2、java文件的读取,复制。(字节流)
2.3、图片的读取和复制。(字节流)
二、实例讲解
2.1、磁盘操作实例
/**
* 创建目录
* @param folderpath 待创建的目录路径
*/
private static void FolderCreate(String folderpath){
File folder = new File(folderpath);
boolean IsWork = true;
if(!folder.exists()){
IsWork = folder.mkdirs();
}
if(IsWork)
System.out.println("文件夹已经创建!");
else
System.out.println("文件夹创建失败!");
}
程序运行截图
/**
* 目录重命名
* @param fromDir 原目录路径
* @param toDir 重命名后的目录路径
*/
private static void FolderRename(String fromDir,String toDir){
File from = new File(fromDir);
if(!from.exists()){
System.out.println(fromDir+" 目录不存在!");
}else{
File to = new File(toDir);
if(from.renameTo(to)){
from.delete();//删除原文件
System.out.println("重命名成功!");
}
else
System.out.println("重命名失败!");
}
}
运行结果:
2.2、文件读写实例
2.2.1、txt文档的读取,复制
/**
* 读取并统计文本文件中字符串出现的次数,结果保存至其他文件里
*
* @param FilePath 待统计的文本文件
* @param CopyPath 统计后的结果
* @throws IOException
*/
private static void ReadAndWriteTxtFile(String FilePath,String CopyPath) throws IOException{
File f = new File(FilePath);
if(!f.exists()){
System.out.println(FilePath+" 文件不存在!");
}else{
FileReader fr = new FileReader(f);
BufferedReader br = new BufferedReader(fr);//使用BufferedReader可以高效的读取
HashSet<String> MySet = new HashSet<String>();//存储城市名称(不重复)
ArrayList<String> MyArr = new ArrayList<String>();//存储读取的城市数据
String str;
while((str = br.readLine())!= null){
MyArr.add(str);
MySet.add(str);//每个城市的名称只存储一次
}
fr.close();
HashMap<String,Integer> MyMap = new HashMap<String,Integer>();//使用map记录对应的城市出现的次数
for(String s:MySet){
MyMap.put(s, 0);//初始化
for(String arr:MyArr){
if(s.equals(arr)){//将HashSet中的城市名称与ArrayList里的数据对比
MyMap.put(s, MyMap.get(s)+1);//如果相等,则修改Map中的数据
}
}
}
f = new File(CopyPath);//保存统计结果的文件
if(!f.exists()){//如果不存在则创建新文件
f.createNewFile();
}
FileWriter fw = new FileWriter(f);
BufferedWriter bw = new BufferedWriter(fw);
Iterator it = MyMap.entrySet().iterator();
while(it.hasNext()){//使用迭代器遍历HashMap
Entry entry = (Entry) it.next();
bw.write(entry.getKey()+"("+entry.getValue()+")");
bw.newLine();
}
bw.close();
}
}
执行代码:
ReadAndWriteTxtFile("F://city.txt","F://Test_Rename//copy_city.txt");
2.2.2、 java文档的读取,复制
/**
* 读取指定目录下的java文件,输出结果的同时,将java文件复制到指定目录下
*
* @param FilePath 要读取的java文件
* @param CopyPath 保存读取结果
* @throws IOException
*/
private static void ReadAndWriteJavaFile(String FilePath,String CopyPath) throws IOException{
File f = new File(FilePath);
if(!f.exists()){
System.out.println(FilePath+" 文件不存在!");
}else{
FileInputStream fis = new FileInputStream(f);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] data = new byte[1024];
int IsEnd;
System.out.println(GetFileName(FilePath)+"的内容:");
System.out.print("--------------------");
while((IsEnd = fis.read(data)) != -1){//读取文件
bos.write(data, 0, IsEnd);
System.out.print(new String(data));//打印读取的结果
}
System.out.println("\n--------------------");
fis.close();
File file = new File(CopyPath);
if(!file.exists()){
file.createNewFile();
}
FileOutputStream fos = new FileOutputStream(file);
fos.write(bos.toByteArray(), 0, bos.size());//复制文件
fos.close();
System.out.println(GetFileName(FilePath)+" 文件已经复制!");
}
}
运行结果:
2.2.3、图片的读取和复制
/**
* 读取并复制图片
*
* @param path 原图片所在的路径
* @param copy 复制图片的存储路径
* @throws IOException
*/
private static void CopyImage(String path,String copy) throws IOException{
FileInputStream fis = new FileInputStream(new File(path));//读取原图片
ByteArrayOutputStream byteArr = new ByteArrayOutputStream();
byte[] img = new byte[1024];
int len = 0;
while((len = fis.read(img)) != -1){//每次读取1024字节,直到文件尾
byteArr.write(img, 0,len);//将读入的二进制字节存储
}
fis.close();
File file = new File(copy);
if(!file.exists()){//如果要复制的图片不存在
file.createNewFile();//创建对应图片
}
FileOutputStream fos = new FileOutputStream(file);
fos.write(byteArr.toByteArray(),0,byteArr.size());//将存储的二进制字节写入对应文件
fos.close();
System.out.println(GetFileName(path)+" 已经拷贝!");
}
运行结果:
下面是完整的程序代码:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map.Entry;
/**
* Java I/O实例
*
* @author VisionDo
*
*/
public class FileExample {
public static void main(String[] args) {
FolderCreate("F://Test");//创建目录
FolderRename("F://Test","F://Test_Rename");//目录重命名
try {
//文本文件的读取与复制
ReadAndWriteTxtFile("F://city.txt","F://Test_Rename//copy_city.txt");
//Java文件读取与复制
ReadAndWriteJavaFile("F://test.java","F://Test_Rename//copy_test.java");
//图片读取与复制
CopyImage("F://test.jpg","F://Test_Rename//copy_img.jpg");
FolderDelete("F://Test_Rename");//删除目录
} catch (IOException e) {
System.out.print("出错了!");
}
}
/**
* 创建目录
* @param folderpath 待创建的目录路径
*/
private static void FolderCreate(String folderpath){
File folder = new File(folderpath);
boolean IsWork = true;
if(!folder.exists()){
IsWork = folder.mkdirs();
}
if(IsWork)
System.out.println("文件夹已经创建!");
else
System.out.println("文件夹创建失败!");
}
/**
* 目录重命名
* @param fromDir 原目录路径
* @param toDir 重命名后的目录路径
*/
private static void FolderRename(String fromDir,String toDir){
File from = new File(fromDir);
if(!from.exists()){
System.out.println(fromDir+" 目录不存在!");
}else{
File to = new File(toDir);
if(from.renameTo(to)){
from.delete();//删除原文件
System.out.println("重命名成功!");
}
else
System.out.println("重命名失败!");
}
}
/**
* 删除目录
* 如果目录下有子文件或者子目录,则删除目录里的文件,之后删除目录
* @param folderPath 目录路径
*/
private static void FolderDelete(String folderPath){
File f = new File(folderPath);
boolean IsDelete = false;
if(!f.exists()){//目录不存在
System.out.println("目录:"+GetFileName(folderPath)+"不存在,无法执行删除操作!");
}else{
DeleteFile(folderPath);//先删除目录里的子文件和子目录
f = new File(folderPath);
IsDelete = f.delete();//删除空目录
}
if(IsDelete)
System.out.println("目录:"+GetFileName(folderPath)+"已经删除!");
else
System.out.println("目录:"+GetFileName(folderPath)+"删除操作失败!");
}
private static void DeleteFile(String path){
File f = new File(path);
if(!f.exists()){//目录不存在
System.out.println("目录"+GetFileName(path)+"不存在,无法执行删除操作!");
}else{//先删除目录里的子文件和子目录
String[] fileList = f.list();//得到目录下的文件名称
File file = null;
for(String str:fileList){//遍历目录
str = path+"//"+str;//得到目录下文件或者子目录的绝对路径
file = new File(str);//生成新的文件(文件或者目录)
if(file.isFile()){//如果是文件则直接删除
if(file.delete())
System.out.println("文件:"+GetFileName(str)+" 已经删除!");
else
System.out.println("文件:"+GetFileName(str)+" 删除操作失败!");
}
else{//如果是子目录,则递归遍历
DeleteFile(str);
}
}
}
}
/**
* 读取并统计文本文件中字符串出现的次数,结果保存至其他文件里
*
* @param FilePath 待统计的文本文件
* @param CopyPath 统计后的结果
* @throws IOException
*/
private static void ReadAndWriteTxtFile(String FilePath,String CopyPath) throws IOException{
File f = new File(FilePath);
if(!f.exists()){
System.out.println(FilePath+" 文件不存在!");
}else{
FileReader fr = new FileReader(f);
BufferedReader br = new BufferedReader(fr);//使用BufferedReader可以高效的读取
HashSet<String> MySet = new HashSet<String>();//存储城市名称(不重复)
ArrayList<String> MyArr = new ArrayList<String>();//存储读取的城市数据
String str;
while((str = br.readLine())!= null){
MyArr.add(str);
MySet.add(str);//每个城市的名称只存储一次
}
fr.close();
HashMap<String,Integer> MyMap = new HashMap<String,Integer>();//使用map记录对应的城市出现的次数
for(String s:MySet){
MyMap.put(s, 0);//初始化
for(String arr:MyArr){
if(s.equals(arr)){//将HashSet中的城市名称与ArrayList里的数据对比
MyMap.put(s, MyMap.get(s)+1);//如果相等,则修改Map中的数据
}
}
}
f = new File(CopyPath);//保存统计结果的文件
if(!f.exists()){//如果不存在则创建新文件
f.createNewFile();
}
FileWriter fw = new FileWriter(f);
BufferedWriter bw = new BufferedWriter(fw);
Iterator it = MyMap.entrySet().iterator();
while(it.hasNext()){//使用迭代器遍历HashMap
Entry entry = (Entry) it.next();
bw.write(entry.getKey()+"("+entry.getValue()+")");
bw.newLine();
}
bw.close();
System.out.println(GetFileName(FilePath)+" 文件已经复制!");
}
}
/**
* 读取指定目录下的java文件,输出结果的同时,将java文件复制到指定目录下
*
* @param FilePath 要读取的java文件
* @param CopyPath 保存读取结果
* @throws IOException
*/
private static void ReadAndWriteJavaFile(String FilePath,String CopyPath) throws IOException{
File f = new File(FilePath);
if(!f.exists()){
System.out.println(FilePath+" 文件不存在!");
}else{
FileInputStream fis = new FileInputStream(f);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] data = new byte[1024];
int IsEnd;
System.out.println(GetFileName(FilePath)+"的内容:");
System.out.print("--------------------");
while((IsEnd = fis.read(data)) != -1){//读取文件
bos.write(data, 0, IsEnd);
System.out.print(new String(data));//打印读取的结果
}
System.out.println("\n--------------------");
fis.close();
File file = new File(CopyPath);
if(!file.exists()){
file.createNewFile();
}
FileOutputStream fos = new FileOutputStream(file);
fos.write(bos.toByteArray(), 0, bos.size());//复制文件
fos.close();
System.out.println(GetFileName(FilePath)+" 文件已经复制!");
}
}
/**
* 读取并复制图片
*
* @param path 原图片所在的路径
* @param copy 复制图片的存储路径
* @throws IOException
*/
private static void CopyImage(String path,String copy) throws IOException{
FileInputStream fis = new FileInputStream(new File(path));//读取原图片
ByteArrayOutputStream byteArr = new ByteArrayOutputStream();
byte[] img = new byte[1024];
int len = 0;
while((len = fis.read(img)) != -1){//每次读取1024字节,直到文件尾
byteArr.write(img, 0,len);//将读入的二进制字节存储
}
fis.close();
File file = new File(copy);
if(!file.exists()){//如果要复制的图片不存在
file.createNewFile();//创建对应图片
}
FileOutputStream fos = new FileOutputStream(file);
fos.write(byteArr.toByteArray(),0,byteArr.size());//将存储的二进制字节写入对应文件
fos.close();
System.out.println(GetFileName(path)+" 已经拷贝!");
}
/**
* 得到不包含路径的文件名称
* @param file 文件路径
* @return 文件名
*/
private static String GetFileName(String file){
String[] s = file.split("//");
return s[s.length-1];
}
}
运行结果:
三、小结
通过今天的编程练习,我对I/O的操作有了一定的了解,不过后续还要加强学习。
文件夹的删除操作,目前只能做到删除单级目录,如果文件夹有子文件夹,我还不懂如何去实现删除。网上说递归操作,可是如果二级目录太多,那么递归的效率就太低了。这个疑问留到以后解决吧,也希望大神看到后能指点一二。