I/O流以及文件的基本操作
文件操作:
文件操作其实就是一个FIle类;我们学习文件操作就是学习File类中的方法;
文件基操:
第一部分:学习文件的基本操作(先扒源码以及文档)
| Constructor | Description |
|---|---|
File(File parent, String child) |
给定要操作的问价的父路径和子文件名称 |
File(String pathname) |
给定一个要操作文件的完整路径 |
| Modifier and Type | Method | Description |
|---|---|---|
| boolean | public boolean createNewFile() throws IOException | 创建文件 |
boolean |
delete() |
删除文件 |
boolean |
exists() |
判断给定路径是否存在 |
来个实例:
import java.io.File;
import java.io.IOException;
public class FIleDelCre {
public static void main(String[] args) throws IOException {
File file = new File("e:\\IOFileSource\\xbhog.txt");
if(file.exists()){
file.delete();
}else{
System.out.println(file.createNewFile());
}
}
}
createNewFile:如果指定的文件不存在且已成功创建,则为True;如果指定的文件已经存在,则为False
知识点(敲黑板):
路径分隔符:解决不同操作系统下的路径符号问题(windows->“\”;Linux->“/”);
File file = new File("e:"+File.separator +"IOFileSource"+File.separator+"xbhog.txt");
注:
/**
* The system-dependent default name-separator character, represented as a
* string for convenience. This string contains a single character, namely
* {@link #separatorChar}.
*/
public static final String separator = "" + separatorChar;
对父路径操作的方法:
import java.io.File;
import java.io.IOException;
public class FIleDelCre {
public static void main(String[] args) throws IOException {
File file = new File("e:"+File.separator +"IOFileSource"+File.separator+"test"+File.separator+"demo"+File.separator+"xbhog.txt");
if(!file.getParentFile().exists()){ //如果该文件的父目录不存在
/*
file.getParentFile().mkdirs(); //进行创建多级父目录
mkdirs底层进行递归调用,实现多级目录创建
file.getParentFile().mkdir(); //进行创建一个父目录
*/
}
if(file.exists()){
file.delete();
}else{
System.out.println(file.createNewFile());
}
}
}
注:mkdirs与mkdir的区别,最好进入源码中查看
文件列表显示:
流程图:

import java.io.File;
public class FilePwd {
public static void main(String[] args) {
File file = new File("D:" + File.separator);
listDir(file);
}
public static void listDir(File file){
if(file.isDirectory()){
File[] Dirs = file.listFiles();
while(Dirs != null){
for (int i = 0; i < Dirs.length; i++) {
listDir(Dirs[i]); //递归调用
}
}
}
System.out.println(file);
}
}
文件批量更名:
情景:
在数据采集的过程中由于操作失误,使得xbhog-log文件夹下的所有文件后缀采用了.java,为了修正这一错误,要求使得该目录下的所有文件后缀统一替换成.txt,同时也需要考虑多级目录下的文件更名操作。

import java.io.File;
public class FIleChangeName {
public static void main(String[] args) {
File file = new File("D:" + File.separator + "xbhog-log");
renameDir(file);
}
public static void renameDir(File file){
if(file.isDirectory()){
File[] dirs = file.listFiles();
for (int i = 0; i < dirs.length; i++) {
renameDir(dirs[i]); //递归调用
}
}else {
if (file.isFile()){ //判断是否为文件
String fileName = null; //文件名称
if(file.getName().endsWith(".java")){ //判断是否以.java为结尾
fileName = file.getName().substring(0,file.getName().lastIndexOf("."))+".txt";
File newfile = new File(file.getParentFile(), fileName); //新的文件名称
file.renameTo(newfile); //重命名
}
}
}
}
}
字节流与字符流:
字节流:outputStream以及inputStream
字符流:Writer以及Reader
对资源操作的基本步骤:(文件为例)--严格按照下面步骤
- 如果要操作的资源是文件的话,首先需要通过File类对象找到一个要操作的文件路径
- 通过字节流或者字符流的子类为字节流或字符流的对象实例化(向上转型)
- 执行读写操作
- 关闭资源
OutputStream字节输入流
常用的类普通方法:
| Modifier and Type | Method | Description |
|---|---|---|
void |
close() |
关闭此输出流并释放与此流关联的任何系统资源。 |
void |
flush() |
刷新此输出流并强制写入任何已缓冲的输出字节。 |
void |
write(byte[] b) |
输出单个字节数据 |
void |
write(byte[] b, int off, int len) |
输出部分字节数据 |
abstract void |
write(int b) |
输出一组字节数据 |
对文件的操作需要其OutputStream下的子类FileOutputStream来实现对象的实例化;
其常用的构造方法是:
| Constructor | Description |
|---|---|
FileOutputStream(File file) |
创建一个文件输出流,以写入由指定file对象表示的文件。 |
FileOutputStream(File file, boolean append) |
创建一个文件输出流,以写入由指定file对象表示的文件。如果第二个参数为真,则字节将被写到文件的末尾而不是开头 |
实例:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
public class FIleOutputStearm {
public static void main(String[] args) throws IOException {
File file = new File("xbhog.txt");
if(!file.exists()){
file.createNewFile();
}
OutputStream outputStearm = new FileOutputStream(file);
String str = "欢迎来到xbhog的博客";
outputStearm.write(str.getBytes(StandardCharsets.UTF_8));
outputStearm.close();
}
}
文件内容的追加:
OutputStream stream = new FileOutputStream(file, true);
String addStr = "-----这是追加的内容------";
stream.write(addStr.getBytes());
stream.close();
InputStream字节输入流:
该类的常用方法:
| Modifier and Type | Method | Description |
|---|---|---|
void |
close() |
关闭输出流 |
abstract int |
read() |
读取单个字节数据,如果现在已经读取到底了,返回-1 |
int |
read(byte[] b) |
读取一组字节数据,返回的是读取的个数,如果没有数据已经读取到底则返回-1 |
int |
read(byte[] b, int off, int len) |
读取一组字节数据(只占数组的部分) |
byte[] |
readAllBytes() |
读取输入流全部字节数据,JDK 1.9后新增 |
long |
transferTo(OutputStream out) |
输入流转存到输出流,JDK 1.9之后新增 |
对文件的操作需要其InputStream下的子类FileInputStream来实现对象的实例化;
读取文件的固定用法:
- 创建文件输入流---
InputStream input = new FileInputStream(file) - 设置数据的读取缓存区----
new byte[1024] - 读取数据,将数据读取到缓存区中并放回读取的字节个数 ----
int len = input.read(data) - 字节转换为字符流----
new String(data,0,len) - 关闭资源
读取文件内容实例:
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class FileInputStreamTest {
public static void main(String[] args) throws IOException {
File file = new File("xbhog.txt"); // 输出文件路径
if (file.exists()) { // 文件存在
InputStream input = new FileInputStream(file);// 文件输入流
byte data[] = new byte[1024]; // 数据读取缓冲区
// 读取数据,将数据读取到缓冲区之中,同时返回读取的字节个数
int len = input.read(data);
System.out.println("【" + new String(data, 0, len) + "】");// 字节转为字符串
input.close(); // 关闭输入流
}
}
}
读取文件中的全部内容:
byte[] bytes = input.readAllBytes();
System.out.println(new String(bytes));
Writer字符流:
为了简化输出的操作,提供了Writer与Reader字符流;
该类的常用方法:
| Modifier and Type | Method | Description |
|---|---|---|
Writer |
append(char c) |
将指定的字符写入。 |
Writer |
append(CharSequence csq) |
将指定的字符序列附加到此编写器。 |
Writer |
append(CharSequence csq, int start, int end) |
将指定字符序列的子序列追加到此编写器 |
abstract void |
close() |
关闭资源 |
abstract void |
flush() |
刷新资源流 |
void |
write(char[] cbuf) |
写入一组字符数组 |
abstract void |
write(char[] cbuf, int off, int len) |
写入一组字符数组的一部分 |
void |
write(int c) |
写入一个字符 |
void |
write(String str) |
写入一个字符串 |
void |
write(String str, int off, int len) |
写入一个字符串的一部分 |
在进行文件流的写入时,需要引入Writer下的FileWriter子类;
类的项目结构:
- java.lang.Object
- java.io.Writer
- java.io.OutputStreamWriter
- java.io.FileWriter
FileWriter常用构造方法:
| Constructor | Description |
|---|---|
FileWriter(File file) |
给定File对象,构造一个FileWriter对象。 |
FileWriter(String fileName, boolean append) |
构造一个给定文件名的FileWriter对象,该文件名带有一个布尔值,该布尔值表示是否追加写入的数据。 |
实例:
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class FileWriterDemo {
public static void main(String[] args) throws IOException {
File file = new File("FileWriter.txt"); // 输出文件路径
if(!file.exists()){
file.createNewFile();
}
Writer out = new FileWriter(file) ; // 实例化Writer类对象
out.write("欢迎来到xbhog"); // 输出字符串
out.write("\n");
out.append("Test\n");
out.append("www.cblog.cn/xbhog") ;// 追加输出内容
out.close();// 关闭输出流
}
}
Reader字符输入流:
该类常用的方法:
| Modifier and Type | Method | Description |
|---|---|---|
abstract void |
close() |
关闭资源 |
int |
read() |
读取单个字符 |
int |
read(char[] cbuf) |
将字符放入数组 |
long |
skip(long n) |
跳过字符(几个) |
boolean |
ready() |
判断这个流是否已准备好了读取了 |
实例测试:
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class FileReaderDemo {
public static void main(String[] args) throws IOException {
File file = new File("FileWriter.txt");// 输出文件路径
if (file.exists()) {// 文件存在
Reader in = new FileReader(file); // 实例化输入流
char data[] = new char[1024]; // 缓冲区
//“欢迎没有了”
in.skip(2);// 跨过2个字符长度
int len = in.read(data); // 读取数据
System.out.println(new String(data, 0, len));
in.close();// 关闭输入流
}
}
}
转换流:
| 转换流 | OutputStreamWriter | InputStreamReader |
|---|---|---|
| 继承结构 | public class OutputStreamWriterextends Writer {} | public class InputStreamReaderextends Reader |
| 构造方法 | public OutputStreamWriter(OutputStream out) | public InputStreamReader(InputStream in) |
实现两者的转换操作:
将字节输入流转换成字符输入流
import java.io.*;
public class ConversionOperations {
public static void main(String[] args) throws IOException {
File file = new File("FileWriter1.txt"); // 输出文件路径
OutputStream output = new FileOutputStream(file) ;// 字节流
Writer out = new OutputStreamWriter(output) ; // 字节流转字符流
out.write("测试两者之间的转换"); // 字符流输出
out.close(); // 关闭输出流
output.close(); // 关闭输出流
}
}
| ---- | ---- | ---- |
I/O流以及文件的基本操作的更多相关文章
- 用户态与内核态 & 文件流与文件描述符 简介【转】
转自:https://www.cnblogs.com/Jimmy1988/p/7479856.html 用户态和内核态 程序代码的依赖和调用关系如下图所示: Lib:标准ASCI C函数,几乎所有的平 ...
- 用户态与内核态 & 文件流与文件描述符 简介
用户态和内核态 程序代码的依赖和调用关系如下图所示: Lib:标准ASCI C函数,几乎所有的平台都支持该库函数,因此依赖该库的程序可移植性好: System Function:系统调用函数,与系统内 ...
- Java:IO流与文件基础
Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象 ...
- C++之流与文件
C++中,输入输出采用流来进行,例如iostream库中的 cin 和 cout .对文件进行读写操作也使用流.可以将文件与流关联起来,然后对文件进行操作.要将流与文件关联起来,必须像声明变量那样声明 ...
- java io流 对文件夹的操作
java io流 对文件夹的操作 检查文件夹是否存在 显示文件夹下面的文件 ....更多方法参考 http://www.cnblogs.com/phpyangbo/p/5965781.html ,与文 ...
- java io流 创建文件、写入数据、设置输出位置
java io流 创建文件 写入数据 改变system.out.print的输出位置 //创建文件 //写入数据 //改变system.out.print的输出位置 import java.io.*; ...
- java io流(字符流) 文件打开、读取文件、关闭文件
java io流(字符流) 文件打开 读取文件 关闭文件 //打开文件 //读取文件内容 //关闭文件 import java.io.*; public class Index{ public sta ...
- C++学习47 文件的概念 文件流类与文件流对象 文件的打开与关闭
迄今为止,我们讨论的输入输出是以系统指定的标准设备(输入设备为键盘,输出设备为显示器)为对象的.在实际应用中,常以磁盘文件作为对象.即从磁盘文件读取数据,将数据输出到磁盘文件.磁盘是计算机的外部存储器 ...
- [Java] 通过文件流拷贝文件
package test.stream; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...
随机推荐
- MQ 架构与细节
MQ 架构与细节 MQ 是什么? MQ:MessageQueue,消息队列的简称,用于进程间通信或同一进程的不同线程间的通信方式. 什么时候该使用MQ? 数据驱动的任务依赖 上游不关心执行结果 上游关 ...
- PTA 数组元素的区间删除
6-6 数组元素的区间删除 (20 分) 给定一个顺序存储的线性表,请设计一个函数删除所有值大于min而且小于max的元素.删除后表中剩余元素保持顺序存储,并且相对位置不能改变. 函数接口定义: ...
- 【新阁教育】台达DVP-ES3 ModbusTCP通信案例
本文主要针对台达DVP-ES3系列PLC,实现上位机与PLC之间的ModbusTCP通信. 一.硬件说明 DVP-ES3 系列为高阶应用可编程控制器, CPU 内置4 组高速计数器输入.4组轴输出(脉 ...
- java例题_33 等腰输出杨辉三角
1 /*33 [程序 33 杨辉三角] 2 题目:打印出杨辉三角形(要求打印出 10 行如下图) 3 程序分析: 4 1 5 1 1 6 1 2 1 7 1 3 3 1 8 1 4 6 4 1 9 1 ...
- 【工程应用一】 多目标多角度的快速模板匹配算法(基于NCC,效果无限接近Halcon中........)
愿意写代码的人一般都不太愿意去写文章,因为代码方面的艺术和文字中的美学往往很难兼得,两者都兼得的人通常都已经被西方极乐世界所收罗,我也是只喜欢写代码,让那些字母组成美妙的歌曲,然后自我沉浸在其中自得其 ...
- SCIP:构造过程抽象--面向对象的解释
心智的活动,除了尽力产生各种简单的认知之外,主要表现为如下三个方面:(1)将若干简单认知组合为一个复合的认识,由此产出各种复杂的认知.(2)将两个认知放在一起对照,不管他们如何简单或者复杂,在这样做时 ...
- [贪心]D. 【例题4】国王游戏
D . [ 例 题 4 ] 国 王 游 戏 D. [例题4]国王游戏 D.[例题4]国王游戏 解析 贪心思想,考虑交换后的值比交换前的小. 然后数据规模用高精度 Code #include <b ...
- 微信小程序授权登录以及用户信息相关接口调整导致授权框不弹出
前言:4月8号升级了小程序业务后提交了版本并上线.突然一个同事说体验版的点击"登录"按钮无效.当时觉得应该不会呀,这几天一直用手机调试,每天也在不停的登录授权,弹框一直有的呀.然后 ...
- java面试-CountDownLatch、CyclicBarrier、Semaphore谈谈你的理解
一.CountDownLatch 主要用来解决一个线程等待多个线程的场景,计数器不能循环利用 public class CountDownLatchDemo { public static void ...
- 【C/C++】面向对象开发的优缺点
原创文章,转发请注明出处. 面向对象开发的优缺点 面向对象开发 是相对于 面向过程开发 的一种改进思路. 由于流水线式的面相过程开发非常直接,高效.在面对一些简单项目时,只需要几百行,甚至是几十行代码 ...