一、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) / ))
.divide(new BigDecimal(), ,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 = ; 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 > && files != null){
for(int i = ; 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,true);
//要输出的数据
String msg = "Hello world.\r\n";
//将字符串转换为字节数组
byte [] data = msg.getBytes();
//输出字节数组
for(int i = ; 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[];//此数组用于接受全部输入数据
int len = input.read(data);//将数据保存到数组中
System.out.println(""+new String(data, , 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[];//此数组用于接受全部输入数据
int temp = ;//定义每次读取进来的数据
int foot = ;//定义数组角标
//(temp = input.read()) != -1 判断temp是否等于-1,如果不是则继续读
while((temp = input.read()) != -){
data[foot++] = (byte) temp;
}
input.close();
//打印
System.out.println(new String(data, , 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[];
int len = in.read(data);
in.close();
System.out.println(new String(data,,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类、字节流和字符流的更多相关文章

  1. java IO(五):字节流、字符流的选择规律

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  2. Java中常用的字节流和字符流

    IO流(输入流.输出流) 字节流.字符流 1.字节流: InputStream.OutputStream InputStream抽象了应用程序读取数据的方式: OutputStream抽象了应用程序写 ...

  3. java:I/O 字节流和字符流

    字节流 InputStream和OutputStream的子类:FileInputStream 和 FileOutputStream 方法: int read(byte[] b,int off,int ...

  4. Java 带缓冲的字节流和字符流

    输入流就是文件从硬盘到内存的中间媒介,那么输出流就是文件从内存到硬盘的中间媒介.首先来看看FileOutputStream的继承了哪些类, java.lang.Object java.io.Outpu ...

  5. Java IO(2)阻塞式输入输出(BIO)的字节流与字符流

    在上文中<Java IO(1)基础知识——字节与字符>了解到了什么是字节和字符,主要是为了对Java IO中有关字节流和字符流有一个更好的了解. 本文所述的输出输出指的是Java中传统的I ...

  6. Java的字节流,字符流和缓冲流对比探究

    目录 一.前言 二.字节操作和字符操作 三.两种方式的效率测试 3.1 测试代码 3.2 测试结果 3.3 结果分析 四.字节顺序endian 五.综合对比 六.总结 一.前言 所谓IO,也就是Inp ...

  7. 深入理解JAVA I/O系列三:字符流详解

    字符流为何存在 既然字节流提供了能够处理任何类型的输入/输出操作的功能,那为什么还要存在字符流呢?容我慢慢道来,字节流不能直接操作Unicode字符,因为一个字符有两个字节,字节流一次只能操作一个字节 ...

  8. JAVA IO分析一:File类、字节流、字符流、字节字符转换流

    因为工作事宜,又有一段时间没有写博客了,趁着今天不是很忙开始IO之路:IO往往是我们忽略但是却又非常重要的部分,在这个讲究人机交互体验的年代,IO问题渐渐成了核心问题. 一.File类 在讲解File ...

  9. IO流(File类,IO流的分类,字节流和字符流,转换流,缓冲流,对象序列化)

    1.File类 File类可以在程序中 操作文件和目录.File类是通过建立File类对象,在调用File类的对象来进行相关操作的. 示例: public class Demo01 { public  ...

随机推荐

  1. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记2——透明贴图,动画技术

    第5章 透明贴图 像这样直接贴图会产生这种情况,所以我们需要透明贴图. 透明遮罩法:主要利用BitBlt函数中Raser(光栅)值的运算,需要准备素材图和遮罩图: 这个方法的原理解释见书131页. 示 ...

  2. hdu 3667(最小费用最大流+拆边)

    Transportation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  3. Win7下安装Oracle 10g

    首先下对版本,Oracle 10g支持Win7版(32位): 10203_vista_w2k8_x86_production_db.zip 10203_vista_w2k8_x86_productio ...

  4. python中执行shell命令的几个方法小结(转载)

    转载:http://www.jb51.net/article/55327.htm python中执行shell命令的几个方法小结 投稿:junjie 字体:[增加 减小] 类型:转载 时间:2014- ...

  5. web服务器解析漏洞总结(转)

    转:http://www.secpulse.com/archives/3750.html 解析漏洞总结 2015 /1/27 22:09 一.IIS 5.x/6.0解析漏洞 IIS 6.0解析利用方法 ...

  6. websocket初步了解

    https://www.cnblogs.com/fuqiang88/p/5956363.html websocket是一种新型的协议,协议标识符为ws,加密即为wss 简单说来就是一种持续的http服 ...

  7. POJ 1062 昂贵的聘礼 【带限制的最短路/建模】

    年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:" ...

  8. TensorFlow-GPU安装配置(win10+tensorflow1.6+CUDA9.0+cudnn7.0+python3.6+Visual Studio2013)

    安装步骤: TensorFlow官网 tensorflow一般只能装在python3上,CUDA9.0搭配cudnn7.0,CUDA8.0搭配cudnn6.0 查看对应要安装的环境版本(因为会不断更新 ...

  9. 07.C#中如何排除/过滤/清空/删除掉字符串数组中的空字符串

    方式一:使用lambda表达式筛选过滤掉数组中空字符串         1 /// <summary> /// 使用lambda表达式排除/过滤/清空/删除掉字符串数组中的空字符串 /// ...

  10. sqlldr load UTF8 error

    The default length semantics for all datafiles (except UFT-16) is byte. So in your case you have a C ...