JavaSE-19 IO
学习要点
- 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的更多相关文章
- 【JavaSE】IO(1)-- File类
File类 2019-07-01 22:41:42 by冲冲 在 Java 中,File 类是 java.io 包中唯一映射磁盘文件本身的对象.File类可以获取文件的相关信息(查看文件名.路径. ...
- JavaSE(一) IO类层次关系和各种IO流的用法总结
今天把IO流的这一知点进行一下总结,因为在之前使用io流的时候,就只知道几个重点常用的IO类,比如FileInputStream,BufferedInputStream(缓冲流)等等,但是不知道它处于 ...
- 08 - JavaSE之IO流
IO流 JAVA流式输入输出原理:可以想象成一根管道怼到文件上,另一端是我们程序,然后流的输入输出都是按照程序本身作为第一人称说明的.比如 input,对于我们程序来说就是有数据输入我们程序,outp ...
- 19 IO流(十六)——Commons工具包,FileUtils(一)
Commons包的API:自己查吧懒得传云 Commons包的导入方法 Commons是一个java的IO开源工具,导入方法: 从apache.org下载commons包 解压 copy其中的comm ...
- (19)IO流之字符流FileReader和FileWriter,缓冲字符流---缓冲输入字符流BufferedReader和缓冲输出字符流BufferedWriter
字符流,读取的文件是字符的时候,有两个基类一个是Reader,一个是Writer这有点拟人的感觉,人直接看懂的是文字 字符流 字节流:读取的是文件中的二进制字节流并不会帮你转换成看的懂得字符 字符流: ...
- 基于JavaSE阶段的IO流详解
1.IO流基本概述 在Java语言中定义了许多针对不同的传输方式,最基本的就是输入输出流(俗称IO流),IO流是属于java.io包下的内容,在JavaSE阶段主要学下图所示的: 其中从图中可知,所有 ...
- JavaSE中主要的类与方法
1.instanceof:测试左边的对象是否是右边类的实例; 数组.length:返回的是数组的长度; 2.Scanner类 nextInt():读取键盘录入的整数; next():读取键 ...
- 文件IO流完成文件的复制(复杂版本主要用来演示各种流的用途,不是最佳复制方案哦)
package io; import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import j ...
- 如何自学 Java 开发
如何自学 Java 开发? 568赞同反对,不会显示你的姓名 李艾米IT路上学习 568 人赞同 Java Web前端技术 HTML 入门视频课程 1 HTML 简介 2 HTML基本结构[ 3 HT ...
- [转]Delphi I/O Errors
The following are the Windows API (and former DOS) IO errors, which are also the IO errors often ret ...
随机推荐
- C语言算法
选择排序法:用第一个数分别和后面的数比较 冒泡排序法:相邻的两个数比较 01.单词首字母大写&统计单词个数 02: 编写一个函数int pieAdd(int n),计算1!+2!+3!+……+ ...
- Ural2089:Experienced coach(二分图匹配)
Misha trains several ACM teams at the university. He is an experienced coach, and he does not undere ...
- SimpliciTI协议栈
SimpliciTI组网过程介绍 1.SimpliciTI支持点对点和星形的网络拓扑结构. 下面介绍以AP为中心的SimpliciTI网路协议的星形拓扑结构通信过程 1)当ED节点上电之后就扫描信 ...
- robot设置chrome mobile emulation
https://www.testwo.com/article/361 http://blog.csdn.net/huilan_same/article/details/52856200 http:// ...
- word-break word-wrap
work-break:break-all CJK超出的部分自动换行 word-wrap:break-word CJK如果有分隔符,当前分隔符之后与下一个分隔符之间的内容不能在这一行全部显示的话,在当前 ...
- Image2Caption
定义 图像标注或语言生成图像问题把计算机视觉与自然语言处理联系在了一起,是广义的人工智能领域的一大难题.通常涉及到特征提取(用cnn提取出图像内部不为人类感知的向量特征)和语言模型建立.为图像提取文字 ...
- 记重大失误(SQLserver数据回滚)ApexSQL
敲了一天代码,脑壳昏,更改数据时忘记加where条件,该数据库又未备份.修改了1800条数据..当时那个着急啊. 各种找解决方法,最后使用ApexSQL Log 完美解决.赞一个 ApexSQL L ...
- Spring IOC 一——容器装配Bean的简单使用
下文:SpringIOC 二-- 容器 和 Bean的深入理解 写在前面 这篇文章去年写的,缘起于去年某段时间被领导临时"抓壮丁"般的叫过去做java开发,然后在网上找了一个 Sp ...
- 转载:4412环境搭建:arm-linux-gcc: 没有那个文件或目录
4412环境搭建:arm-linux-gcc: 没有那个文件或目录 2014年10月15日 ⁄ 环境搭建 ⁄ 共 993字 ⁄ 字号 小 中 大 ⁄ 评论 11 条 ⁄ 阅读 6,125 次 最近弄了 ...
- ElasticSearch | windows 上安装ES
Elastatic需要java JAVA8 环境,确保安装好环境 在windows上安装ES还是比较简单的, 1.首先在官网上下载zip,地址 https://www.elastic.co/downl ...