Java代码审计学习笔记之JAVA基础系列(四、文件系统安全)

0.Java文件系统简介

Java文件系统看起来还挺复杂,W3c上面和文件操作相关的就包括文件介绍、输入流、输出流、阅读器写入器。Java对于文件系统的实现主要包含两种方式:基于阻塞模式的IO的文件系统JDK7+基于NIO.2的文件系统。前者的主要实现代码保存在packagejava.io中,后者保存在java.nio中。和以前的方法一样,最底层都是调用了native方法,也就是用C语言实现的。

1.Java文件读写操作

1.1 FileInputStream/FileOutputStream

1.1.1 FileInputStream读文件

文件读取主要使用的是FileInputStream类,该类创建实例时向构造函数传入文件地址,返回该文件对应的FileInputStream实例。类中的read方法一次可以读入一个或多个字节的内容,当读取到文件结尾时返回-1。具体代码如下:

public class TestProject {
    public static void main(String argvs[]){
        try{
            java.io.FileInputStream myFileInput = new java.io.FileInputStream("c:/windows/temp/1.txt");
            byte byteData;
            while ((byteData = (byte) myFileInput.read()) != -1){//read方法不传参数每次读取一个字节内容,如果读到文件结尾返回-1
                System.out.print((char)byteData);
            }
            myFileInput.close();
        } catch (java.io.FileNotFoundException e){
            System.out.println("File Not Found!");
        } catch (java.io.IOException e) {
            e.printStackTrace();
        }

    }
}

1.1.2 FileOutputStream写文件

写文件调用的FileOutputStream类的write方法。具体代码如下:

public class TestProject {
    public static void main(String argvs[]){
        try{
            java.io.FileOutputStream myFout = new java.io.FileOutputStream("c:/windows/temp/2.txt");//打开文件
            String myWords = "Hello jus4fun!";
            myFout.write(myWords.getBytes());//写入
            myFout.flush();//刷新
            myFout.close();//关闭
        }catch (java.io.FileNotFoundException e){
            System.out.println("File Not Found");
        }catch (java.io.IOException e){
            System.out.println("IOException");
        }

    }
}

1.2 RandomAccessFile随机访问文件

说是随机访问文件,其实就是可以从文件读取以及写入文件。具体实现存放于java.io.RandomAccessFile类中。RandomAccessFile类的一个对象可以进行随机文件访问,可以在文件中的任何位置读取或写入。RandomAccessFile类的对象对文件的操作权限包含以下四种模式:

模式 含义
r 只读模式
rw 读写模式,文件不存在则创建
rws 读写模式,对文件的内容及其元数据的任何修改立即被写入存储设备
rwd 读写模式,对文件内容的任何修改立即写入存储设备

读取写入文件的代码如下:

public class TestProject {
    public void myReadFile(String fileName){
        try {
            java.io.RandomAccessFile myRaf = new java.io.RandomAccessFile(fileName, "r");
            System.out.println(myRaf.readUTF());
            myRaf.close();
        }catch (java.io.FileNotFoundException e){
            System.out.println("File not found!");
        }catch (java.io.IOException e){
            System.out.println(e);
        }
    }
    public void myWriteFile(String fileName,String content){
        try {
            java.io.RandomAccessFile myRaf = new java.io.RandomAccessFile(fileName, "rw");
            myRaf.writeUTF(content);
            myRaf.close();
        }catch (java.io.FileNotFoundException e){
            System.out.println("File not found!");
        }catch (java.io.IOException e){
            System.out.println(e);
        }
    }
    public static void main(String argvs[]){
        String targetFile = "C:/Windows/Temp/test.txt";
        String content = "我带你们打";
        TestProject test = new TestProject();
        test.myWriteFile(targetFile,content);
        test.myReadFile(targetFile);
    }
}

Java IO/NIO多种读写文件方式

1.3 利用nio的FileSystemProvider读写文件

public class TestProject {
    public void myReadFile(String fileName){
        try{
            java.nio.file.Path path = java.nio.file.Paths.get(fileName);
            byte[] bytes = java.nio.file.Files.readAllBytes(path);
            System.out.println(new String(bytes));
        }catch (java.io.IOException e){
            System.out.println(e.getStackTrace());
        }
    }
    public void myWriteFile(String fileName,String content){
        try{
            java.nio.file.Path path = java.nio.file.Paths.get(fileName);
            java.nio.file.Files.write(path, content.getBytes());
        }catch (java.io.IOException e){
            System.out.println(e.getStackTrace());
        }
    }

    public static void main(String argvs[]){
        String targetFile = "C:/Windows/Temp/test.txt";
        String content = "我带你们打";
        TestProject test = new TestProject();
        test.myWriteFile(targetFile,content);
        test.myReadFile(targetFile);
    }
}

参考