文档章节

JavaIO/输出输入入门<一>

Credo-Zhao
 Credo-Zhao
发布于 2013/01/04 10:45
字数 1490
阅读 453
收藏 14

IO称之为输入输出,Java的IO是通过java.io包下的类和接口来支持,包含两大类:输入,输出. 

在整个Java.io包中最重要的就是5个类和一个接口。5个类指的是File、OutputStream、InputStream、Writer、Reader;一个接口指的是Serializable.掌握了这些IO的核心操作那么对于Java中的IO体系也就有了一个初步的认识了。

1.File类

File类是java.io下代表与平台无关的文件和目录.也就是说如果要操作文件和目录,都可以通过File来操作.File不能访问访问文件本身,如果需要访问文件本身,需要使用输入/输出流.

File 类有一个欺骗性的名字——通常会认为它对付的是一个文件,但实情并非如此。
它既代表一个特定文件 的名字,也代表目录内一系列文件的名字。
若代表一个文件集,便可用list()方法查询这个集,返回的是一 个字串数组。之所以要返回一个数组,而非某个灵活的集合类,是因为元素的数量是固定的。而且若想得到 一个不同的目录列表,只需创建一个不同的File 对象即可。
事实上,“FilePath ”(文件路径)似乎是一个 更好的名字。

----摘自 think in java

代码示例File的使用:
package org.credo.io;

import java.io.File;
import java.io.IOException;

public class FileTest {

	@SuppressWarnings("static-access")
	public static void main(String[] args) throws IOException {
		//以当前路径来创建一个File对象
		File file=new File("credo");
		System.out.println("直接获取文件名:"+file.getName());
		System.out.println("获取文件相对路径的父路径可能出错,输出为NULL:"+file.getParent());
		System.out.println("获取绝对路径:"+file.getAbsolutePath());
		System.out.println("获取绝对路径对应的File对象:"+file.getAbsoluteFile());
		System.out.println("获取上一级路径:"+file.getAbsoluteFile().getParent());
		System.out.println("file:"+file);
		//检查是否存在,先创建目录。然后创建文件.不然报java.io.IOException: 系统找不到指定的路径.
		if(!file.exists()){  
			file.mkdirs();  
		} 
		//在当前路径下创建一个临时文件,名aaa属性为txt的.
		File tmpFile=File.createTempFile("aaa", ".txt",file);
		//JVM退出时删除该文件,另一个delete是直接删除.
		tmpFile.deleteOnExit();
		
		//以系统当前时间作为新文件名来创建新文件.
		File newFile=new File(System.currentTimeMillis()+"");
		System.out.println("判断newFile是否存在:"+newFile.exists());
		//以指定的newFile对象来创建一个文件
		newFile.createNewFile();
		//以newFile对象来创建一个目录,因为newFile已经存在所以下面方法返回false,无法创建该目录
		newFile.mkdir();
		
		//使用list()方法列出当前路径下的所有文件和路径
		String[] fileList=file.list();
		System.out.println("=========当前路径下所有文件和路径如下===========");
		for(String fileName:fileList){
			System.out.println("fileName:"+fileName);
		}
		
		//listRoots()静态方法列出所有的磁盘根路径
		File[] roots=file.listRoots();
		System.out.println("==========系统所有根路径如下=======");
		for(File root:roots){
			System.out.println("root:"+root);
		}
	}

}
跟具体的请查阅java API.

2 文件过滤器

在File类的list()方法中可以接收一个FilenameFilter参数,通过该参数可以只列出符合条件的文件.
FilenameFilter接口里包含了一个accept(File dir,String name)方法,该方法将依次对指定File的所有子目录或者文件进行迭代,如果该方法返回true,则list()方法会列出该子目录或者文件.

package org.credo.io;

import java.io.File;
import java.io.FilenameFilter;

public class FileNameFilterTest {

	public static void main(String[] args) {
		//以当前路径来创建一个File对象
		File file=new File(".");
		String[] nameList=file.list(new MyFileNameFilter());
		for(String str:nameList){
			System.out.println(str);
		}
	}

}
class MyFileNameFilter implements FilenameFilter{
	@Override
	public boolean accept(File dir, String name) {
		//如果文件名以.java结尾,或者文件对应一个路径,则返回true
		return name.endsWith(".java")||new File(name).isDirectory();
	}
	
}

3.理解java的IO流

按照流的流向来分,可以分为输入流和输出流.

输入流 只能读取数据,不能写入数据.java里由InputStream和Reader作为基类.抽象基类,无法创建实例.
输出流 只能写入数据,不能读取数据.java里由OutputStream和Writer作为基类.抽象基类,无法创建实例.

字节流和字符流

字节流和字符流的用法基本一致的.区别是字节流操作的数据单元是8位的字节.而字符是16位的字符.一个字节byte是8位二进制.Java中的字符char是unicode码,占2个字节,即16位.
字节流是由InputStream和OutputStream作为基类.而字符流主要由Reader和Writer作为基类.

或者这么解释:Byte Stream皆起源与InputStream和OutputStream. Char Stream皆起源与Reader和Writer. 字符和字节的区别是,字符是字符集中一个有意义的字符单元. 而字节只是一个8bit二进制数据.

字节流最原始的方法是InputStream的read()和OutputStream的write(). 分别为读取一个字节和写入一个字节. 在InputStream和OutputStream之上,包装了很多字节流工具,来一次性的读或者写多个字符. 但无论如何调用什么方法,最终包装过的方法都是通过调用最原始的read()和write()来操作流.
字符流最原始的方法是Reader的read()和Writer的write()方法.分别为读取一个字符或写入一个字符.同上,包装的字符流工具最终也是在和原始的read()和write()在打交道.

下面是两个体系图:

由于存在大量不同的设计方案,所以该任务的困难性是很容易证明的。其中最大的挑战似乎是如何覆盖所有 
可能的因素。不仅有三种不同的种类的 IO 需要考虑(文件、控制台、网络连接),而且需要通过大量不同的 
方式与它们通信(顺序、随机访问、二进制、字符、按行、按字等等)。 
Java 库的设计者通过创建大量类来攻克这个难题。

----摘自 think in java

下面是字节流的

下面是字符流的:

© 著作权归作者所有

共有 人打赏支持
Credo-Zhao
粉丝 310
博文 161
码字总数 241124
作品 0
朝阳
技术主管
私信 提问
(转)java的InputStream和OutputStream的理解

1、在java中stream代表一种数据流(源),javaio的底层数据元,---(想像成水龙头) 2、任何有能力产生数据流(源)的javaio对象就可以看作是一个InputStream对象 既然它能产生出数据,我...

帅的不像男的
2016/03/29
212
0
Kotlin入门(27)文件读写操作

Java的文件处理用到了io库java.io,该库虽然功能强大,但是与文件内容的交互还得通过输入输出流中转,致使文件读写操作颇为繁琐。因此,开发者通常得自己重新封装一个文件存取的工具类,以便...

aqi00
10/21
0
0
JAVA NIO编程入门(一)

JAVA NIO编程入门(一) 一、前言 笔者之前接触的NIO编程比较少,所以对这一块的基础也比较弱,NIO作为java编程中一个重要的模块,不能很好的掌握它,感觉自己在java方面就掌握的不够,所以,...

木木匠
09/01
0
0
JavaIO - InputStream子类

ByteArrayInputStream 包含一个内存缓冲区,字节从中取出。 FileInputStream 从文件中获得字节。 ObjectInputStream 用来恢复被序列化的对象。 PipedInputStream 管道输入流,读取管道内容。...

晨猫
01/15
0
0
SpringMVC框架 -- json数据交互

一.JSON简单介绍: 参考笔记:JSON简单快速入门 二.json数据交互 请求json 输出json 需要请求数据为json,需要在前端转为json不太方便。不常用 请求key/value、输出json。常用 1.环境搭建 下...

Mr_欢先生
2017/09/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

centos安装confluence全攻略

https://blog.csdn.net/qwer026/article/details/51439076

happyeveryday32
16分钟前
2
0
30 行 Javascript 代码搞定智能家居系统

本文首发于『阿里云 IoT 开发者社区』,更多精彩物联网内容欢迎前往浏览。 智能家居可谓是今年物联网的热门领域,通过智能单品和智能音箱,人们已然把『智能』两个字变成了生活的理所应当。搭...

阿里云官方博客
20分钟前
2
0
sed插入和附加文本基础使用

对于编辑器来说,在数据中增加行算是很基本的操作吧,sed有以下两个操作: 插入(insert)命令(i)会在指定行前增加一个新行 附加(append)命令(a)会在指定行后增加一个新行 还是用下面的文本来测...

woshixin
27分钟前
1
0
HIVE数据倾斜总结

在做Shuffle阶段的优化过程中,遇到了数据倾斜的问题,造成了对一些情况下优化效果不明显。主要是因为在Job完成后的所得到的Counters是整个Job的总和,优化是基于这些Counters得出的平均值,...

瑞查德-Jack
38分钟前
0
0
Pure-ftpd搭建FTP

12月11日任务 15.4 xshell使用xftp传输文件 15.5 使用pure-ftpd搭建ftp服务 使用pure-ftpd搭建FTP服务 轻量的ftp软件 安装pure-ftpd并修改配置文件 # pure-ftpd为epel扩展库里的软件[root...

robertt15
47分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部