前言:在网上找的题,附上自己的解题思路,经过反复测试,代码没有问题,不是最优解,若读者有更好的解法,请在评论区留出。
第一题
package hsy.cool.iotest;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
/**
* Java IO流经典练习题
* -------------------------------------------------
* 题目一:
* 在电脑D盘下创建一个文件为HelloWorld.txt文件,
* 判断他是文件还是目录,
* 再创建一个目录IOTest,
* 之后将HelloWorld.txt移动到IOTest目录下去;
* 之后遍历IOTest这个目录下的文件
* --------------------------------------------------
* 分析:
* 创建一个文件:File的creatNewFile()
* 判断是否为文件 isFile()
* 判断是否为目录 isDirectory()
* 创建目录 mkdirs()
* 移动文件 renameTo()
* 遍历目录下文件 listFiles()方法获得存放文件的数组,foreach遍历
* 采用Lamada表达式(java8之后支持)
* @author 爱猫狗的小郝_河南济源追梦孩
*/
public class Test1IO {
public static void main(String[] args) {
//在电脑D盘下创建一个文件为HelloWorld.txt文件
File file=new File("d:/HelloWorld.txt");
//题目没有明确表达文件原本是否存在,故我们必须得考虑
try {
if(file.createNewFile()){
System.out.println("创建文件成功");
}else{
System.out.println("创建文件失败,文件已经存在,请勿重复创建");
}
} catch (IOException ex) {
ex.printStackTrace();
}
//判断他是文件还是目录
if(file.isFile()){
System.out.println("它是文件");
}
if(file.isDirectory()){
System.out.println("它是目录");
}
//再创建一个目录IOTest
File file2=new File("d:/IOTest");
file2.mkdirs();
//之后将HelloWorld.txt移动到IOTest目录下去
//这里分析一下:renameTo方法 file.renameTo(File file)
//需要一个File类型的参数,这道题来说,移动的结果:
//d:/TOTest/HelloWorld.txt 会出现这个结果,因此我们需要拿到HelloWorld.txt
//千万不要去手动输入HelloWorld.txt,这道题我们知道是这个名字,如果换到题,我们只
//知道要移动文件的位置和目标位置,手动输入岂不是懵逼了。(啰嗦一点)
File file3=new File(file2.getPath()+"/"+file.getName());
if(file.renameTo(file3)){
System.out.println("移动成功");
}else{
System.out.println("移动失败");
}
//之后遍历IOTest这个目录下的文件
//下面的方法只是用一下java8支持的Lamada表达式
File[] fileArray=file2.listFiles();
List<File> asList = Arrays.asList(fileArray);
asList.forEach(a->{
System.out.println("文件路径:"+a.getPath());
});
}
}
第二题
package hsy.cool.iotest;
import java.io.File;
import java.util.List;
/**
* Java IO流经典练习题
* -------------------------------------------------
* 题目二:
* 递归实现输入任意目录,列出文件以及文件夹
* --------------------------------------------------
* 分析(此分析建议看完代码再回头来看)
* 我们为此题目造一个工具类用来完成这个题目的问题
* (当然你也可以不造工具类,全部写在一个类中,不过还是造一个工具类吧)
* 不然你看着一个类那么多代码,不好维护也显得不专业。
* 此题重点是递归,故在这分析也道不出所以然,在代码中的注释中好好理解吧!
* @author 爱猫狗的小郝_河南济源追梦孩
*/
public class Test2IO {
public static void main(String[] args) {
List<File>listsList= FileUtils.getAllFiles("f:/acm");
listsList.forEach(a->{
System.out.println(a);
});
}
}
package hsy.cool.iotest;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
* 工具类:获取目录下所有文件夹内的所有文件
*
* @author 爱猫狗的小郝_河南济源追梦孩
*/
public class FileUtils {
//获取文件夹下所有的文件
public static List getAllFiles(String filepath) {
//创建一个集合存放遍历到的file
List<File> files = new ArrayList();
File file = new File(filepath);
//filepath要正确即文件夹必须存在且是文件夹,
//要不然就谈何不上获取目录下所有文件夹内的所有文件
if (file.exists() && file.isDirectory()) {
//在这用到递归
Result(file, files);
} else {
System.out.println("输入路径有问题!");
}
return files;
}
//递归
private static void Result(File file, List files) {
//把文件夹的所有文件(包括文件名)放在一个数组中
//此方法在上面第一题用到了,可以对比看一看
File[] fileArr = file.listFiles();
//如果文件夹有内容,遍历里面所有文件(包括文件夹和文件),都添加到集合里面
for (File file2 : fileArr) {
//如果只是想要里面的文件或者文件夹或者某些固定格式的文件可以判断下再添加
files.add(file2);
//添加到集合后,在来判断是否是文件夹,再遍历里面的所有文件
if (file2.isDirectory()) {
//递归
Result(file2, files);
}
}
}
}
第三题
package hsy.cool.iotest;
import java.io.File;
import java.util.List;
/**
* Java IO流经典练习题
* -------------------------------------------------
* 题目三:
* 递归实现列出当前工程下所有.java文件
* --------------------------------------------------
* 分析:
* 题目二是遍历所有文件,此题目是遍历.java文件
* 易得,只要我们筛选一下条件就行
* 可以对工具类进行修改(加入list集合的时候筛选一下)
* 也可以在main方法中进行筛选
* 这里我们对main方法中进行修改,不修改工具类了。
* @author 爱猫狗的小郝_河南济源追梦孩
*/
public class Test3IO {
public static void main(String[] args) {
List<File>files= FileUtils.getAllFiles(".");
files.forEach(a->{
if( a.toString().endsWith(".java")){
System.out.println(a);}
});
}
}
第四题
package hsy.cool.iotest;
import java.io.File;
import java.io.FileInputStream;
/**
* Java IO流经典练习题
* -------------------------------------------------
* 题目四:
* 从磁盘读取一个文件到内存中,再打印到控制台
* --------------------------------------------------
* 分析:
* 读取文件:FileinputStream read()方法
* 存入StringBuffer
* 控制台打印
* @author 爱猫狗的小郝_河南济源追梦孩
*/
public class Test4IO {
public static void main(String[] args) {
File file=new File("f:/csdn/a.txt");
//java7可以对实现了Closable接口的类使用try catch resource
//不需要手动close()了
//创建输入流
try(FileInputStream in=new FileInputStream(file);) {
int len=0;
byte[]bytes=new byte[1024];
StringBuffer sb=new StringBuffer();
while ((len= in.read(bytes))!=-1){
//读取数据存入StringBuffer
sb.append(new String(bytes,0,len));
}
//控制台打印
System.out.println(sb);
} catch (Exception e) {
e.printStackTrace();
}
}
}
第五题
package hsy.cool.iotest;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
/**
* Java IO流经典练习题
* -------------------------------------------------
* 题目五:
* 拷贝一张图片,从一个目录到另外一个目录下(PS:是拷贝是不是移动)
* --------------------------------------------------
* 分析: 题目强调了是拷贝不是移动
* 也就是说不允许我们使用 renameTo(File file)方法
* 其它的没什么分析的,看下代码注释就行
* @author 爱猫狗的小郝_河南济源追梦孩
*/
public class Test5IO {
public static void main(String[] args) {
//源文件
File fileOld = new File("d:/haosy.jpg");
//目标文件
File fileNew = new File("d:/dxy/dxy.jpg");
//题目的意思可以确定源文件是存在的,而目标文件不确定
//因此我们需要判断一下目标文件是否存在,若不存在需要创建一下
try {
if (!fileNew.exists()) {
//目标文件不存在。创建
fileNew.createNewFile();
}
//创建输入输出流对象
FileInputStream in = new FileInputStream(fileOld);
FileOutputStream out = new FileOutputStream(fileNew);
int len = 0;
byte[] bytes = new byte[1024];
//读取
while ((len = in.read(bytes)) != -1) {
//写
out.write(bytes, 0, len);
}
//刷新流
out.flush();
out.close();
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
第六题
package hsy.cool.iotest;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
/**
* Java IO流经典练习题
* -------------------------------------------------
* 题目六:
* 统计一个文件haosy.txt(自己造一个文件夹吧)中字母'H'和'h'出现的总次数
* --------------------------------------------------
* 分析:
* 可以看到统计的是字母'H'和'h'出现的总次数,一个字母就是一个字节,因此
* 可以使用字节流对象 FileInputStream
* @author 爱猫狗的小郝_河南济源追梦孩
*/
public class Test6IO {
public static void main(String[] args) {
File file=null;
FileInputStream in=null;
try {
file=new File("f:/csdn/haosy.txt");
in=new FileInputStream(file);
byte[]bytes=new byte[(int)file.length()];
in.read(bytes);
int num=0;
for(int i=0;i<bytes.length;i++){
if((char)bytes[i]=='H'|| (char)bytes[i]=='h'){
num++;
}
}
System.out.println("H和h一共有"+num+"个");
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
in.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
第七题
package hsy.cool.iotest;
import java.io.File;
import java.io.FileInputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
/**
* Java IO流经典练习题
* -------------------------------------------------
* 题目七:
* 统计一个文件file.txt中各个字母出现次数:
* txt文本中内容为:A(4),B(8),C(12),a(6),b(2),c(8)
* 解释:A(4),B(8),C(12),a(6),b(2),c(8)括号内代表字符出现次数;
* --------------------------------------------------
* 分析:
* 输入流:FileInputStream
* int c=read(); char cc=(char)c; 每次拿到的字母
* HashMap:这个题很明显就想到采用key-value键值对来保存数据
* 因key,不能保存相同的主键值
* 假设map为HashMap的一个对象,用到下面方法
* value=map.get(key) 拿到当前键对应的值
* map.put(key,value) 存入信息
* @author 爱猫狗的小郝_河南济源追梦孩
*/
public class Test7IO {
public static void main(String[] args) {
File file=null;
FileInputStream in=null;
try {
file=new File("f:/csdn/e.txt");
in=new FileInputStream(file);
//创建集合HashMap类存放要保存的key-value
HashMap map=new HashMap<>();
//读
//每次读取的文件长度
int len=0;
//计数器,统计字符出现的次数
int count=0;
while((len=in.read())!=-1){
//每次拿到的字母
char c=(char)len;
try {
count=(int)map.get(c);
} catch (Exception e) {
}
map.put(c, count+1);
}
in.close();
//读完,打印结果,此处给出HashMap打印的三种常用方法
//----------方法一:直接打印---------------------
System.out.println(map);
//方法二:map.keySet();
Set keySet = map.keySet();
for(Object key:keySet){
System.out.println(key+"="+map.get(key));
}
//方法三:迭代器的使用
Iterator iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Entry entry = (Entry) iterator.next();
System.out.println(entry.getKey() + "{" + entry.getValue()+ "} \t");
}
//方法三:不想使用迭代器,就使用简化的方法三
Set<Map.Entry> entrySet = map.entrySet();
for(Map.Entry entry:entrySet){
System.out.println(entry.getKey()+"="+entry.getValue());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
第八题
package hsy.cool.iotest;
import java.io.File;
import java.io.FileReader;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
/**
* Java IO流经典练习题
* -------------------------------------------------
* 题目八:
* 统计一个文件file.txt中各个字母出现次数:
* txt文本中内容为:A(4),B(8),C(12),a(6),b(2),济(8),源(8)
* --------------------------------------------------
* 分析:
* 可以看到这个题和上面第七题唯一的区别就是文本中有了中文,
* 那么,很简单,第七题使用的是字节流,这道题我们使用字符流就行
* 其它分析同第七题
* @author 爱猫狗的小郝_河南济源追梦孩
*/
public class Test8IO {
public static void main(String[] args) {
File file=null;
FileReader in=null;
try {
file=new File("f:/csdn/e.txt");
in=new FileReader(file);
//创建集合HashMap类存放要保存的key-value
HashMap map=new HashMap<>();
//读
//每次读取的文件长度
int len=0;
//计数器,统计字符出现的次数
int count=0;
while((len=in.read())!=-1){
//每次拿到的字母
char c=(char)len;
try {
count=(int)map.get(c);
} catch (Exception e) {
}
map.put(c, count+1);
}
in.close();
//读完,打印结果,此处给出HashMap打印的三种常用方法
//----------方法一:直接打印---------------------
System.out.println(map);
//方法二:map.keySet();
Set keySet = map.keySet();
for(Object key:keySet){
System.out.println(key+"="+map.get(key));
}
//方法三:迭代器的使用
Iterator iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Entry entry = (Entry) iterator.next();
System.out.println(entry.getKey() + "{" + entry.getValue()+ "} \t");
}
//方法三:不想使用迭代器,就使用简化的方法三
Set<Map.Entry> entrySet = map.entrySet();
for(Map.Entry entry:entrySet){
System.out.println(entry.getKey()+"="+entry.getValue());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
第九题
package hsy.cool.iotest;
import java.io.File;
import java.io.RandomAccessFile;
import java.nio.charset.Charset;
/**
* Java IO流经典练习题
* --------------------------------------------------------------------
* 题目九:
* 使用随机文件流类RandomAccessFile将一个文本文件倒置读出。
* ---------------------------------------------------------------------
* 分析:
* 随机读写文件 使用 RandomAccessFile
* 主要是通过 seek() 方法实现指针偏移(光标移动)。
* 第一步先读取文件长度length,使用seek()方法将光标移动最文件最后
* 然后length-- 这里需要注意一下
* 当前位置是字母和数字的话为一个字节 length倒退1就行
* 当前位置是汉字的话为两个字节 length倒退2才可
* 因为还要读取,结果肯定为字符串,考虑到字符串为变长,故使用StringBuffer
* @author 爱猫狗的小郝_河南济源追梦孩
*/
public class Test9IO {
public static void main(String[] args) {
//准备工作,创建所需要的对象
File file=new File("f:/csdn/e.txt");
try {
RandomAccessFile rd=new RandomAccessFile(file, "r");
StringBuffer strbuf=new StringBuffer();
//获得文件的长度
long length= rd.length();
while(length>0){
//长度大与0,说明文件有内容,将光标移动到末尾
length--;
rd.seek(length);
int c = (char)rd.readByte();
//通过ASCII来判断是否为汉字 0-255非汉字
if(c>=0&&c<=255){
strbuf.append((char)c);
}else{
//为汉字,首先光标要移动2个位置,因此需要再--
length--;
rd.seek(length);
//其次,汉字 不能直接append(),需要想办法解决一下
byte[]bytes=new byte[2];
rd.readFully(bytes);
strbuf.append(new String(bytes,0,2,Charset.forName("GBK")));
}
}
System.out.println(strbuf.toString());
rd.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}