file.separator java_关于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();只能在已近存在的目录中创建文件夹

importjava.io.File;importjava.io.IOException;public classTestFile {public static void main(String [] args) throwsIOException{

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);

importjava.io.File;importjava.math.BigDecimal;importjava.text.SimpleDateFormat;public classTestFileOne {public static voidmain(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();

importjava.io.File;public classTestFileTwo {public static voidmain(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]);

}

}

}

}

列出指定目录中的所有文件(包含所有子目录中的文件),递归调用

importjava.io.File;public classTestFileThree {public static voidmain(String [] args){

File file= new File("G:" + File.separator + "Test");

print(file);

}public static voidprint(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,追加;

对文件进行覆盖的输出操作:

packagecom.java.io;importjava.io.File;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.OutputStream;public classTestFile {public static void main(String [] args) throwsIOException{

File file= new File("G:" + File.separator + "Test" + File.separator + "demo.txt");if(!file.getParentFile().exists()){

file.getParentFile().mkdirs();

}//通过OutputStream的子类对象为父类对象实例化

OutputStream output = newFileOutputStream(file);//要输出的数据

String msg = "Hello world.";//将字符串转换为字节数组

byte [] data =msg.getBytes();//输出字节数组

output.write(data);

output.flush();//关闭

output.close();

}

}

不管执行几次,都是对当前文件的覆盖。如果不想覆盖,可以使用追加的方式创建FileOutputStream类对象

.追加内容:OutputStream output = new FileOutputStream(file, true);

单个字节:

packagecom.java.io;importjava.io.File;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.OutputStream;public classTestFile {public static void main(String [] args) throwsIOException{

File file= new File("G:" + File.separator + "Test" + File.separator + "demo.txt");if(!file.getParentFile().exists()){

file.getParentFile().mkdirs();

}//通过OutputStream的子类对象为父类对象实例化

OutputStream output = newFileOutputStream(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读取数据

packagecom.java.io;importjava.io.File;importjava.io.FileInputStream;importjava.io.InputStream;public classTestFileOne {public static void main(String[] args) throwsException {

File file= new File("G:"+File.separator+"Test"+File.separator+"demo.txt");if(file.exists()){//文件存在

InputStream input = newFileInputStream(file);byte [] data = new byte[1024];//此数组用于接受全部输入数据

int len = input.read(data);//将数据保存到数组中

System.out.println(""+new String(data, 0, len));

input.close();

}

}

}

实际开发中使用while循环读取

packagecom.java.io;importjava.io.File;importjava.io.FileInputStream;importjava.io.InputStream;public classTestFileOne {public static void main(String[] args) throwsException {

File file= new File("G:"+File.separator+"Test"+File.separator+"demo.txt");if(file.exists()){//文件存在

InputStream input = newFileInputStream(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子类

packagecom.java.io;importjava.io.File;importjava.io.FileWriter;importjava.io.IOException;importjava.io.Writer;public classTestFileWriter {public static void main(String [] args) throwsIOException{

File file= new File("G:"+File.separator+"Test"+File.separator+"fileWrite.txt");if(!file.getParentFile().exists()){

file.getParentFile().mkdirs();

}

Writer out= newFileWriter(file);

String msg= "Hello world.";

out.write(msg);

out.close();

}

}

4、字符输入流

Reader是负责字符数据读取的,使用read()方法实现读取,但没有直接返回String类型的读取操作

·读取数据:public int read(char [] cbuf) throws IOException;

packagecom.java.io;importjava.io.File;importjava.io.FileReader;importjava.io.IOException;importjava.io.Reader;public classTestFileWriterOne {public static void main(String [] args) throwsIOException{

File file= new File("G:"+File.separator+"Test"+File.separator+"fileWrite.txt");if(file.exists()){

Reader in= newFileReader(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类输出的如果没有关闭,那么保存在缓冲区之中的数据将无法输出,或者强制刷新缓冲区。

packagecom.java.io;importjava.io.File;importjava.io.FileWriter;importjava.io.IOException;importjava.io.Writer;public classTestWriter {public static void main(String [] args) throwsIOException{

File file= new File("G:"+File.separator+"Test"+File.separator+"fileWrites.txt");if(!file.getParentFile().exists()){

file.getParentFile().mkdirs();

}

Writer out= newFileWriter(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类实例。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: java file.separatorJava中的一个常量,表示文件路径分隔符。在Windows系统中,文件路径分隔符为“\”,而在Unix/Linux系统中,文件路径分隔符为“/”。使用java file.separator可以使Java程序在不同的操作系统中正确地处理文件路径。 ### 回答2: Javafile.separator是一个系统属性,它用于表示操作系统中文件路径的分隔符。 在 Windows 操作系统中,路径分隔符是反斜杠("\"),所以在使用 Java 代码访问文件时,我们可以使用 file.separator 来保证路径的正确性。例如,使用 System.getProperty("file.separator") 可以获取到当前操作系统的路径分隔符。 在 Linux、Unix 或 Mac 操作系统中,路径分隔符是正斜杠("/"),同样地,使用 file.separator 可以确保我们在编写跨平台的 Java 代码时,文件路径的正确性。 例如,假设我们要在 Windows 操作系统下创建一个名为"data.txt"的文件,我们可以使用如下代码: String filePath = "C:" + System.getProperty("file.separator") + "data.txt"; File file = new File(filePath); file.createNewFile(); 同样地,在 Linux、Unix 或 Mac 操作系统下,我们只需要修改路径分隔符即可: String filePath = "/home/user/data.txt"; File file = new File(filePath); file.createNewFile(); 通过使用 file.separator,我们可以在不同操作系统上保持代码的通用性和可移植性。这是非常重要的,特别是当我们的应用程序需要在不同的操作系统上运行时。 ### 回答3: 在Java编程语言中,file.separator是一个系统属性,用于表示文件路径分隔符。 在不同的操作系统中,文件路径的分隔符是不同的。例如在Windows系统中,文件路径使用反斜杠(\)作为分隔符;而在Unix或Linux系统中,文件路径使用斜杠(/)作为分隔符。 使用file.separator属性可以让程序在不同操作系统上都能正确地处理文件路径。通过在代码中调用System.getProperty("file.separator"),可以获取当前操作系统的文件路径分隔符。 例如,在Windows系统上,可以使用以下代码获取文件路径分隔符: String separator = System.getProperty("file.separator"); 然后可以将分隔符用于构建文件路径: String filePath = "C:" + separator + "myFolder" + separator + "myFile.txt"; 这样,在不同的操作系统上运行代码时,会根据不同的文件路径分隔符自动适应。 使用file.separator属性可以增加代码的可移植性,使得程序可以在不同操作系统上运行而无需修改代码。因此,在处理文件路径时,使用file.separator是一个良好的编程实践。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值