文件 File
文件
1. 文件的一些常用方法
package com.ljw.study;
import java.io.File;
import java.util.Arrays;
import java.util.Date;
public class FileDemo {
public static void main(String[] args) {
// 构造文件对象
// 绝对路径,构造文件夹对象
File f1 = new File("d:/work/code/ljw/Test");
System.out.println(f1.exists()); // 文件是否存在
// 相对路径,如果是eclipse的话,就是相对于项目目录
File f2 = new File("employee.ser");
System.out.println("f2的绝对路径:" + f2.getAbsolutePath());
System.out.println(f2.exists());
// 以f1为父目录创建文件对象
File f3 = new File(f1,"LOL.exe");
System.out.println("f3的绝对路径:" + f3.getAbsolutePath());
System.out.println(f2.isDirectory()); // 是否是文件夹
System.out.println(f2.isFile()); // 是否为文件(非文件夹)
System.out.println(f2.length()); // 文件长度
System.out.println(new Date(f2.lastModified())); // 最后的修改时间
// System.out.println(f2.renameTo(new File("employee.ser")));// 文件重命名
System.out.println(Arrays.toString(f1.list())); // 以字符串数组的形式,返回当前文件夹下的所有文件(不包含子文件及子文件夹)
System.out.println(Arrays.toString(f1.listFiles())); // 以文件数组的形式,返回当前文件夹下的所有文件(不包含子文件及子文件夹)
// 以字符串形式返回获取所在文件夹
System.out.println(f1.getParent());
// 以文件形式返回获取所在文件夹
f2.getParentFile();
// 创建文件夹,如果父文件夹skin不存在,创建就无效
f1.mkdir();
// 创建文件夹,如果父文件夹skin不存在,就会创建父文件夹
f1.mkdirs();
// 创建一个空文件,如果父文件夹skin不存在,就会抛出异常
f1.createNewFile();
// 所以创建一个空文件之前,通常都会创建父目录
f1.getParentFile().mkdirs();
// 列出所有的盘符c: d: e: 等等
f1.listRoots();
// 刪除文件
f.delete();
// JVM结束的时候,刪除文件,常用于临时文件的删除
f.deleteOnExit()
}
}
2. 读取和写入文件数据
2.1 以字节流方式
2.1.1 读取数据
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class TestStream {
public static void main(String[] args) {
try {
//准备文件lol.txt其中的内容是AB,对应的ASCII分别是65 66
File f =new File("d:/lol.txt");
//创建基于文件的输入流
FileInputStream fis =new FileInputStream(f);
//创建字节数组,其长度就是文件的长度
byte[] all =new byte[(int) f.length()];
//以字节流的形式读取文件所有内容
fis.read(all);
for (byte b : all) {
//打印出来是65 66
System.out.println(b);
}
//每次使用完流,都应该进行关闭
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2.1.2 写入数据
package com.ljw.practice;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
File f = new File("d:/xyz/abc/def/lol2.txt");
f.getParentFile().mkdirs();
try {
FileOutputStream outputFile = new FileOutputStream(f);
String s = "秋天,多了一些思念";
byte[] b = s.getBytes(); // 将字符串转换为字节数组byte[]
outputFile.write(b);
outputFile.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2.2 以字符流方式
2.2.1 读取数据
package com.ljw.practice;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class FileDemo {
public static void main(String[] args) {
File f = new File("d:/lol.txt");
try(FileReader fr = new FileReader(f)){ // 数据流写在try()里面,系统会帮我们自动关闭数据流
char[] c = new char[(int) f.length()];
fr.read(c);
for(char i:c) {
System.out.print(i);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2.2.2 写入数据
package com.ljw.practice;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class FileDemo {
public static void main(String[] args) {
File f = new File("d:/lol.txt");
File f2 = new File("d:/lol2.txt");
try(FileReader fr = new FileReader(f);FileWriter fw = new FileWriter(f2)){
char[] c = new char[(int) f.length()];
fr.read(c); // 读出数据到字符数组
fw.write(c); // 写入数据从数组到文件
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2.3 以缓存流方式
- 缓存流必须建立在一个存在的流的基础上
- 以介质是硬盘为例,字节流和字符流的弊端:在每一次读写的时候,都会访问硬盘。 如果读写的频率比较高的时候,其性能表现不佳。
- 为了解决以上弊端,采用缓存流。缓存流在读取的时候,会一次性读较多的数据到缓存中,以后每一次的读取,都是在缓存中访问,直到缓存中的数据读取完毕,再到硬盘中读取。
- 如果需要立即将缓存中的数据写入硬盘,可以使用
flush()
方法
2.3.1 读取数据
package stream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class TestStream {
public static void main(String[] args) {
File f = new File("d:/lol.txt");
// 创建文件字符流
// 缓存流必须建立在一个存在的流的基础上
try (
FileReader fr = new FileReader(f);
BufferedReader br = new BufferedReader(fr);
)
{
while (true) {
// 一次读一行
String line = br.readLine();
if (null == line)
break;
System.out.println(line);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2.3.2 写入数据
package com.ljw.practice;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class FileDemo {
public static void main(String[] args) {
File f = new File("d:/lol2.txt");
try (
// 创建文件字符流
FileWriter fw = new FileWriter(f);
// 缓存流必须建立在一个存在的流的基础上
PrintWriter pw = new PrintWriter(fw);
) {
pw.println("garen kill teemo");
pw.println("teemo revive after 1 minutes");
pw.println("teemo try to garen, but killed again");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2.4 以数据流方式
- 使用数据流的writeUTF()和readUTF() 可以进行数据的格式化顺序读写
- 要用DataInputStream 读取一个文件,这个文件必须是由DataOutputStream 写出的,否则会出现EOFException,因为DataOutputStream 在写出的时候会做一些特殊标记,只有DataInputStream 才能成功的读取。
2.4.1 实例
- 以数据流的方式读写数据
package com.ljw.practice;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileDemo {
public static void main(String[] args) {
write();
read();
}
private static void read() {
File f = new File("d:/lol2.txt");
try(
FileInputStream fi = new FileInputStream(f);
DataInputStream di = new DataInputStream(fi); // 创建一个数据流对象
)
{
boolean b = di.readBoolean();
int i = di.readInt();
String s = di.readUTF();
System.out.println(b);
System.out.println(i);
System.out.println(s);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
private static void write() {
File f = new File("d:/lol2.txt");
try(
FileOutputStream fo = new FileOutputStream(f);
DataOutputStream dos = new DataOutputStream(fo);
)
{
dos.writeBoolean(false);
dos.writeInt(200);
dos.writeUTF("中国");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2.5 以对象流(序列化对象)
- 把一个对象序列化有一个前提是:这个对象的类,必须实现了Serializable接口
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import charactor.Hero;
public class TestStream {
public static void main(String[] args) {
//创建一个Hero garen
//要把Hero对象直接保存在文件上,务必让Hero类实现Serializable接口
Hero h = new Hero();
h.name = "garen";
h.hp = 616;
//准备一个文件用于保存该对象
File f =new File("d:/garen.lol");
try(
//创建对象输出流
FileOutputStream fos = new FileOutputStream(f);
ObjectOutputStream oos =new ObjectOutputStream(fos);
//创建对象输入流
FileInputStream fis = new FileInputStream(f);
ObjectInputStream ois =new ObjectInputStream(fis);
) {
oos.writeObject(h);
Hero h2 = (Hero) ois.readObject();
System.out.println(h2.name);
System.out.println(h2.hp);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
3. 拆分文件 和 合并文件
3.1 拆分文件
package com.ljw.practice;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
File file = new File("d:/F.docx");
try {
FileInputStream inFile = new FileInputStream(file);
int i = 1;
while(true) {
byte[] b = new byte[1024*100];
int n = inFile.read(b);
if(n==-1) { // 没有读到数据返回 -1
break;
}
File f1 = new File(String.format("d:/F-%d.docx",i)); // 占位符
FileOutputStream outFile = new FileOutputStream(f1);
outFile.write(b);
i++;
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
3.2 合并文件
package com.ljw.practice;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
File newF = new File("d:/newF.docx");
try {
FileOutputStream outNewF = new FileOutputStream(newF);
for(int i=1;i<5;i++) {
File f = new File(String.format("d:/F-%d.docx", i));
byte[] b = new byte[(int) f.length()];
FileInputStream inf = new FileInputStream(f);
inf.read(b);
outNewF.write(b);
inf.close();
}
outNewF.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
4. 中文问题
package com.ljw.practice;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class FileDemo {
public static void main(String[] args) {
File f = new File("d:/lol.txt");
try (FileInputStream fis = new FileInputStream(f);) {
byte[] all = new byte[(int) f.length()];
fis.read(all);
//文件中读出来的数据是
System.out.println("文件中读出来的数据是:");
for (byte b : all)
{
int i = b&0xff; //只取16进制的后两位
System.out.println(Integer.toHexString(i));
}
System.out.println("把这个数字,放在GBK的棋盘上去:");
String str = new String(all,"GBK");
System.out.println(str);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
综合练习
- 复制文件或文件夹
- 查找指定的内容
package com.ljw.practice;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
public class FilePractice {
public static void main(String[] args) {
//----------复制文件--------------
File srcFile = new File("d:/lol.txt");
File destFile = new File("d:/lol3.txt");
copyFile(srcFile,destFile);
//----------复制文件夹------------
File srcFolder = new File("d:/xyz");
File destFolder = new File("d:/xyz-副本");
copyFolder(srcFolder,destFolder);
//----------查找---------------
String s = "hello";
findFileContent(s, srcFolder);
}
/**
* 复制文件
* @param srcFile:源文件
* @param destFile:目标文件
* @return void
*/
public static void copyFile(File srcFile, File destFile) {
if(srcFile.exists()) {
try(
// 创建读取文件流对象
FileInputStream fi = new FileInputStream(srcFile);
// 创建写入文件流对象
FileOutputStream fo = new FileOutputStream(destFile);
)
{
byte[] b = new byte[10];
int i;
while(true) {
i = fi.read(b);
if(-1==i) {
break;
}
fo.write(b,0,i);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else {
System.out.println("文件不存在");
}
}
/**
* 复制文件夹
* @param srcFile
* @param destFile
*/
public static void copyFolder(File srcFile, File destFile) {
if(srcFile.isDirectory()) {
File[] files = srcFile.listFiles();
destFile.mkdir();
for(File f:files) {
if(f.isDirectory()) {
String newFolderPath = destFile.getAbsolutePath()+"\\"+f.getName();
File newFolder = new File(newFolderPath);
newFolder.mkdir();
System.out.println("新文件夹的位置是:"+newFolderPath);
copyFolder(f,newFolder);
}else {
String newFilePath = destFile.getAbsolutePath()+"\\"+f.getName();
System.out.println("新文件的位置是:"+newFilePath);
File newF = new File(newFilePath);
copyFile(f,newF);
}
}
}else {
copyFile(srcFile, destFile);
}
}
/**
* 查找指定的文件内容
* @param s:要查找的字符串
* @param file:要查找的文件对象
*/
public static void findFileContent(String s,File file) {
if(file.isDirectory()) {
File[] files = file.listFiles();
for(File f:files) {
findFileContent(s,f);
}
}else {
try(
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
) {
while(true) {
String str = br.readLine();
if(null == str) {break;}
if(str.contains(s)) {
System.out.println("找到目标字符串"+s+",在文件:"+file.getAbsolutePath());
break;
}
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
文件 File的更多相关文章
- Android studio 菜单介绍 3.1.文件(File)
文件(File) 3.1.1.New 1. Android Studio中的Project相当于Eclipse中的Workspace 3.1.5.Close Prject 关闭当前项目打开的窗口 2. ...
- 文件File
前面的话 不能直接访问用户计算机中的文件,一直都是Web应用开发中的一大障碍.2000年以前,处理文件的唯一方式就是在表单中加入<input type="file">字 ...
- c#中字节数组byte[]、图片image、流stream,字符串string、内存流MemoryStream、文件file,之间的转换
字节数组byte[]与图片image之间的转化 字节数组转换成图片 public static Image byte2img(byte[] buffer) { MemoryStream ms = ne ...
- Java笔记:Java 流(Stream)、文件(File)和IO
更新时间:2018-1-7 12:27:21 更多请查看在线文集:http://android.52fhy.com/java/index.html java.io 包几乎包含了所有操作输入.输出需要的 ...
- Java文件File类学习总结
java.io.File类 代表文件和目录,在开发中,读取文件.生成文件.删除文件.修改文件的属性都会用到该类. 常见构造方法: public File(String pathName){} 以pat ...
- java学习笔记(九):Java 流(Stream)、文件(File)和IO
Java 的控制台输入由 System.in 完成. 为了获得一个绑定到控制台的字符流,你可以把 System.in 包装在一个 BufferedReader 对象中来创建一个字符流.需要import ...
- Go标准库之读写文件(File)
Go标准库之读写文件(File) 创建一个空文件 package main import ( "log" "os" ) func main() { file, ...
- Java - 17 Java 流(Stream)、文件(File)和IO
Java 流(Stream).文件(File)和IO Java.io包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. Java.io包中的流支持很多种格式,比如:基本类型. ...
- 文件 File 常见操作 工具 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- Java总结:Java 流(Stream)、文件(File)和IO
更新时间:2018-1-7 12:27:21 更多请查看在线文集:http://android.52fhy.com/java/index.html java.io 包几乎包含了所有操作输入.输出需要的 ...
随机推荐
- java并发之内存模型
java内存模型知识导图 一 并发问题及含义 并发编程存在原子性.可见性.有序性问题. 原子性即一系列操作要么都执行,要么都不执行. 可见性,一个线程对共享变量的修改,另一个线程可能不会马上看到. ...
- .netCore+Vue 搭建的简捷开发框架 (4)--NetCore 基础 -2
上节中,我们初步的介绍了一下NetCore的一些基础知识,为了控制篇幅(其实也是因为偷懒),我将NetCore 基础分为两部分来写. 0.WebAPI 项目的建立 1..NetCore 项目执行(加载 ...
- 洛谷 P3745 [六省联考2017]期末考试
题目描述 有 nnn 位同学,每位同学都参加了全部的 mmm 门课程的期末考试,都在焦急的等待成绩的公布. 第 iii 位同学希望在第 tit_iti 天或之前得知所有课程的成绩.如果在第 tit_ ...
- 用go语言爬取珍爱网 | 第二回
昨天我们一起爬取珍爱网首页,拿到了城市列表页面,接下来在返回体城市列表中提取城市和url,即下图中的a标签里的href的值和innerText值. 提取a标签,可以通过CSS选择器来选择,如下: $( ...
- 超炫酷的 IntelliJ IDEA 插件(一)
工善其事必先利器 打开setting文件选择Plugins选项 Ctrl + Alt + S File -> Setting 我的idea是最新版本2019.02 有的和别人界面可能不一样 主界 ...
- 配置VC++2010的glut库
VC++2010是一个成熟稳定的版本,微软的编译工具Visual Studio系列从VC6到如今的VC2019,功能非常强大,我们在开始学习C++和计算机图形学的时候,一般入手<<C++P ...
- 从零起步 系统入门Python爬虫工程师 ✌✌
从零起步 系统入门Python爬虫工程师 (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌) 大数据时代,python爬虫工程师人才猛增,本课程专为爬虫工程师打造, ...
- 域渗透-凭据传递攻击(pass the hash)完全总结
总结下PtH具体形式(wmicexec.powershell.msf等) 0x01 PtH攻击原理 && 黄金白银票据 PtH攻击原理 wiki https://en.wikiped ...
- 实验吧之【who are you?】(时间盲注)
地址:http://ctf5.shiyanbar.com/web/wonderkun/index.php 这道题点开看见your ip is :xxx.xxx.xx.xxx 试了一些 最后发现是XFF ...
- Neo4j:图数据库GraphDB(一)入门和基本查询语句
图数据库的代表:Neo4j 官网: http://neo4j.com/ 引言:为什么使用图数据库 在很多新型项目中,应用图数据库已经是势在必行的趋势了,因为图数据库可以很好的表示各种节点与关系的概念 ...