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();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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类实例。
Java的File.separator的更多相关文章
- 关于Java的File.separator
在Windows下的路径分隔符和Linux下的路径分隔符是不一样的,当直接使用绝对路径时,跨平台会暴出“No such file or diretory”的异常. 比如说要在temp目录下建立一个te ...
- java关于File.separator
写好代码在模拟环境下测试,完全没问 题:但linux+tomcat下用的时候,却老是报告“No such file or diretory ”的异常,上传不了.后来发现是文件路径的问题.我的模拟测试环 ...
- java.io.File中的pathSeparator与separator的差异
先总的说一下区别: File.pathSeparator指的是分隔连续多个路径字符串的分隔符,例如: java -cp test.jar;abc.jar HelloWorld 就是指";&q ...
- java.io.File中的pathSeparator与separator的区别
先总的说一下区别:File.pathSeparator指的是分隔连续多个路径字符串的分隔符,例如:java -cp test.jar;abc.jar HelloWorld就是指“;” Fi ...
- java 路径分隔符File.separator 以及 路径两种写法"/"和"\\"
一.File.separator File file=new File(); 这句是新建一个文件.file.separator这个代表系统目录中的间隔符,说白了就是斜线,不过有时候需要双线,有时候是单 ...
- java.io.File中的 pathSeparator 与separator 的区别
先总的说一下区别: File.pathSeparator指的是分隔连续多个路径字符串的分隔符,例如: java -cp test.jar;abc.jar HelloWorld 就是指“;” ...
- java中的File.separator
前些天遇到一个问题,困扰了好久,现在终于解决了. 问题:上传的图片不能正确显示. 我的开发环境是在Windows下,工程在Windows下能正常部署,上传的图片也可以正常的显 示.但是把工程部署在服务 ...
- java File.separator 简介
在Windows下的路径分隔符和Linux下的路径分隔符是不一样的,当直接使用绝对路径时,跨平台会暴出“No such file or diretory”的异常. 比如说要在temp目录下建立一个te ...
- Java File.separator
在Windows下的路径分隔符和Linux下的路径分隔符是不一样的,当直接使用绝对路径时,跨平台会暴出“No such file or diretory”的异常. 比如说要在temp目录下建立一个te ...
随机推荐
- 学习笔记22—PS小技巧
1.将图片四角变弧形:菜单-->选择-->平滑-->设置参数: 2.画曲线的方法是: 1)选择钢笔工具, 2)工具属性选择路径:用钢笔点下路径的起点,点下即松开鼠标:在下一个锚点,点 ...
- js,java时间处理
1.JS获取时间格式为“yyyy-MM-dd HH:mm:ss”的字符串 function getTimeStr(){ var myDate = new Date(); var year = myDa ...
- QT json字符串生成和解析
1 QT json字符串生成和解析 1.1 QT Json解析流程 (1) 字符串转化为QJsonDocument QJsonParseError json_error; QJso ...
- Yandex.Algorithm 2018, final round
Yandex.Algorithm 2018, final round A Smart Vending B LIS vs. LDS C Eat And Walk D Search Engine E Gu ...
- sgu 203 Hyperhuffman
题意:给出字符出现的次数,问替换成哈夫曼编码后的文本长度. 实际上观察发现就等于树的所有节点的和.用nlogn超时.用O(n),用两个队列,一个放原始数组,一个放新生成的节点. #include &l ...
- vue, vux调用微信点击图片,上传图片,删除图片,接口,其中选图接口,苹果手机显示有问题,查看不到图片,提交会提示fail not exist,解决如下
<template> <div v-cloak v-show="show"> <div v-show="mailbox"> ...
- CentOS7 下源代码安装php7
安装PHP7: php-7.1.2.tar.gz:下载:wget http://cn2.php.net/get/php-7.1.2.tar.gz/from/this/mirror 安装php: # t ...
- Numpy常用API
目录 一.输入和输出 1.1 NumPy二进制文件(NPY,NPZ) 1.2 文本文件 1.3 正则表达式解析 1.4 原始二进制文件 1.5 内存映射文件 1.6 Base-n相关 1.7 数据源 ...
- python记录_day15 面向对象初识
一.面向过程和面向对象 1.面向过程 以我为中心,做一件事先干什么,在干什么,后干什么,有一套清楚完整的流程.核心是“过程”. 优点:将要解决的问题流程化, 编写相对简单 缺点:可扩展性差 2.面向对 ...
- DVWA-CSRF
Low等级 image 抓包 image 正常跳转 image image 在这里我们把密码改为qwer image image image image image ...