java的I/O学习

 

 

File 类

// 定义:
public class File extends Object implements Serializable, Comparable<File>

//构造方法:
public File(URI uri)
public File(File parent,String child)
public File(String parent,String child)
public File(String pathname)

//常用方法:
public boolean createNewFile() throws IOException
public boolean delete()
public boolean exists()
public boolean isDirectory()
public boolean isFile()
public long lastModified()
public long length()
public String[] list()
public File[] listFiles()
public boolean mkdirs()
public File getParentFile()

代码如下:

public class FileDemo {
    public void deleteFile(String filePath){
        File file = new File(filePath);
        if (file.exists()) { 								// 判断文件是否存在
            boolean b = file.delete();								// 删除文件
            System.out.println(" result :" + b);
        } else { 									// 文件不存在
            try {
                System.out.println(file.createNewFile());			// 创建新文件
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public void createFile(String filePath){
        File file = new File(filePath);
        if (!file.getParentFile().exists()) { 					// 现在父路径不存在
            file.getParentFile().mkdirs(); 				// 创建父路径
        }
        try {
            System.out.println(file.createNewFile());			// 创建新文件
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void getInformation(String filePath){
        File file = new File(filePath);
        if (file.exists()) {
            System.out.println("是否是文件:" + (file.isFile()));
            System.out.println("是否是目录:" + (file.isDirectory()));
            // 文件大小是按照字节单位返回的数字,所以需要将字节单元转换为兆(M)的单元
            // 但是考虑到小数点问题,所以使用BigDecimal处理
            System.out.println("文件大小:"
                    + (new BigDecimal((double) file.length() / 1024 / 1024)
                    .divide(new BigDecimal(1), 2,
                            BigDecimal.ROUND_HALF_UP)) + "M");
            // 返回的日期是以long的形式返回,可以利用SimpleDateFormat进行格式化操作
            System.out.println("上次修改时间:"
                    + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
                    .format(new Date(file.lastModified())));
        }
    }

    public void printDir(String dirPath){
        File file = new File(dirPath);
        if (file.isDirectory()) { 						// 判断当前路径是否为目录
            File result [] = file.listFiles() ;
            for (int x = 0; x < result.length; x++) {
                System.out.println(result[x]);			// 调用toString()
            }
        }
    }
    
    public void printR(File file) {
        if (file.isDirectory()) { 						// 路径为目录
            File result[] = file.listFiles(); 			// 列出子目录
            if (result != null) { 						// 目录可以列出
                for (int x = 0; x < result.length; x++) {
                    printR(result[x]); 					// 递归调用
                }
            }
        }
        System.out.println(file);						// 直接输出完整路径
    }


    public static void main(String[] args) {
        String filePath = "d:" + File.separator  + "19_develop_tool" + File.separator + "test.txt" ;  // 设置文件的路径
        FileDemo fileDemo = new FileDemo();
//        fileDemo.createFile(filePath);
//        fileDemo.deleteFile(filePath);
//        fileDemo.getInformation(filePath);
//        fileDemo.printDir("d:" + File.separator);
        fileDemo.printR(new File("d:" + File.separator + "03_机器学习" + File.separator));
    }
}

 

 

字符流与字节流的区别

在 java.io包中流分为两种:字节流 与 字符流
       字节流:InputStream OutputStream   --字节:byte
       字符流:Reader Writer              --字符:char 

字节流和字符流:(1)File类不支持文件内容处理,如果要处理文件内容那么必须通过流的操作模式来完成。(2)字节流:InputStream、outputStream,字节流是原生操作,在进行网络数据传输、磁盘数据保存时支持的数据类型是字节。(3)字符流:Reader、Writer,字符流是经过处理后的操作,字符更适合处理中文。(4)优先使用字节流,只有在处理中文的时候才会使用字符流。
 

不管是字节流还是字符流,其基本操作流程:
(1)要根据文件的路径创建File类对象;
(2)根据字节流或字符流的子类实例化父类对象;
(3)进行数据的读取,写入操作;
(4)关闭流(close)。

字节流

字节输出流:OutputStream   (写入)

定义: public abstract class OutputStream extends Object implements Closeable, Flushable

字节输入流: InputStream   (读取)

定义: public abstract class InputStream extends Object implements Closeable

public class ByteStreamDemo {
    public void outputStream(String filePath) throws IOException {
        File file = new File(filePath);                     // 1. 根据文件的路径创建File对象

        if (!file.getParentFile().exists()) {              // 如果文件目录不存在,就创建目录
            file.getParentFile().mkdirs();
        }

        OutputStream output = new FileOutputStream(file);   // 2.应该使用OutputStream和其子类进行对象的实例化
        // 字节输出流需要使用byte类型,需要将String类对象变为字节数组
        String str = "今天天气不错,晚上咱们去吃火锅吧!";
        byte data[] = str.getBytes(); 						// 将字符串变为字节数组
        output.write(data);                                 // 3.输出内容
        output.close();                                     // 4. 关闭流
    }

    public void inputStream(String filePath) throws IOException {
        File file = new File(filePath);                     // 1. 根据文件的路径创建File对象

        if (!file.getParentFile().exists()) {            // 如果文件目录不存在,就创建目录
            file.getParentFile().mkdirs();
        }

        InputStream input = new FileInputStream(file);     // 2.应该使用InputStream和其子类进行对象的实例化

        byte data[] = new byte[1024];
        int len = input.read(data);                        // 3.输出内容
        // 读出来的是字节流(byte类型),需要将byte转换成String
        System.out.println("读取的内容:" + new String(data, 0, len));
        input.close();                                     // 4. 关闭流
    }

    public static void main(String[] args) {
        String filePath = "d:" + File.separator  + "19_develop_tool" + File.separator + "test.txt" ;  // 设置文件的路径
        ByteStreamDemo byteStreamDemo = new ByteStreamDemo();
        try {
 //           byteStreamDemo.outputStream(filePath);
            byteStreamDemo.inputStream(filePath);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

字符流

字符输出流:Writer

public abstract class Writer extends Object implements Appendable, Closeable, Flushable

字符输入流:Reader

public abstract class Reader extends Object implements Readable, Closeable

public class CharStreamDemo {
    public void writerStream(String filePath) throws IOException {
        File file = new File(filePath);                   // 1. 根据文件的路径创建File对象

        if (!file.getParentFile().exists()) { 			  // 如果文件目录不存在,就创建目录
            file.getParentFile().mkdirs();
        }

        Writer out = new FileWriter(file);               // 2.应该使用OutputStream和其子类进行对象的实例化
        // 字节输出流需要使用byte类型,需要将String类对象变为字节数组
        String str = "今天天气不错,晚上咱们去吃小龙虾吧!";
        out.write(str);                                  // 3.输出内容
        out.close();                                     // 4. 关闭流
    }

    public void readerStream(String filePath) throws IOException {
        File file = new File(filePath);                     // 1. 根据文件的路径创建File对象

        if (!file.getParentFile().exists()) { 		// 如果文件目录不存在,就创建目录
            file.getParentFile().mkdirs();
        }

        Reader in = new FileReader(file);                 // 2.应该使用InputStream和其子类进行对象的实例化

        char data[] = new char[1024];
        int len = in.read(data);                         // 3.输出内容
        // 读出来的是字节流(byte类型),需要将byte转换成String
        System.out.println("读取的内容:" + new String(data, 0, len));
        in.close();                                     // 4. 关闭流
    }

    public static void main(String[] args) {
        String filePath = "d:" + File.separator  + "19_develop_tool" + File.separator + "test.txt" ;  // 设置文件的路径
        CharStreamDemo charStreamDemo = new CharStreamDemo();
        try {
            //charStreamDemo.writerStream(filePath);
            charStreamDemo.readerStream(filePath);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

字节流转换为字符流

两个类:

OutputStreamWriter: 将字节输出流变为字符输出流;

InputStreamReader: 将字节输入流变为字符输入流;

 

文件拷贝

public class CopyDemo {
    public static void main(String[] args) throws Exception {
        String srcFile = "d:" + File.separator  + "19_develop_tool" + File.separator + "test.txt" ;
        String dstFile = "d:" + File.separator  + "19_develop_tool" + File.separator + "test11.txt" ;
        long start = System.currentTimeMillis() ;		// 取得复制开始的时间

        // 如果输入参数正确,应该进行源文件有效性的验证
        File inFile = new File(srcFile) ;				// 第一个为源文件路径
        if (!inFile.exists()) {						// 源文件不存在
            System.out.println("源文件不存在,请确认执行路径。");
            System.exit(1);							// 程序退出
        }
        // 如果此时源文件正确,就需要定义输出文件,同时要考虑到输出文件有目录
        File outFile = new File(dstFile) ;
        if (!outFile.getParentFile().exists()) {			// 输出文件路径不存在
            outFile.getParentFile().mkdirs() ;			// 创建目录
        }
        // 实现文件内容的复制,分别定义输出流与输入流对象
        InputStream input = new FileInputStream(inFile) ;
        OutputStream output = new FileOutputStream(outFile) ;
        int temp = 0 ;							// 保存每次读取的数据长度
        byte data [] = new byte [1024] ;				// 每次读取1024个字节
        // 将每次读取进来的数据保存在字节数组里面,并且返回读取的个数
        while((temp = input.read(data)) != -1) {			// 循环读取数据
            output.write(data, 0, temp);				// 输出数组
        }
        input.close(); 							// 关闭输入流
        output.close();							// 关闭输出流
        long end = System.currentTimeMillis() ;			// 取得操作结束时间
        System.out.println("复制所花费的时间:" + (end - start));
    }
}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值