IO流

1、File类常用操作
2、获取目录下所有文件和文件夹
3、获取当前目录下所有.java文件
4、从磁盘读取一个文件到内存,然后打印在控制台上
5、写一个“HelloWorld”到文件系统中
6、拷贝一张图片到另外一个目录
7、读取一个文件,统计A和a分别出现了多少次
8、统计一个文件中各个字母出现次数
9、使用随机文件流类RandomAccessFile将一个文本文件倒置读出。

 1、File类常用操作

package Demo;

import java.io.File;
import java.io.IOException;

/**
 * Created by xuming on 2018/4/10.
 * 1. 在电脑D盘下创建一个文件为HelloWorld.txt文件,
 * 判断他是文件还是目录,再创建一个目录IOTest,
 * 之后将HelloWorld.txt移动到IOTest目录下去;
 * 之后遍历IOTest这个目录下的文件
 *
 * 程序分析:
 * 1、文件创建使用File的createNewFile()方法
 * 2、判断是文件用isFile(),判断是目录用isDirectory
 * 3、创建目录用:mkdirs()方法
 * 4、移动文件用:renameTo
 * 5、遍历目录用:list()方法获得存放文件的数组,foreach遍历的方法把文件打印出来
 */
public class Demo1 {
    public static void main(String[]args) throws IOException {
        //创建文件
        File file = new File("D:","HelloWorld.txt");
        boolean isFile = file.createNewFile();
        if(isFile == true){
            System.out.println("创建成功");
        }else{
            System.out.println("已存在");
        }

        //判断是文件还是目录
        if(file.isDirectory()){
            System.out.println("是目录");
        }else if(file.isFile()){
            System.out.println("是文件");
        }

        //创建一个目录
        File fileDir = new File("D:" + File.separator + "HelloDir");
        boolean mkdirBoolean = fileDir.mkdir();
        if(mkdirBoolean == true){
            System.out.println("创建成功");
        }else{
            System.out.println("覆盖成功");
        }

        //将文件移动到目录下
        boolean renameBoolean = file.renameTo(new File(fileDir.getPath() + File.separator + file.getName()));
        if(renameBoolean == true){
            System.out.println("rename成功");
        }else{
            System.out.println("覆盖成功");
        }
    }
}

2、获取目录下所有文件和文件夹

package Demo;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
 * Created by xuming on 2018/4/10.
 * 这是一个获取目录下所有文件夹内的所有文件的封装类,当然前提是你要传进来一个正确路径的文件夹
 */
public class FileUtils {
    public static List getAllFiles(String dir){
        List<File> files = new ArrayList<File>();
        File file = new File(dir);
        if(file.exists() && file.isDirectory()){
            //获取目录下所有文件及文件夹。
            readFileAndDir(file , files);
        }
        return files;
    }

    //递归获取文件和文件夹。
    private static void readFileAndDir(File file, List<File> files) {
        File[] fileArr = file.listFiles();  //file下的所有目录和文件。
        if(fileArr ==null){
            return;
        }else{
            for(File fileTemp : fileArr){
                files.add(fileTemp);
                if(fileTemp.isDirectory()){
                    readFileAndDir(fileTemp , files);
                }
            }
        }
    }

    public static void main(String [] args){
        List<File> files =  FileUtils.getAllFiles("D:");
        files.forEach(file -> {
            System.out.println(file.getParent()+"	"+file.getName());
        });
    }
}

 3、获取当前文件夹下的所有.java文件

package com.vtstar.sct.desktop.clients.FeedingLine21.swingUI.Demo;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
 * Created by xuming on 2018/4/10.
 * 递归实现列出当前工程下所有.java文件
 */
public class Demo3 {
    public static List getAllFiles(String dir){
        List<File> files = new ArrayList<File>();
        File file = new File(dir);
        if(file.exists() && file.isDirectory()){
            //获取目录下所有文件及文件夹。
            readFileAndDir(file , files);
        }
        return files;
    }

    //递归获取文件和文件夹。
    private static void readFileAndDir(File file, List<File> files) {
        File[] fileArr = file.listFiles();  //file下的所有目录和文件。
        if(fileArr ==null){
            return;
        }else{
            for(File fileTemp : fileArr){
                files.add(fileTemp);
                if(fileTemp.isDirectory()){
                    readFileAndDir(fileTemp , files);
                }
            }
        }
    }

    public static void main(String [] args){
        List<File> files = getAllFiles(".");   //.代表当前目录
        for(File file : files){
            if(file.getName().endsWith(".java")){
                System.out.println(file.getName());
            }
        }
    }
}

 4、从磁盘读取一个文件,然后答应到控制台上

package Demo;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
/**
 * Created by xuming on 2018/4/10.
 * 从磁盘读取一个文件到内存中,再打印到控制台
 *
 *程序设计:
 * 1、读取文件用到FileinputSteam
 * 2、把读取的内容不断加入到StringBuffer,
 * 3、再把StringBuffer打印出来就可以
 */
public class Demo4 {
    public static void main(String [] args){
        File file = new File("D:HelloWorld.txt");
        if(!file.isFile()){
            System.out.println("这不是个文件");
        }
        FileInputStream fileInputStream = null;
        int len = 0;
        StringBuilder stringBuilder = new StringBuilder();
        byte[] data = new byte[1024];
        try {
            fileInputStream = new FileInputStream(file);
            while ((len =fileInputStream.read(data)) != -1){
                stringBuilder.append(new String(data,0,len));
            }
            fileInputStream.close();
        }catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(stringBuilder.toString());
    }
}  

 5、写一个HelloWorld到文件系统中

package com.vtstar.sct.desktop.clients.FeedingLine21.swingUI.Demo;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
/**
 *在程序中写一个"HelloJavaWorld你好世界"输出到操作系统文件Hello.txt文件中。
 *
 * 程序分析:文件写入,要用到输出流FileOutputStream
 */
public class Demo5 {
    public static void main(String [] args) throws IOException {
        String date = "HelloJavaWrrld";
        File file = new File("D:/hello.txt");
        try {
//          file.createNewFile();
            FileOutputStream fileOutputStream = fileOutputStream = new FileOutputStream(file);
            fileOutputStream.write(date.getBytes());
            fileOutputStream.flush();
            fileOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 6、拷贝一张图片到另外一个目录

package Demo;

import java.io.*;
/**
 * 拷贝一张图片,从一个目录到另外一个目录下(PS:是拷贝是不是移动)
 *
 * 程序设计思路:
 *  这题不能使用renameTo,
 *  解题步骤:
 * 1、在目的地址创建一个图片文件
 * 2、读取源地址文件的字节流
 * 3、把读取到的字节流写入到目的地址的文件里面
 * 4、刷新输出流,并关闭就可以了
 * */
public class Demo6 {
    public static void main(String [] args) throws IOException {
        File fileSource = new File("D:/test.jpg");
        File fileTarget = new File("F:/test.jpg");

        FileInputStream fileInputStream = null;
        FileOutputStream fileOutputStream = null;
        try {
            fileInputStream = new FileInputStream(fileSource);
            fileOutputStream = new FileOutputStream(fileTarget);
            int len = 0;
            byte[] date = new byte[1024];
            while ((len = fileInputStream.read(date)) != -1){
                fileOutputStream.write(date,0,len);
            }
            fileOutputStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            fileInputStream.close();
            fileOutputStream.close();
        }
    }
}

 7、读取一个文件,判断A和a各出现了多少次

package Demo;

import java.io.*;
/**
 * 统计一个文件calcCharNum.txt(见附件)中字母'A'和'a'出现的总次数
 *
 * 程序分析:
 * 读取文件用FileInputStream
 * 一次只读一个字节(一个字母就是一个字节),当字节内容和A或a相等时,相应的数量加1
 * */
public class Demo7 {
    public static void main(String [] args) throws IOException {
        int aNum = 0;
        int ANum = 0;
        File file = new File("D:/test.txt");
        FileInputStream fileInputStream = new FileInputStream(file);
        byte[] date = new byte[1];
        while ((fileInputStream.read(date)) != -1){
            if(date[0] == 'A'){
                ANum ++;
            }else if(date[0] == 'a'){
                aNum ++;
            }
        }
        fileInputStream.close();
        System.out.println("A出现的次数:"+ANum+"
"+"a出现的次数为:"+aNum);
    }
}

 8、统计一个文件中各个字母出现的次数

 

package Demo;

import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * 统计一个文件中各个字母出现次数:
 * A(8),B(16),C(10)...,a(12),b(10),c(3)....,括号内代表字符出现次数;
 * */
public class Demo8 {
    public static void main(String [] args) throws IOException {
        File file = new File("D:/test.txt");
        FileInputStream fileInputStream = new FileInputStream(file);
        HashMap<Byte,Integer> hashMap = new HashMap<>();
        byte[] date = new byte[1];
        while((fileInputStream.read(date)) != -1){
            byte nowByte = date[0];
            if(hashMap.containsKey(nowByte)){
                hashMap.put(nowByte,hashMap.get(nowByte)+1);
            }else{
                hashMap.put(nowByte,1);
            }
        }
        fileInputStream.close();
        Set<Map.Entry<Byte,Integer>> entrySet = hashMap.entrySet();
        entrySet.forEach(entry->{
            System.out.println(test15(entry.getKey())+"("+entry.getValue()+")");
        });
    }
    /**
     * Byte97变String
     * @param a
     * @return
     */
    public static String test15(byte a) {
        String returnStr = null;
        for (byte i = 0; i < 26; i++) {
            if ((65 + i) == a) {
                returnStr =  (char) (65 + i)+"";
            }
            if ((97 + i) == a) {
                returnStr =  (char) (97 + i)+"";
            }
        }
        return returnStr;
    }
}

 

9、使用随机文件流RandomAccessFile将一个文本倒置读出

package Demo;
import java.io.*;
/**
 *使用随机文件流类RandomAccessFile将一个文本文件倒置读出。
 *
 * 程序分析:
 *  RandomAccessFile的seek方法能把读取文件的光标移动到具体的位置
 * 但是还是有地点值得注意的是一个字母或数字是占用一个字节的, 一个汉字是占用两个字节的
 */
public class Demo9 {
    public static void main(String [] args) throws IOException {
        File file = new File("D:/test.txt");
        try {
            RandomAccessFile raf = new RandomAccessFile(file, "r");
            long length = raf.length();     //文本有多长
            StringBuffer sb = new StringBuffer();
            while (length > 0) {
                length--;
                raf.seek(length);
                int c = (char) raf.readByte();
                // 如果asc码<=255,>=0,则判断是个英文字符,添加到字符串中。
                if (c >= 0 && c <= 255) {
                    sb.append((char) c);
                } else {
                    // 如果不在asc码范围内,则判断是个汉字字符
                    // 汉字字符是占2个字节的,所以length再退一个字节
                    length--;
                    raf.seek(length);
                    byte[] cc = new byte[2];
                    // cc被复制为文件中连续的两个字节
                    raf.readFully(cc);
                    sb.append(new String(cc));
                }
            }
            System.out.println(sb);
            raf.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
原文地址:https://www.cnblogs.com/Xmingzi/p/8777077.html