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 ...
随机推荐
- 同步 Github fork 分支
/**************************************************************************** * 同步 Github fork 分支 * ...
- 洛谷 P1262 间谍网络 —— 缩点
题目:https://www.luogu.org/problemnew/show/P1262 首先,一个强连通分量里有一个点被控制则所有点都被控制,所以先 tarjan 缩点,记一下每个连通块中能被收 ...
- win7上安装macaca的报错问题
macaca网上的各种教程中,都建议使用淘宝源安装macaca,使用淘宝源就需要先安装cnpm,在win7上切换到淘宝源安装cnpm后(npm install -g cnpm --registry=h ...
- ubuntu 12.04 samba 配置(转载)
转自:http://blog.sina.com.cn/s/blog_a5b607f801013av9.html 首先当然是要安装samba了,呵呵: 代码: sudo apt-get install ...
- Ubuntu 12.04下安装配置体验GNOME 3(转载)
转自:http://www.tuicool.com/articles/zIbeIj 自己并不是一个思想前卫的人,穿衣审美也都是大众眼光.但是唯独喜欢在计算机方便尝试最新,心肝情愿的做小白鼠.近日,按耐 ...
- bzoj 1597: [Usaco2008 Mar]土地购买【斜率优化】
按xy降序排序,把能被完全包含的去掉 然后就得到了x升序y降序的一个数组 然后方程就显然了:f[i]=min(f[j]+y[j+1]x[i]) 斜率优化转移 说起来我还不会斜率优化呢是不是该学一下了 ...
- bzoj 3944: Sum【莫比乌斯函数+欧拉函数+杜教筛】
一道杜教筛的板子题. 两个都是积性函数,所以做法是一样的.以mu为例,设\( f(n)=\sum_{d|n}\mu(d) g(n)=\sum_{i=1}^{n}f(i) s(n)=\sum_{i=1} ...
- 执行linux脚本出现问题
1. 权限不够: 使用 chmod +x XXX.sh 提升权限 2. 出现:/bin/bash^M: bad interpreter: No such file or directory 原因:文件 ...
- [hdu4035] Maze【概率dp 数学期望】
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4035 真的是一道好题,题解比较麻烦,我自己在纸上写了好大一块草稿才搞出来,不用公式编辑器的话就很难看清楚 ...
- Magento Order 状态详解
流程图:

