关于Java的File.separator
一、File类
在Windows下的路径分隔符(\)和在Linux下的路径分隔符(/)是不一样的,当直接使用绝对路径时,跨平台会报No Such file or diretory异常。
File中还有几个与separator类似的静态常量,与系统有关,在编程中应尽量使用。
ps:File file = new File("G:"+ File.separator +"demo.txt");
File类是java.io包中唯一一个与文件本身操作有关的类,文件本身操作是指文件的创建、删除、重命名等
.构造方法:public File(String pathName),传入完整的路径,WEB开发此方式比较好用。
.构造方法:public File(File parent,String child),传入父路径和子路经。
基本的文件操作:
.创建新文件:public boolean createNewFile() throws IOException;
.删除文件:public boolean delete();
.判断文件是否存在:public boolean exists();
import java.io.File;
import java.io.IOException;public class TestFile {public static void main(String [] args) throws IOException{File file = new File("G:\\demo.txt");System.out.println("file:"+file);if(file.exists()){file.delete();System.out.println("执行了删除文件!");}else{file.createNewFile();System.out.println("执行了创建文件");}}
}
如果进行文件创建时有目录,则需要先创建目录之后才可以创建文件。
.找到父路径:public File getParentFile();
.创建目录:(1)public boolean mkdirs();既可以在不存在的目录中创建文件夹又可以创建多级目录(个人推荐使用此方法)
(2)public boolean mkdir();只能在已近存在的目录中创建文件夹
import java.io.File; import java.io.IOException;public class TestFile {public static void main(String [] args) throws IOException{File file = new File("G:"+ File.separator +"Test"+ File.separator +"TestFile"+ File.separator +"demo.txt");if(!file.getParentFile().exists()){//文件不存在 file.getParentFile().mkdirs();System.out.println("执行了创建多级目录");}if(file.exists()){//文件存在 file.delete();System.out.println("执行了删除文件!");}else{file.createNewFile();System.out.println("执行了创建文件");}} }
除了上述基本的文件和文件夹的操作之外,还提供了一些取得文件信息的方法:
.判断路径是否是文件:public boolean isFile();
.判断路径是否是文件夹:public boolean isDirectory();
.最后一次修改时间:public long lastModified();
.取得文件大小:public long length();
.修改文件名称:public boolean renameTo(File dest);
import java.io.File; import java.math.BigDecimal; import java.text.SimpleDateFormat;public class TestFileOne {public static void main(String [] args){File file = new File("G:"+ File.separator +"Test"+ File.separator +"TestFile"+ File.separator +"1.jpg");if(file.exists()){System.out.println(file.isDirectory()? "是文件夹" : "不是文件夹");System.out.println(file.isFile() ? "是文件" : "不是文件");System.out.println("最后修改时间:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(file.lastModified()));System.out.println("文件大小:"+ new BigDecimal((file.length() / (double) 1024 / 1024)).divide(new BigDecimal(1), 2,BigDecimal.ROUND_HALF_UP) + "M");if(file.renameTo(new File("G:"+ File.separator +"Test"+ File.separator +"TestFile"+ File.separator +"hello.jpg"))){System.out.println("重命名成功");}else{System.out.println("重命名失败");}}} }
列出指定文件夹中的所有内容:
public File [] listFiles();
import java.io.File;public class TestFileTwo {public static void main(String [] args){File file = new File("G:" + File.separator + "Test");if(file.exists() && file.isDirectory()){File [] list = file.listFiles();for(int i = 0; i < list.length; i ++){System.out.println("files:"+list[i]);}}} }
列出指定目录中的所有文件(包含所有子目录中的文件),递归调用
import java.io.File;public class TestFileThree {public static void main(String [] args){File file = new File("G:" + File.separator + "Test");print(file);}public static void print(File file){if(file.exists() && file.isDirectory()){File [] files = file.listFiles();if(files.length > 0 && files != null){for(int i = 0; i < files.length; i++){print(files[i]);//递归调用}}}System.out.println(file);} }
二、字节流与字符流
使用File类只能进行文件本身的操作,但是与内容的操作无关。如果想进行文件内容操作可以使用一下两组流:
.字节流InputStream OutputStream
.字符流reader writer
不管使用哪种流,基本的操作流程是一样的,以文件操作为例:
.确定操作文件的路径
.通过字节流或字符流的子类为字节流和字符流类对象实例化
.进行流入、流出操作
.关闭流,流属于资源操作,资源操作完成一定要关闭
1、字节输入流:OutputStream
java.io.OutputStream是可以进行字节数据(byte)的输出
OutputStream类中存在三个write()方法:
·输出单个字节:public void write(int b);
·输出全部字节:public void write(byte [] b);
·输出部分字节:public void write(byte [] b,int off,int len);
OutputStream是一个抽象类,所以可以使用子类对其进行实例化。对文件操作,可以使用FileOutputStream,这个类有两个常用的构造方法:
public FileOutputStream(File file) throws FileNotFoundException,覆盖;
public FileOutputStream(File file, boolean append) throws FileNotFoundException,追加;
对文件进行覆盖的输出操作:
package com.java.io; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream;public class TestFile {public static void main(String [] args) throws IOException{File file = new File("G:" + File.separator + "Test" + File.separator + "demo.txt");if(!file.getParentFile().exists()){file.getParentFile().mkdirs();}//通过OutputStream的子类对象为父类对象实例化OutputStream output = new FileOutputStream(file);//要输出的数据String msg = "Hello world.";//将字符串转换为字节数组byte [] data = msg.getBytes();//输出字节数组 output.write(data);output.flush();//关闭 output.close();} }
不管执行几次,都是对当前文件的覆盖。如果不想覆盖,可以使用追加的方式创建FileOutputStream类对象
.追加内容:OutputStream output = new FileOutputStream(file, true);
单个字节:
package com.java.io; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream;public class TestFile {public static void main(String [] args) throws IOException{File file = new File("G:" + File.separator + "Test" + File.separator + "demo.txt");if(!file.getParentFile().exists()){file.getParentFile().mkdirs();}//通过OutputStream的子类对象为父类对象实例化OutputStream output = new FileOutputStream(file);//要输出的数据String msg = "Hello world.\r\n";//将字符串转换为字节数组byte [] data = msg.getBytes();//输出字节数组for(int i = 0; i < data.length; i++){output.write(data[i]);}//关闭 output.close();} }
2、字节输入流:InputStream
在InputStream类中定义有三个read()方法:
·读取单个字节:public int read() throws IOException;
每次使用read()操作将读取一个字节数据,此时返回的是数据,如果数据已读完,则int返回-1
.读取内容到字节数组:public int read(byte [] b) throws IOException();
将内容读取到字节数组中,返回读取的个数,如果读取完毕,则返回-1
.读取内容到部分字节数组:public int read(byte [] b,int off,int len) throws IOException();
将指定长度的内容读取到字节数组中,返回读取个数,如果读取完毕,则返回-1
InputStream是抽象类,所以可以使用它的子类对其进行实例化。使用FileInputStream子类完成,其构造方法:
public FileInputStream(File file) throws FileNotFoundException;
使用InputStream读取数据
package com.java.io; import java.io.File; import java.io.FileInputStream; import java.io.InputStream;public class TestFileOne {public static void main(String[] args) throws Exception {File file = new File("G:"+File.separator+"Test"+File.separator+"demo.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();}} }
实际开发中使用while循环读取
package com.java.io; import java.io.File; import java.io.FileInputStream; import java.io.InputStream;public class TestFileOne {public static void main(String[] args) throws Exception {File file = new File("G:"+File.separator+"Test"+File.separator+"demo.txt");if(file.exists()){//文件存在InputStream input = new FileInputStream(file);byte [] data = new byte[1024];//此数组用于接受全部输入数据int temp = 0;//定义每次读取进来的数据int foot = 0;//定义数组角标//(temp = input.read()) != -1 判断temp是否等于-1,如果不是则继续读while((temp = input.read()) != -1){data[foot++] = (byte) temp;}input.close();//打印System.out.println(new String(data, 0, foot));}} }
3、字符输出流:Writer
字节输出流和字符输出流的区别:字节输出流是以byte类型为主,而字符输出流是以char为主,并且支持String的直接操作
Writer类中的操作方法:
·输出字符串:public void write(String str) throws IOException;
·输出字节数组:public void write(char [] cbuf) throws IOException;
但Writer是一个抽象类,如果使用它进行文件操作必须使用FileWriter子类
package com.java.io;import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.Writer;public class TestFileWriter {public static void main(String [] args) throws IOException{File file = new File("G:"+File.separator+"Test"+File.separator+"fileWrite.txt");if(!file.getParentFile().exists()){file.getParentFile().mkdirs();}Writer out = new FileWriter(file);String msg = "Hello world.";out.write(msg);out.close();} }
4、字符输入流
Reader是负责字符数据读取的,使用read()方法实现读取,但没有直接返回String类型的读取操作
·读取数据:public int read(char [] cbuf) throws IOException;
package com.java.io;import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.Reader;public class TestFileWriterOne {public static void main(String [] args) throws IOException{File file = new File("G:"+File.separator+"Test"+File.separator+"fileWrite.txt");if(file.exists()){Reader in = new FileReader(file);char [] data = new char[1024];int len = in.read(data);in.close();System.out.println(new String(data,0,len));}} }
两种读取操作本质上区别不打,只是字符操作的是String/char,而字节操作的是byte;
5、字节流和字符流的区别
·字符流:当程序进行中文处理时,字符流是最方便;
·字节流:当程序处理二进制数据(图片、音乐、电影)或网络数据传输,或者保存到磁盘数据一定是字节;
除以上区别之外,字节流在操作时直接与操作终端进行交互,而字符流需要经过缓冲区的处理后才可以进行操作,以OutputStream和Writer两个类输出文件为例,如果OutputStream输出的最后可以不关闭输出流,但是如果是Writer类输出的如果没有关闭,那么保存在缓冲区之中的数据将无法输出,或者强制刷新缓冲区。
package com.java.io;import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.Writer;public class TestWriter {public static void main(String [] args) throws IOException{File file = new File("G:"+File.separator+"Test"+File.separator+"fileWrites.txt");if(!file.getParentFile().exists()){file.getParentFile().mkdirs();}Writer out = new FileWriter(file);String msg = "Hello world,I am a programer.";out.write(msg);out.flush();//out.close(); } }
所谓缓冲区就是一块内存,当数据读取进来之后会先进入内存区域之中进行处理,所以才可以更好的处理中文
三、转换流
既然存在字节和字符两种操作流,那么两种操作流之间是可以进行相互转换的,主要使用两个类: InputStreamReader、OutputStreamWriter
InputStreamReader是Reader的子类,所以InputStreamReader类对象可以自动转型为Reader类实例。
OutputStreamWriter是Writer的子类,所以OutputStreamWriter类对象可以自动转型为Writer类实例。
转载于:https://www.cnblogs.com/lovefeng/p/4679035.html
关于Java的File.separator相关推荐
- java file.separator_关于Java的File.separator
一.File类 在Windows下的路径分隔符(\)和在Linux下的路径分隔符(/)是不一样的,当直接使用绝对路径时,跨平台会报No Such file or diretory异常. File中还有 ...
- Java:File.separator作用相当于 ‘ \ ‘
其实 File.separator 的作用相当于 ' \ ' 在 windows 中 文件文件分隔符用 ' \ ' 或者 ' / ' 都可以 但是在 Linux 中,是不识别 ' \ ' 的,而 Fi ...
- Java的File.separator
在Windows下的路径分隔符和Linux下的路径分隔符是不一样的,当直接使用绝对路径时,跨平台会暴出"No such file or diretory"的异常. 比如说要在tem ...
- java中separator_java - File.separator和路径中的斜杠之间的区别
java - File.separator和路径中的斜杠之间的区别 在Java Path-String中使用/和普通的File.separator有什么区别? 与双反斜杠相比,/平台独立似乎不是原因, ...
- (十一)java.io.File学习进阶及separator、pathSeparator分隔符简介
1.其中.号表示当前目录: File path = new File("."); 2.分割符 File.separator用来分割一个路径中的多个连续目录,在UNIX中表示为&qu ...
- java中separator_JAVA中file.separator ,path.separator,line.separator
在sun官方中文文档中,System.getProperty("")方法中有着这样的翻译: file.separator 文件分隔符(在 UNIX 系统中是"/" ...
- JAVA路径拼接File.separator
File.separator 在Windows中,斜杠用的是正斜杠 \,如C:\Program Files\image 在Linux中,斜杠用的是反斜杠 /,如usr/local/nginx 为了能更 ...
- 【Java】Java中的在Linux和Mac以及Windows上使用File.separator的坑
1.在写代码中使用File.separator,作文文件名的分割时,会报如下的错,这是在windows上运行的,但是Linux和Mac上是可以的 2.原因很简单,直接修改 修改为这样就可以了.
- java中对文件的操作,以及目录间隔符file.separator的使用
创建文件: File file = new File(路径,文件名); 文件或者目录是否存在: file.exists();//存在返回true 文件或者目录是否存在并且是否为标准文件: file.i ...
最新文章
- mastercam2019中文版
- freemaker if 多个条件_第4天|14天搞定Vue3.0,条件渲染和template
- 数据科学领域有哪些技术_领域知识在数据科学中到底有多重要?
- C#图解教程读书笔记(第3章 类型、存储及变量)
- python基于udp的网络聊天室再用tkinter显示_Python实现网络聊天室的示例代码(支持多人聊天与私聊)...
- 一个不能进入系统的小问题——供远程为别人解决问题时参考。
- plsql破解版,plsql安装包
- Matlab将散点绘制为平滑曲线的简单方法
- 老男孩教育33期周末班-决心书
- Oracle_Basic_Concept(RolePriviledge)
- 利用python画圆
- 微信网页授权获取用户基本信息 --- 20/03/16
- 升级Win11后Office无法验证此产品的许可证怎么办?
- 至联云讲解《IPFS凭什么能让全世界投资者疯狂》
- 为什么mac插入了u盘没反应 苹果mac插上usb后怎么找到
- vue脚手架的作用是什么?
- 智能分拣解决方案市场现状研究分析报告 -
- 天狼星-冬季大三角最亮的一颗星
- 与ERP有关的主要管理概念
- 狂神 MYSQL 笔记整理
热门文章
- 针对灰鸽子声明 金山“四问”灰鸽子工作室
- Web后端学习笔记Flask(2)模板
- C++数据结构与算法 竞赛树, 二叉搜索树
- No module named 'django.core.urlresolvers
- tensorflow2 目标检测_一文了解YOLO-v4目标检测
- erp生产管理系统流程_仁和ERP生产制造业ERP管理系统库存管理
- Selenium自动化测试-设置元素等待
- DeFi 衍生品平台 Deri Protocol 新增三家投资者
- SAP License:ERP的意义
- PKU 3013 Big Christmas Tree 最短路 spfa