学习要点

  • File类操作文件和目录的属性
  • 字节流读写文件
  • 字符流读写文件
  • 字节流读写二进制文件

文件操作

1  文件的定义

文件可认为是相关记录或放在一起的数据的集合。文件一般保存在硬盘、U盘、光盘、云盘的媒介中。

2  Java如何操作文件

JAVA API :java.io.File 类

3  File对象构建

File file = new File( String pathname );

//String pathname格式:"e:\\test .txt"或"e:/test .txt"

  

4  File类常用方法

方法名称

说      明

boolean exists( )

判断文件或目录是否存在

boolean isFile( )

判断是否是文件

boolean isDirectory( )

判断是否是目录

String getPath( )

返回此对象表示的文件的相对路径名

String getAbsolutePath( )

返回此对象表示的文件的绝对路径名

String getName( )

返回此对象表示的文件或目录的名称

boolean delete( )

删除此对象指定的文件或目录

boolean createNewFile( )

创建名称的空文件,不创建文件夹

long  length()

返回文件的长度,单位为字节, 如果文件不存在,则返回 0L

5  File操作文件示例

public static void main(String[] args) {

        FileOperation fm = new FileOperation();

        File file = null;

        file = new File("e:\\myDoc\\test.txt");

        fm.create(file);

        fm.showFileInfo(file);

        fm.delete(file);

    }

    /** 创建文件的方法 */

    public void create(File file) {

        if (!file.exists()) {

            try {

                file.createNewFile();

                System.out.println("文件已创建!");

            } catch (IOException e) {

                e.printStackTrace();

            }

        }

    }

    /** 删除文件 */

    public void delete(File file) {

        if (file.exists()) {

            file.delete();

            System.out.println("文件已删除!");

        }

    }

    /** 显示文件信息 */

    public void showFileInfo(File file) {

        if (file.exists()) { // 判断文件是否存在

            if (file.isFile()) { // 如果是文件

                System.out.println("名称:" + file.getName());

                System.out.println("相对路径: " + file.getPath());

                System.out.println("绝对路径: " + file.getAbsolutePath());

                System.out.println("文件大小:" + file.length() + " 字节");

            }

            if (file.isDirectory()) {

                System.out.println("此文文件是目录");

            }

        } else

            System.out.println("文件不存在");

    }

6  上机练习

查看文件属性,创建和删除文件。

1  定义

Flie类提供了访问文件和目录属性的方法,如何读写文件的内容?通过流来读写。

流的概念:流是指一连串流动的字符,是以先进先出方式发送信息的通道。

输入/输出流和数据源的关系:

2  Java流的分类

  • 输入输出流是相对于计算机内存而言
  • 字节流是 8 位通用字节流,字符流是 16 位 Unicode 字符流
  • IO体系示意图

3  常用的文件读写类

文本文件的读写

字节流方式:FileInputStream、FileOutputStream

字符流方式:BufferedReader、BufferedWriter

二进制文件的读写

DataInputStream、DataOutputStream

字节流方式读写文本

1  FileInputStream 读文本文件

InputStream类常用方法

方法

说明

int read( )

从此输入流中读取一个数据字节。

int read(byte[] b)

从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。

int read(byte[] b,int off,int len)

从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。

void close( )

关闭此文件输入流并释放与此流有关的所有系统资源。

int available()

返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取(或跳过)的估计剩余字节数。

子类FileInputStream常用的构造方法

构造方法

说明

FileInputStream(File file)

通过文件对象创建FileInputStream对象。

FileInputStream(String name)

通过name文件路径创建FileInputStream对象。

示例代码

package com.etc.io;

//1.引入相关类

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

public class FISTest {

   public static void main(String[] args) {

       FileInputStream fis = null;

       try {

           // 2.构造文件输入流对象

           fis = new FileInputStream("e:\\mydoc.txt");

           // 3.读取文本文件数据

           byte[] words = new byte[1024];// 构建数组,一次读取1024个字节

           while (fis.read() > 0) {

               fis.read(words);

           }

           // 4. 输出内容

           String str = new String(words, "utf-8");

           System.out.println(str);

       } catch (FileNotFoundException e) {

           e.printStackTrace();

       } catch (IOException e) {

           e.printStackTrace();

       } finally {

           // 5. 关闭输入流

           try {

               if (fis != null) {

                   fis.close();

               }

           } catch (IOException e) {

               e.printStackTrace();

           }

       }

   }

}

  

2  FileOutputStream 写文本文件

OutputStream类常用方法

方法

说明

void write(int c)

将指定字节写入此文件输出流。

void write(byte[] buf)

将 b.length 个字节从指定 byte 数组写入此文件输出流中。

void write(byte[] b,int off,int len)

将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。

void close( )

关闭此文件输出流并释放与此流有关的所有系统资源。

子类FileOutputStream常用的构造方法

构造方法

说明

FileOutputStream (File file)

创建一个向指定 File 对象表示的文件中写入数据的文件输出流。

FileOutputStream(String name)

创建一个向具有指定名称的文件中写入数据的输出文件流。

FileOutputStream(String name,

boolean append)

创建一个向指定 File 对象表示的文件中写入数据的文件输出流。如果第二个参数为 true,则将字节写入文件末尾处,而不是写入文件开始处。

注意:

1、前两种构造方法在向文件写数据时将覆盖文件中原有的内容。

2、创建FileOutputStream实例时,如果相应的文件并不存在,则会自动创建一个空的文件。

3、FileInputStream和FileOutputStream创建的流属于节点流,直接操纵数据源。

示例代码

package com.etc.io;

//1.引入IO相关类

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

public class FOSTest {

   public static void main(String[] args) {

       FileOutputStream fos = null;

       try {

           // 2.构造FileOutputStream对象

           fos = new FileOutputStream("e://fos.txt");

           // 3.把数据写入文本文件

           String text = "好好学习Java,天天向上!";

           byte[] words = text.getBytes();

           fos.write(words, 0, words.length);

           System.out.println("数据写入文件成功");

       } catch (FileNotFoundException e) {

           e.printStackTrace();

       } catch (IOException e) {

           e.printStackTrace();

       } finally {

           // 4.关闭文件流

           try {

               if (fos != null) {

                   fos.close();

               }

           } catch (IOException e) {

               e.printStackTrace();

           }

       }

   }

}

3 上机练习:复制文本文件

需求描述

文件“我的介绍.txt”位于D盘根目录下,要求将此文件的内容复制到E:\myFile\myInfo.txt中。

分析

使用FileInputStream实现读取文本文件。

使用FileOutputStream实现向文本文件中写数据

实现思路

1. 创建文件“D:\我的介绍.txt”并自行输入内容

2. 创建C:\myFile的目录。

3. 创建输入流FileInputStream对象,负责对D:\我的结束.txt文件的读取。

4. 创建输出流FileOutputStream对象,负责将文件内容写入到C:\myFile\myInfo.txt中。

5. 创建中转站数组words,存放每次读取的内容。

6. 通过循环实现文件读写。

7. 关闭输入流、输出流

字符流方式读写文本文件

1  BufferedReader读文本文件

使用字符流读取文本文件相关类

Reader

FileReader(节点流)

BufferedReader(处理流)

Reader类常用方法

int read( )

int read(char[] c)

int read(char[] c,int off,int len)

void close( )

子类BufferedReader常用的构造方法

public  BufferedReader(Reader in)   //in通常使用FlieReader对象

子类BufferedReader特有的方法

public String readLine()   //读取一行信息

乱码问题

方案一:字节流到字符流的转换

文本保存为utf-8格式

FileInputStream fis=new FileInputStream("e:\\mydoc.txt");

//使用InputStreamReader并设置编码格式

InputStreamReader fr=new InputStreamReader(fis,"UTF-8");

BufferedReader br=new BufferedReader(fr);

  

方案二:重构字符串

示例代码

package com.etc.io;

//1.引入IO相关类

import java.io.BufferedReader;

import java.io.FileReader;

import java.io.IOException;

public class BrTest {

   public static void main(String[] args) {

       FileReader fr = null;

       BufferedReader br = null;

       try {

           // 2.创建一个FileReader对象

           fr = new FileReader("E:\\mydoc.txt");

           // 3.创建一个BufferedReader 对象

           br = new BufferedReader(fr);

           // 4.读取一行数据

           String line = br.readLine();

           while (line != null) {

               String str = new String(line.getBytes(), "UTF-8");

               System.out.println(str);

               line = br.readLine();

           }

       } catch (IOException e) {

           System.out.println("文件不存在!");

       } finally {

           try {

               // 6. 关闭 流

               if (br != null)

                   br.close();

               if (fr != null)

                   fr.close();

           } catch (IOException e) {

               e.printStackTrace();

           }

       }

   }

}

  

2  BufferedWriter写文本文件

使用字符流写文本文件相关类

Writer

FileWriter(节点流)

BufferedWriter(处理流)

Writer类常用方法

void write(String str)

void write(String str,int off,int len)

void close()

void flush()

子类BufferedWriter常用的构造方法

BufferedReader(Writer out)  //in通常使用FlieWriter对象

示例代码

package com.etc.io;

//1、引入IO相关类

import java.io.BufferedWriter;

import java.io.FileWriter;

import java.io.IOException;

public class BwTest {

   public static void main(String[] args) {

       FileWriter fw = null;

       BufferedWriter bw = null;

       try {

           // 2.创建一个FileWriter 对象

           fw = new FileWriter("e:\\hi.txt");

           // 3.创建一个BufferedWriter 对象

           bw = new BufferedWriter(fw);

           // 4.写入数据

           bw.write("大家好!");

           bw.write("我正在学习Java IO。");

           bw.newLine();

           bw.write("请多多指教!");

           bw.newLine();

           bw.flush();// 刷新缓冲区

           System.out.println("写入文件信息成功!");

       } catch (IOException e) {

           System.out.println("文件不存在!");

       } finally {

           // 5.关闭流

           try {

               if (bw != null) {

                   bw.close();

               }

               if (fw != null)

                   fw.close();

           } catch (IOException ex) {

               ex.printStackTrace();

           }

       }

   }

}

  

3  上机练习:模板文件的替换

需求描述

1、格式模版保存在文本文件person.template中,内容如下:

您好!

我的名字是{name},我是{grade}学生。

我的专业是{speciality}。

2、其中{name}、{grade}、{speciality}是需要替换的内容,现在要求按照模板格式保存个人数据到文本文件,即把{name}、{grade}、{speciality}替换为具体的个人。

分析

1、使用Reader实现类读取文件

2、使用String的replace(char oldChar, char newChar)的方法替换内容

3、使用Writer实现类写文件

字节流方式读写二进制文件

1  DataInputStream类读取二进制文件(处理流)

FileInputStream的子类

与FileInputStream类结合使用读取二进制文件

2  DataOutputStream类写二进制文件(处理流)

FileOutputStream的子类

与FileOutputStream类结合使用写二进制文件

3  示例代码

/**

     * 二进制文件拷贝

     * @param sFile 源文件

     * @param dFile 目标文件

     */

    public static void copyBinFile(File sFile, File dFile) {

        FileInputStream fis = null;// 定义字节流输入节点流

        DataInputStream dis = null;// 定义二进制输入处理流

        FileOutputStream fos = null;// 定义字节流输出节点流

        DataOutputStream dos = null;// 定义二进制输出处理流

        try {

            fis = new FileInputStream(sFile);

            dis = new DataInputStream(fis);// 构建二进制输入处理流

            fos = new FileOutputStream(dFile);

            dos = new DataOutputStream(fos);// 构建二进制输出处理流

            int temp;

            while ((temp = dis.read()) != -1) {// 读取数据

                dos.write(temp);// 写数据

            }

            System.out.println("拷贝文件" + sFile.getName() + "成功!");

            System.out.println("文件路径:" + sFile.getAbsolutePath());

        } catch (FileNotFoundException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        } finally {

            // 关闭资源

            try {

                if (dos != null) {

                    dos.close();

                }

                if (fos != null) {

                    fos.close();

                }

                if (dis != null) {

                    dis.close();

                }

                if (fis != null) {

                    fis.close();

                }

            } catch (IOException e) {

                e.printStackTrace();

            }

        }

    }

  

4  上机练习:从D盘拷贝一张图像文件到E盘

JavaSE-19 IO的更多相关文章

  1. 【JavaSE】IO(1)-- File类

    File类 2019-07-01  22:41:42  by冲冲 在 Java 中,File 类是 java.io 包中唯一映射磁盘文件本身的对象.File类可以获取文件的相关信息(查看文件名.路径. ...

  2. JavaSE(一) IO类层次关系和各种IO流的用法总结

    今天把IO流的这一知点进行一下总结,因为在之前使用io流的时候,就只知道几个重点常用的IO类,比如FileInputStream,BufferedInputStream(缓冲流)等等,但是不知道它处于 ...

  3. 08 - JavaSE之IO流

    IO流 JAVA流式输入输出原理:可以想象成一根管道怼到文件上,另一端是我们程序,然后流的输入输出都是按照程序本身作为第一人称说明的.比如 input,对于我们程序来说就是有数据输入我们程序,outp ...

  4. 19 IO流(十六)——Commons工具包,FileUtils(一)

    Commons包的API:自己查吧懒得传云 Commons包的导入方法 Commons是一个java的IO开源工具,导入方法: 从apache.org下载commons包 解压 copy其中的comm ...

  5. (19)IO流之字符流FileReader和FileWriter,缓冲字符流---缓冲输入字符流BufferedReader和缓冲输出字符流BufferedWriter

    字符流,读取的文件是字符的时候,有两个基类一个是Reader,一个是Writer这有点拟人的感觉,人直接看懂的是文字 字符流 字节流:读取的是文件中的二进制字节流并不会帮你转换成看的懂得字符 字符流: ...

  6. 基于JavaSE阶段的IO流详解

    1.IO流基本概述 在Java语言中定义了许多针对不同的传输方式,最基本的就是输入输出流(俗称IO流),IO流是属于java.io包下的内容,在JavaSE阶段主要学下图所示的: 其中从图中可知,所有 ...

  7. JavaSE中主要的类与方法

    1.instanceof:测试左边的对象是否是右边类的实例;  数组.length:返回的是数组的长度; 2.Scanner类     nextInt():读取键盘录入的整数;  next():读取键 ...

  8. 文件IO流完成文件的复制(复杂版本主要用来演示各种流的用途,不是最佳复制方案哦)

    package io; import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import j ...

  9. 如何自学 Java 开发

    如何自学 Java 开发? 568赞同反对,不会显示你的姓名 李艾米IT路上学习 568 人赞同 Java Web前端技术 HTML 入门视频课程 1 HTML 简介 2 HTML基本结构[ 3 HT ...

  10. [转]Delphi I/O Errors

    The following are the Windows API (and former DOS) IO errors, which are also the IO errors often ret ...

随机推荐

  1. lmbench andlmbench 移植测试

    /*********************************************************************** * lmbench andlmbench 移植测试 * ...

  2. bzoj 3781 小B的询问 —— 莫队

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3781 就是莫队,左端点分块排序,块内按右端点排序,然后直接做即可. 代码如下: #inclu ...

  3. repo+manifests+git方式管理安卓代码

    repo+manifests+git方式管理安卓代码 1.repo的获取 repo只是google用Python脚本写的调用git的一个脚本,主要是用来下载.管理Android项目的软件仓库.(也就是 ...

  4. NPU 2015年陕西省程序设计竞赛网络预赛(正式赛)F题 和谐的比赛(递推 ||卡特兰数(转化成01字符串))

    Description 今天西工大举办了一场比赛总共有m+n人,但是有m人比较懒没带电脑,另外的n个人带了电脑.不幸的是,今天机房的电脑全坏了只能用带的电脑,一台电脑最多两人公用,确保n>=m. ...

  5. J201700525-hm

    スケルトン 骨組み(ほねぐみ) 骨架 リソース    资源

  6. 状压dp之二之三 炮兵阵地/玉米田 By cellur925

    一.简单的状压dp 玉米田 题目描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ ...

  7. 安装privoxy后curl 操作

    如果讲privoxy服务关掉 sudo /etc/init.d/privoxy restart 这时候发现 curl www.baidu.com 也没法正常工作,直接显示的是无法连接到相应端口还是 主 ...

  8. oracle数据库当前用户下所有表名和表名的注释

    select a.TABLE_NAME,b.COMMENTSfrom user_tables a,user_tab_comments bWHERE a.TABLE_NAME=b.TABLE_NAMEo ...

  9. js中判断数据类型的方法 typeof

    <input type="text" onblur="demo(this)"/><br/> <input type="n ...

  10. 线程池机制使nginx性能提高9倍

    原文标题:Thread Pools in NGINX Boost Performance 9x! 原文官方地址:https://www.nginx.com/blog/thread-pools-boos ...