文件操作:

文件操作其实就是一个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. upx 手动脱壳

    查壳 UPX 0.89.6 - 1.02 / 1.05 - 2.90 (Delphi) stub -> Markus & Laszlo upx这类压缩壳手动脱壳非常简单. 一.查找oep ...

  2. 运维小姐姐说这篇Consul集群和ACL配置超给力(保姆级)

    前言 上一篇简单介绍了Consul,并使用开发模式(dev)进行流程演示,但在实际开发中需要考虑Consul的高可用和操作安全性,所以接着来聊聊集群和ACL的相关配置,涉及到的命令会在环境搭建过程中详 ...

  3. FFMPEG编译问题记录

    一.ffmpeg下载与配置 下载地址 FFmpeg/FFmpeg (https://github.com/FFmpeg/FFmpeg) ~$ git clone https://github.com/ ...

  4. vue实现拖拽排序

    基于vue实现列表拖拽排序的效果 在日常开发中,特别是管理端,经常会遇到要实现拖拽排序的效果:这里提供一种简单的实现方案. 此例子基于vuecli3 首先,我们先了解一下js原生拖动事件: 在拖动目标 ...

  5. MongoDB 那些事(一文以蔽之)

    前言 身边一直都有小伙伴在问:MongoDB到底是什么?它有到底什么特性?有什么与众不同?在什么情况下使用MongoDB最合适?以什么样的姿势是最好的?难道就一定要用吗?....说实话,这些问题都问到 ...

  6. Python—关于Pandas缺失值问题(国内唯一)

    获取文中的CSV文件用于代码编程以及文章首发地址,请点击下方超链接 获取CSV,用于编程调试请点这 在本文中,我们将使用Python的Pandas库逐步完成许多不同的数据清理任务.具体而言,我们将重点 ...

  7. Http请求状态码302,已得到html页面但未跳转?HttpServletRequest转发/HttpServletResponse重定向后,前端页面未跳转?Ajax怎么处理页面跳转?

    论断 出现此类错误,服务器端出现问题的可能性不大,大概率是前端问题. 问题概述 事情是这样的,我在用Java开发后端.前端页面使用jQuery库的 $.getJSON() 方法发送了一个Ajax请求. ...

  8. Linux标准输入、重定向与参数传递

    Linux标准输入.重定向与参数传递 按惯例,每当运行一个新程序时,所有shell都为其打开3个文件描述符,即标准输入.标准输出以及标准错误.如果不做特殊处理,例如就像简单的命令ls,则这三个描述符都 ...

  9. 借鉴Elasticsearch 7.x 深入系列学习

    开始 Elasticsearch 深入系列目录如下: Elasticsearch 7.x 深入 数据准备 Elasticsearch 7.x 深入[1]索引[一]原理 Elasticsearch 7. ...

  10. MacBook读写移动硬盘

    在MacBook上插入移动硬盘,只能读取,不能写入.这是因为移动硬盘的格式是NTFS,MacBook不支持写入,有三种方法: 1. 改变移动硬盘的格式,格式化为可以读写的exFAT等格式,但存储的文件 ...