Java基础-IO流

IO流本身是用来做文件输入输出的。

一、File类

1.File类简介

File类是java.io包下用来操作文件和目录的类。File类可以新建、删除文件和目录,但是不能访问文件内容本身,如果需要访问文件内容本身,则需要使用IO

 

2.File类常用的构造方法

        File没有无参的构造方法。操作每一个文件/文件夹都要对应一个对象。

1)File(String path) //输入路径及文件名。以pathname为路径创建File对象。反斜杠需要转义。

File file = new File(“C:\\worker” + File.separator + “log\\a.jpg”);

File.separator来代替斜杠,会有更好的跨平台性。

2)File(String path, String name)   //父路径,子文件夹/文件名创建。

3)File(File file, String name)       //父对象,子文件夹/文件名创建。

 

3.File的常用方法

1)访问文件名、文件路径

String getName(); // 返回此File对象所表示的文件名或路径名

String getPath();   //返回此File对象所对应的路径名

Flie getAbsoluteFile();  //返回此对象所对应的绝对路径所对应的File对象

String getParent();  //返回此File对象所对应的目录的父目录名

boolean renameTo(File newName);  //重命名此File对象所对应的文件或目录,如果重命名成功,则返回true,否则返回false

 

2)文件检测

boolean exists();  //判断File对象所对应的文件或目录是否存在

boolean canWrite();  //判断File对象所对应的文件和目录是否可写

boolean canRead();  //判断File对象所对应的文件和目录是否可读

boolean isFile();  //判断File对象所对应的是否是文件,如果是文件则返回true,如果是目录则返回false

boolean isDirectory();  //判断File对象所对应的是否是目录,如果是目录则返回true,如果是文件则返回false

boolean isAbsolute();  //判断File对象所对应的文件或目录是否是绝对路径。

 

3)获取文件信息

long lastModified();  //返回文件的最后修改时间

long length(); 返回文件内容的长度   //即大小,以KB表示

 

4)操作文件

boolean createNewFile(); //创建文件:创造一个大小为0的文件,指定的文件夹路径必须存在。很少用,I/O流会自动创建文件。

boolean delete(); //删除File对象所对应的文件或路径,如果路径下有文件则无法删除

static File createTempFile(String prefix, String suffix);  //在默认的临时文件目录中创建一个临时的空文件,使用给定的前缀。系统生成的随机数和给定的后缀作为文件名。

static File createTempFile(String prefix, String suffix, File directory);  //在directory所指定的目录中创建一个临时的空文件。

void deleteOnExit();  //注册一个删除钩子,当Java虚拟机退出时,删除File对象所对应的文件和目录。(经常和临时文件一起用)

 

5)操作目录的方法

boolean mkdir();  //创建一个File对象所对应的目录,如果成功则返回true。调用该方法时,File对象必须是一个路径。

boolean mkdirs();  //效果等同于mkdir()方法,只是mkdir()只会创建一级路径,mkdirs()会创建多级。

String[] list();  //列出File对象的所有子文件名和路径名,返回String数组

File[] listFiles();  //列出File对象的所有子文件和路径所对应的File对象数组

static File[] listRoots();  //列出系统所有的根路径

 

4. 文件过滤器

File[] files = fileObj.listFiles(new FilenameFilter() {

@Override

public Boolean accept(File dir, String name) {

    return name.startsWith(“C”);

}

});

 

二、IO流

1.流的分类

1)按流向分

输入流:从其他地方到内存。

输出流:从内存到其他地方。

 

2)按传输单位分

字节流:基于8位字节为操作的数据单元。

字符流:基于16位字节为操作的数据单元。

字符流可看成特殊的字节流。

 

3)按功能分

节点流:直接从数据源读/写数据的流。

处理流:对一个已经存在的流进行连接封装,通过封装后的流来实现数据读/写功能。(常用用法:用处理流包装节点流)

 

2.流的父类

1)InputStream

 InputSteam是字节输入流的抽象基类,本身不能创建实例来进行输入。

常用方法:

a.int read();  //从输入流中读取单个字节,返回所读取的字节数据,转化成为int类型。

InputStream in = new FileInputStream(“C:\\demo\\haha\\test.txt”);

int a = in.read();

int b = in.read();

System.out.println(a + “, ” + b);

b.int read(byte[] b);  //从输入流中最多读取字节数组b的长度个字节数据,并且保存在b中,返回值表示本次读取实际读取的字节数。

c.int read(byte[] b, int off, int len); //从输入流中最多读取len个字节的数据,并存储在字节数组b中,并不是从数组的开头放入的,而是从off位置开始,返回实际读取的字节数。

byte[] bs = new byte[10];

int r = in.read(bs, 1, 2);

System.out.println(r);

d.long skip(long n); //跳过和丢弃此输入流中数据的 n 个字节,返回实际跳过的字节数

e.void close(); //关闭此输入流并释放与此流关联的所有系统资源。常用:

if (in != null){in.close}

相应的,输出流也要关闭才能将缓冲的内容写入文件。或者flush():out.flush();out.close();

public static void main(String[] args) {

InputStream in = new FileInputStream(“C:\\test.txt”);



byte[] buffer = new byte[1024];

// 将数据读入buffer字节数组中

int len;



while ((len = in.read(buffer)) != -1) {

    System.out.println(new String(buffer, 0. len));

}

// 关闭释放资源

in.close();

}

 

2)OutputStream

OutputStram是左右字节输出流的抽象父类。

常用方法:

a. void write(int c); //写一个字节

 

b. void write(byte[] b); // 将字节数组中的数据输出到指定的输出流中

byte[] buffer = string.getBytes(); //字符串转字节数组。

String str = new String(Bytes, 0, len);//将数组中从0到len字节转换

 

若没有指定的路径,不会自动生成。若指定的路径下没有文件,文件可以自动生成。

输出是覆盖输出,每次都会清空原文件里的内容。除了随机访问类是在指定的原文件中相应的位置写,其他类都是直接替换源文件。

 

c. void write(byte[] b, int off, int len);  //将字节数组中的off位置开始,长度为len的字节输出到输出流中

      public static void outputStream() throws IOException {

           // 文件的copy

           InputStream in = new FileInputStream("C:\\source.txt");

           OutputStream out = new FileOutputStream("C:\\target.txt");

          

           byte[] bs = new byte[1024];

           int length = -1;

          

           while ((length = in.read(bs)) != -1) {

                 out.write(bs, 0, length);

           }

          

           in.close();

           out.close();

      }

 

3)Reader与Writer

字符输入/输出流。文本文件才能用字符流

与InputSteam的差别仅仅是将用byte运输改为用char运输而已。

它们的常用方法和InputStream()、OutputStream()类似,就不多说了。

 

3.常用的流的实现类

1)文件流

FileInputStream、FileOutputStream、FileReader、FileReader。

 

2)内存流

InputStream inputStream = new FileInputStram(fileObj);

OutputStream outputStream = new ByteArrayOutputStream();

InputStream inputStream = new FileInputStram(fileObj);

OutputStream outputStream = new ByteArrayOutputStream();

byte[] spoonIn = new byte[1024]

inputStream.read(spoonIn);

outputStream.write(spoonIn, 0, length);


outputStream.flush();


String txt = outputStream.toString();

 

3)缓冲流/打印流

a.bufferedReader/bufferedWriter/printWriter/printStream

前者是输入流,后三个是输出流。.bufferedReader和printWriter常配合在一起使用。

前三个用于对字符节点流进行处理。所以输入和输出都是用FileReader和FileWriter接收

对于bufferedWriter,写出的数据会先缓存在内存缓冲区中,关闭此流前要用flush()方法将缓存区的数据立刻写出

关闭过滤流时,会自动关闭过滤流所包装的所有底层流。即关闭处理流会自动关闭底层的节点流

 

4)转换流(处理流)

InputStreamReader:将字节输入流转换成字符输入流,本质是Reader,继承于Reader。

OutputStreamWriter:将字符流转换为字节流输出。

 

5)对象流(处理流)

对象流的作用就是序列化

 

序列化:

ObjectOutput out = new ObjectOutputStream(new FileOutputStream(“D:\\xxxxxxx.whatever”))

out.writeObject(new Object())

out.close();

 

反序列化:

ObjectInput in = new ObjectInputStream(new FileInputStram(“C:\\SSSS.relin”));

Person p = (Person)in.readObject();

System.out.println(p.getName());

in.close();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值