文件操作:

文件操作其实就是一个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

对资源操作的基本步骤:(文件为例)--严格按照下面步骤

  1. 如果要操作的资源是文件的话,首先需要通过File类对象找到一个要操作的文件路径
  2. 通过字节流或者字符流的子类为字节流或字符流的对象实例化(向上转型)
  3. 执行读写操作
  4. 关闭资源

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来实现对象的实例化;

读取文件的固定用法:

  1. 创建文件输入流---InputStream input = new FileInputStream(file)
  2. 设置数据的读取缓存区----new byte[1024]
  3. 读取数据,将数据读取到缓存区中并放回读取的字节个数 ----int len = input.read(data)
  4. 字节转换为字符流----new String(data,0,len)
  5. 关闭资源

读取文件内容实例:

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子类;

类的项目结构:

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流以及文件的基本操作的更多相关文章

  1. 用户态与内核态 & 文件流与文件描述符 简介【转】

    转自:https://www.cnblogs.com/Jimmy1988/p/7479856.html 用户态和内核态 程序代码的依赖和调用关系如下图所示: Lib:标准ASCI C函数,几乎所有的平 ...

  2. 用户态与内核态 & 文件流与文件描述符 简介

    用户态和内核态 程序代码的依赖和调用关系如下图所示: Lib:标准ASCI C函数,几乎所有的平台都支持该库函数,因此依赖该库的程序可移植性好: System Function:系统调用函数,与系统内 ...

  3. Java:IO流与文件基础

    Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象 ...

  4. C++之流与文件

    C++中,输入输出采用流来进行,例如iostream库中的 cin 和 cout .对文件进行读写操作也使用流.可以将文件与流关联起来,然后对文件进行操作.要将流与文件关联起来,必须像声明变量那样声明 ...

  5. java io流 对文件夹的操作

    java io流 对文件夹的操作 检查文件夹是否存在 显示文件夹下面的文件 ....更多方法参考 http://www.cnblogs.com/phpyangbo/p/5965781.html ,与文 ...

  6. java io流 创建文件、写入数据、设置输出位置

    java io流 创建文件 写入数据 改变system.out.print的输出位置 //创建文件 //写入数据 //改变system.out.print的输出位置 import java.io.*; ...

  7. java io流(字符流) 文件打开、读取文件、关闭文件

    java io流(字符流) 文件打开 读取文件 关闭文件 //打开文件 //读取文件内容 //关闭文件 import java.io.*; public class Index{ public sta ...

  8. C++学习47 文件的概念 文件流类与文件流对象 文件的打开与关闭

    迄今为止,我们讨论的输入输出是以系统指定的标准设备(输入设备为键盘,输出设备为显示器)为对象的.在实际应用中,常以磁盘文件作为对象.即从磁盘文件读取数据,将数据输出到磁盘文件.磁盘是计算机的外部存储器 ...

  9. [Java] 通过文件流拷贝文件

    package test.stream; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...

随机推荐

  1. 深入理解Java并发框架AQS系列(三):独占锁(Exclusive Lock)

    一.前言 优秀的源码就在那里 经过了前面两章的铺垫,终于要切入正题了,本章也是整个AQS的核心之一 从本章开始,我们要精读AQS源码,在欣赏它的同时也要学会质疑它.当然本文不会带着大家逐行过源码(会有 ...

  2. 2021年的UWP(6)——长生命周期Desktop Extension向UWP的反向通知

    上一篇我们讨论了UWP和Desktop Extension间的双向通讯,适用于Desktop Extension中存在用户交互的场景.本篇我们讨论最后一种情况,与前者不同的是,Desktop Exte ...

  3. 浅谈意图识别各种实现&数学原理

    \[ J_\alpha(x) = \sum_{m=0}^\infty \frac{(-1)^m}{m! \Gamma (m + \alpha + 1)} {\left({ \frac{x}{2} }\ ...

  4. 解Bug之路-主从切换"未成功"?

    解Bug之路-主从切换"未成功"? 前言 数据库主从切换是个非常有意思的话题.能够稳定的处理主从切换是保证业务连续性的必要条件.今天笔者就来讲讲主从切换过程中一个小小的问题. 故障 ...

  5. Kubernetes 用户流量接入方案

    总结Kubernetes 生产环境用户流量接入方案 方案1 client -> ddos -> waf -> slb 7层域名 -> nginx端口 -> ingress ...

  6. SCIP:构造数据抽象--数据结构中队列与树的解释

    现在到了数学抽象中最关键的一步:让我们忘记这些符号所表示的对象.不应该在这里停滞不前,有许多操作可以应用于这些符号,而根本不必考虑它们到底代表着什么东西. --Hermann Weyi <思维的 ...

  7. Distributed | MapReduce

    最近终于抽出时间开始学习MIT 6.824,本文为我看MapReduce论文和做lab后的总结. [MapReduce英文论文] lab要用到go语言,这也是我第一次接触.可以参考go语言圣经学习基本 ...

  8. Dynamics CRM制作报表的时候让用户可以用自己的权限浏览数据

    我们做SSRS报表的时候最头疼的问题就是用Sql查出来的数据都是全部数据没有做权限过滤,导致不同用户看到的数据是一样的. 确实Dynamics CRM产品的数据库时有对这个做处理的,其中每个实体都会有 ...

  9. 这样介绍Ribbon,从此任何问题也难不住你

    Springcloud的核心组件之Ribbon 上篇文章详细介绍了springcloud的注册中心Eureka,那么这篇文章则会介绍springcloud的另外一个组件Spring Cloud Rib ...

  10. 如何在CSS中映射的鼠标位置,并实现通过鼠标移动控制页面元素效果

    映射鼠标位置或实现拖拽效果,我们可以在 JavaScript 中做到这一点.但实际上,在CSS中有更加简洁的方法,我们可以在不使用JavaScript 的情况下,仍然可以实现相同的功能! 只使用CSS ...