java的IO详解

1)操作文件的类File

在整个IO包中,File是唯一与文件本身有关的类。

使用File类进行文件的创建和删除等操作。

在编写路径时使用符合本地操作系统的分隔符,要实现这样的功能,

需要使用File中的两个常量:pathSeparator和separator。

在程序开发中,往往会使用Windows开发环境,因为Windows操作系统中

支持的开发工具较多,而在程序发布时往往直接在Linux或其他操作系统上部署,

所以若不使用File.separator,就会出现问题。

 1 public class FileDemo01 {
 2     public static void main(String[] args) {
 3         //File f = new File("D:\\test.txt");//创建一个新的File实例
 4         File f = new File("D:"+File.separator+"test.txt");
 5         try{
 6             f.createNewFile();
 7         }catch(IOException e){
 8             e.printStackTrace();
 9         }
10     }
11 }

File还可实现:删除文件、判断文件是否存在、创建文件夹、

列出指定目录的全部文件、判断一个给定的路径是否是目录。

2)RandomAccessFile类

File类只是针对文件本身进行操作,而如果要对文件内容进行操作,则可以使用RandomAccessFile类。

随机读写流可以实现对文件内容的操作,但是一般情况下操作文件内容会使用字节或字符流。

3)字节流和字符流

在程序中所有与数据都是以流的方式进行传输和保存的,程序需要数据时要使用输入流读取数据;

而当程序需要将一些数据保存起来时,就要使用输出流。

在字节流中输出数据主要使用OutputStream类完成,输入使用InputStream完成。

在字符流中输出主要使用Wrier类完成,输入主要使用Reader类完成。

IO操作步骤:使用File类打开一个文件;通过字节流或字符流的子类指定输出位置;

进行读/写操作;关闭输入/输出。

字节流

1)字节的概念

位(bit):一个二进制数

Hello World!!!中有十四个字节。

字节(byte):8个二进制构成一个字节

 1 public class GetByteDemo {
 2     public static void main(String[] args) {
 3         String s = "3,He";
 4         //byte b1 = ‘!‘;
 5         byte b[] = s.getBytes();
 6         //System.out.println(b1);
 7         //System.out.println(b.length);
 8         //System.out.println(new String(b));
 9         for(int i=0;i<b.length;i++){
10             System.out.println(b[i]);        //输出:51 44 72 101
11             //System.out.println(((char)b[i]));   //输出:3 , H e
12         }
13     }
14 }

2)OutputStream是整个IO包中字节输出流的最大父类。

OutputStream类是一个抽象类,如果要使用此类,首先必须通过子类实例化对象。

FileOutputStream是Outputstream的子类,通过向上转型后,可以为Outputstream实例化。

顺序:OutputStream(抽象类)

FileOutputStream(非抽象类)

 1 public class OutputStreamDemo {
 2     public static void main(String[] args) throws Exception {
 3
 4         //使用File类找到一个文件;若文件不存在,则会自动创建
 5         File f = new File("D:"+File.separator+"test.txt");
 6
 7         //通过子类实例化父类对象
 8         OutputStream out = new FileOutputStream(f);
 9
10         //进行写操作
11         String str = "Hello";
12         byte b[] = str.getBytes();
13         out.write(b);
14
15         //关闭输出流
16         out.close();
17     }
18 }

通过FileOutputStream向文件中追加内容。

 1 import java.io.File;
 2 import java.io.FileNotFoundException;
 3 import java.io.FileOutputStream;
 4 import java.io.IOException;
 5 import java.io.OutputStream;
 6
 7 public class FileOutputStreamDemo {
 8
 9     public static void main(String[] args) throws IOException {
10         File f = new File("d:" + File.separator + "test.txt");
11         OutputStream out = new FileOutputStream(f, true);
12         String str = "\r\n Hello World!!!";    //换行符
13         byte b[] = str.getBytes();
14         for(int i=0;i<b.length;i++){
15             out.write(b[i]);
16         }
17         out.close();
18     }
19 }

3)字节输入流InputStream

过程类似与字节输出流,但是注意使用;length方法去掉字符串结尾的空格。

顺序:InputStream(抽象类)

FileInputStream(非抽象类)

 1 import java.io.File;
 2 import java.io.FileInputStream;
 3 import java.io.FileNotFoundException;
 4 import java.io.IOException;
 5 import java.io.InputStream;
 6
 7 public class InputStreamDemo01 {
 8
 9     public static void main(String[] args) throws IOException {
10         File f  =new File("d:" + File.separator + "test.txt");
11         InputStream input = null;
12         input = new FileInputStream(f);
13         byte b[] = new byte[1024];
14         int len = input.read(b);    //去掉空格
15         input.close();
16         System.out.print(new String(b,0,len));
17     }
18 }

如果根据文件的大小开辟空间,则是:

 1 import java.io.File;
 2 import java.io.FileInputStream;
 3 import java.io.FileNotFoundException;
 4 import java.io.IOException;
 5 import java.io.InputStream;
 6
 7 public class InputStreamDemo01 {
 8
 9     public static void main(String[] args) throws IOException {
10         File f  =new File("d:" + File.separator + "test.txt");
11         InputStream input = null;
12         input = new FileInputStream(f);
13         byte b[] = new byte[(int)f.length()];
14         input.read(b);    //去掉空格
15         input.close();
16         System.out.print(new String(b));
17     }
18 }

如果不知道输入的内容有多大,则只能通过判断是否读到文件末尾的方式来读取文件:

 1 import java.io.File;
 2 import java.io.FileInputStream;
 3 import java.io.FileNotFoundException;
 4 import java.io.IOException;
 5 import java.io.InputStream;
 6
 7 public class InputStreamDemo01 {
 8
 9     public static void main(String[] args) throws IOException {
10         File f  =new File("d:" + File.separator + "test.txt");
11         InputStream input = null;
12         input = new FileInputStream(f);
13
14         int len = 0;
15         byte b[] = new byte[1024];
16         int temp = 0;
17         while((temp = input.read()) != -1){
18             //如果temp值不是-1,则说明没有读完
19             b[len] = (byte) temp;
20             len++;
21         }
22
23         input.close();
24         System.out.print(new String(b,0,len));
25     }
26 }

字符流

1)字符输出流Writer

Write类也是一个抽象类,如果要使用此类,则肯定要使用其子类。

如果向文件中写入内容,应该使用子类FileWriter。

可以直接输出字符串,不用将字符串变为byte数组之后再输出。

可以使用FileWriter追加文件内容。

顺序:Writer(抽象类)

FileWriter(非抽象类)

向文件中写入数据

 1 import java.io.File;
 2 import java.io.FileWriter;
 3 import java.io.IOException;
 4 import java.io.Writer;
 5
 6 public class WriterDemo {
 7
 8     public static void main(String[] args) throws IOException {
 9         File f = new File("d:" + File.separator + "test.txt");
10         Writer out = new FileWriter(f);
11         String str = "Hello World!!!";
12         out.write(str);
13         out.close();
14     }
15 }

整个程序与Outputstream的操作流程基本没区别,唯一不同的是,可以直接输出字符串,而不用将字符串为byte数组之后再输出。

 1 import java.io.File;
 2 import java.io.FileWriter;
 3 import java.io.IOException;
 4 import java.io.Writer;
 5
 6 public class WriterDemo {
 7
 8     public static void main(String[] args) throws IOException {
 9         File f = new File("d:" + File.separator + "test.txt");
10         Writer out = new FileWriter(f);
11         String str = "Hello World!!!";
12         out.write(str);
13         out.close();
14     }
15 }

使用FileWriter追加文件的内容

 1 package cn.itcast.writer.demo;
 2
 3 import java.io.File;
 4 import java.io.FileWriter;
 5 import java.io.IOException;
 6 import java.io.Writer;
 7
 8 public class WriterDemo {
 9
10     public static void main(String[] args) throws IOException {
11         File f = new File("d:" + File.separator + "test.txt");
12         Writer out = new FileWriter(f, true);    //true表示追加
13         String str = "Hello World!!!";
14         out.write(str);
15         out.close();
16     }
17 }

2)字符输入流Reader

Reader类也是抽象了,可以直接使用FileReader子类从文件中读取内容。

 1 import java.io.File;
 2 import java.io.FileNotFoundException;
 3 import java.io.FileReader;
 4 import java.io.IOException;
 5 import java.io.Reader;
 6
 7 public class ReaderDemo {
 8
 9     public static void main(String[] args) throws IOException {
10         File f = new File("d:" + File.separator + "test.txt");
11         Reader reader = new FileReader(f);
12         int len = 0;
13         char c[] =new char[1024];
14         int temp = 0;
15         while((temp = reader.read()) !=-1){
16             c[len] = (char) temp;
17             len++;
18         }
19         reader.close();
20         System.out.print(new String(c,0,len));
21     }
22
23 }

字节流和字符流的区别:

字节流在操作时本身不会到缓冲区(内存)。是文件本身直接操作的,而字符流在操作时

使用了内存,通过缓冲区在操作文件。

操作字节流时,即使不关闭输出流,输出内容也会写入文件,

但在操作字符流时,只有关闭字符流之后,输出内容才会写入文件。

使用缓冲区,可以提高系统频繁操作某一内容情况下的性能。

所有的文件在硬盘或在传输时都是以字节的方式进行的,包括图片等都是按字节进行存储的,

而自负是只有在内存中才会形成,所以在开发中,字节流使用较为广泛。

System类对IO的支持

1)System.out

System.out是PrintStream的对象,在PrintStream中定义了一系列的print()和println()方法.

而PrintStream又是OutputStream的子类,所以可以直接利用此对象向屏幕上输出信息。

2)System.err

表示错误信息的输出。

3)System.in

是一个键盘的输入流,是InputStream类型的对象。

但是,在使用System.in的时候,指定大小会出现空间限制,不指定大小则输入中文时会产生乱码。

如果可以一次性的从内存中读出数据,这样所有数据只读了一次,就不会产生乱码,而且也不受长度的限制,

而这些操作可以通过BufferedReader类实现。

4)输入输出重定向

通过System类可以改变System.in的输入流来源以及System.out和System.err两个输出流的输出位置。

例如,可以把错误信息直接保存到文件中。

5)BufferedReader类

通过此类可以一次性从 缓冲区中将内容全部读取出来。

6)键盘输入的标准格式

 1 public class BufferedReaderDemo01 {
 2     public static void main(String[] args) {
 3         BufferedReader buf = null;
 4         buf = new BufferedReader(new InputStreamReader(System.in));
 5         String str = null;
 6         System.out.println("请输入内容:");
 7         try{
 8             str = buf.readLine();
 9         }catch(IOException e){
10             e.printStackTrace();
11         }
12         System.out.println("输入内容为:"+str);
13     }
14 }

Scanner类

专门的输入数据类,此类不知可以完成输入数据的操作,也可以对输入的数据进行验证。

可以实现:基本的数据输入、日期格式的数据输入、从文件中得到数据。

时间: 2024-10-13 01:53:56

java的IO详解的相关文章

【JAVA】IO详解

综合各种网文得出此文 引用 [1]http://blog.csdn.net/yczz/article/details/38761237 [2]http://www.cnblogs.com/pepcod/archive/2013/01/20/2913435.html [3]http://blog.csdn.net/zhangerqing/article/details/8466532 首先 先挂一图,这个图是java中类的层次结构 引用自[1] . Java的IO是基于流的. 流是什么: 流相当于

Java IO 详解

Java IO 详解 初学java,一直搞不懂java里面的io关系,在网上找了很多大多都是给个结构图草草描述也看的不是很懂.而且没有结合到java7 的最新技术,所以自己来整理一下,有错的话请指正,也希望大家提出宝贵意见. 首先看个图:(如果你也是初学者,我相信你看了真个人都不好了,想想java设计者真是煞费苦心啊!) 这是java io 比较基本的一些处理流,除此之外我们还会提到一些比较深入的基于io的处理类,比如console类,SteamTokenzier,Externalizable接

Java反射机制详解

Java反射机制详解 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制. 1.关于Class 1.Class是一个类,一个描述类的类(也就是描述类本身),封装了描述方法的Method,描述字段的Filed,描述构造器的Constructor等属性    2.对象照镜子后(反射)可以得到的信息:某个类的数据成员名.方法和构造器.某个类到底实现

java UDP传输详解

UDP传输是一个面向无连接的传输方式,什么叫无连接呢,简单点说呢就是不管你在不在线,我都发数据给你,像那个电影里警察拿的那个呼叫用的就这这个原理 还有以前的QQ聊天也是,现在2013版的可以选择是UPD还是TCP,好了不多说,上点代码玩一下 分析:通过udp传输方式,将一段数据发送出去 思路: 1,建议udpsocket服务 2,提供数据,并将数据封装到数据包中 3,通过socket服务的发送功能,讲数据包发送出去. 4,关闭资源 牢记思路,代码哪里都有 package com.szc02; i

Java 序列化Serializable详解(附详细例子)

Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.   2.什么情况下需要序列化 a)当你想把的内存中的对象保存到一个文件中或者数据库中时候:b)当你想用套接字在网络上传送对象的时候:c)当你想通过RMI传输对象的时候: 3.如何实现序列化 将需要序列化的类实现Serializable接口就可以了,Seriali

Java 序列化Serializable详解(附详细例子)

1.什么是序列化和反序列化 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程. 2.什么情况下需要序列化  a)当你想把的内存中的对象保存到一个文件中或者数据库中时候: b)当你想用套接字在网络上传送对象的时候: c)当你想通过RMI传输对象的时候: 3.如何实现序列化 将需要序列化的类实现Serializable接口就可以了,Serializable接口中没有任何方法,可以理解为一个标记,即表明

java 序列化Serializable 详解

Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.   2.什么情况下需要序列化 a)当你想把的内存中的对象保存到一个文件中或者数据库中时候:b)当你想用套接字在网络上传送对象的时候:c)当你想通过RMI传输对象的时候: 3.如何实现序列化 将需要序列化的类实现Serializable接口就可以了,Seriali

Java路径操作详解

1.基本概念的理解 绝对路径:绝对路径就是你的主页上的文件或目录在硬盘上真正的路径,(URL和物理路径)例如: C:\xyz\test.txt 代表了test.txt文件的绝对路径.http://www.sun.com/index.htm也代表了一个 URL绝对路径. 相对路径:相对与某个基准目录的路径.包含Web的相对路径(HTML中的相对目录),例如:在 Servlet中,"/"代表Web应用的根目录.和物理路径的相对表示.例如:". /" 代表当前目录, &q

Java 序列化Serializable详解

Java 序列化Serializable详解(附详细例子) Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.   2.什么情况下需要序列化 a)当你想把的内存中的对象保存到一个文件中或者数据库中时候:b)当你想用套接字在网络上传送对象的时候:c)当你想通过RMI传输对象的时候: 3.如何实现序列化 将需要序列化