以下内容引用自http://wiki.jikexueyuan.com/project/java/files-and-io.html

在Java中java.io包含的每一个类几乎都要进行输入和输出操作。所有的这些流代表一个输入源和输出目的地。在java.io包中支持许多数据,如原语,对象,本地化字符等等。

一、流

流可以被定义为一个序列的数据。

  • InPutStream:输入流用来从一个源中读数据。
  • OutPutStream:输出流用来向一个目的地写数据。

Java提供了强大且灵活的有关文件和网络的I/O功能。

二、字节流

Java字节流是用来处理8比特字节(8-bit bytes)的输入和输出。尽管有许多的有关字节流的类,但是最常用的是FileInputStream类和FileOutputStream类。下面是一个例子,作用是用这两个类来完成把一个输入文件的内容复制到输出文件:

import java.io.*;

public class CopyFile {
public static void main(String args[]) throws IOException
{
FileInputStream in = null;
FileOutputStream out = null; try {
in = new FileInputStream("input.txt");
out = new FileOutputStream("output.txt"); int c;
while ((c = in.read()) != -1) {
out.write(c);
}
}finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
}

接下来需要有一个文件input.txt,内容如下:

This is test for copy file.

下一步,编译上面的程序并执行它,结果会创建一个文件叫做output.txt,它的内容和上面的input.txt内容是一样的。所以将上面的代码放入CopyFile.java文件,然后进行如下操作:

$javac CopyFile.java
$java CopyFile

二、字符流

Java字节流是用来处理8比特字节的输入和输出,Java字符流用于处理16位unicode的输入和输出。尽管这里有许多关于字符流的类,但最常用的类是,FileReader和FileWriter。虽然在内部FileReader还是使用FileInputStream和FileWriter使用FileOutputStream,但是主要的区别是FileReader和FileWriter一次读写两个字节。

重写上面的例子来完成把一个输入文件(包含unicode字符)的内容复制到输出文件:

import java.io.*;

public class CopyFile {
public static void main(String args[]) throws IOException
{
FileReader in = null;
FileWriter out = null; try {
in = new FileReader("input.txt");
out = new FileWriter("output.txt"); int c;
while ((c = in.read()) != -1) {
out.write(c);
}
}finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
}

接下来需要有一个文件input.txt ,内容如下:

This is test for copy file.

下一步,编译上面的程序并执行它,结果会创建一个文件叫做output.txt,它的内容和上面的input.txt内容是一样的。所以将上面的代码放入CopyFile.java文件,然后进行如下操作:

$javac CopyFile.java
$java CopyFile

三、标准流

所有的编程语言都提供了对标准I/O流的支持,即用户可以从自己的键盘上进行输入,并且从屏幕上输出。C或C++编程语言中三种标准输入输出STDIN,STDOUT和STDERR。同样的Java也提供了以下的三种标准流:

  • Standard Input:这是用来将数据反馈给用户的程序,通常键盘作为标准输入流并且表示为System.in。
  • Standard Output:这是用于输出用户程序产生的数据,通常电脑屏幕作为标准输出流,并且表示为System.out。
  • Standard Error:这是用来输出用户产生的错误数据,通常电脑屏幕作为标准错误流,并且表示为System.err。

下面是一个示例程序用来创建一个InputStreamReader来读标准输入流直到用户输入字符"q":

import java.io.*;

public class ReadConsole {
public static void main(String args[]) throws IOException
{
InputStreamReader cin = null; try {
cin = new InputStreamReader(System.in);
System.out.println("Enter characters, 'q' to quit.");
char c;
do {
c = (char) cin.read();
System.out.print(c);
} while(c != 'q');
}finally {
if (cin != null) {
cin.close();
}
}
}
}

把上面的代码放到ReadConsole.java中并且用如下方法编译执行它。这个程序将不断地读写相同的字符直到按下"q"。

$javac ReadConsole.java
$java ReadConsole
Enter characters, 'q' to quit.
1
1
e
e
q
q

四、读写文件

一个流可以定义为一个序列的数据。输入流用来从一个源中读数据,输出流用来向一个目的地写数据。

这里是相关类的层次来表示输入和输出流:

两个重要的流是FileInputStream和FileOutputStream。

五、文件输入流

这个流是用来从文件中读数据的。对象能够通过用关键字new来创建,并且这里有很多可用的不同类型的构造函数。

下面的构造函数以文件名的字符串为参数来创建一个输入流对象去读文件。

InputStream f = new FileInputStream("C:/java/hello");

下面的构造函数需要以一个文件对象作为参数来去创建一个输入流对象去读文件,首先用File()方法来去创建一个文件对象:

File f = new File("C:/java/hello");
InputStream f = new FileInputStream(f);

一旦有了一个输入流对象,这里将有很多的提供帮助的方法来进行读操作或是其他在流中的操作。

方法 描述
public void close() throws IOException{}  这个方法关闭文件输出流。释放有关文件的所有系统资源。抛出IO异常。
protected void finalize() throws IOException {} 这个方法会切断和文件的连接。确保这个文件输出流的关闭方法在这个流没有引用的时候才会被调用。抛出IO异常。
public int read(int r) throws IOException{} 这个方法从InputStream中读到特定字节数的数据。返回一个int类型。返回下一个字节的数据或是在文件末尾时返回-1。
public int read(byte[] r) throws IOException{}  这个方法是从输入流中读r个长度字节到数组中。返回所有读到的字节数,或是在文件末尾时返回-1。
public int available() throws IOException{}  给出能从输入流中读到的字节数,返回一个int类型数据。

六、文件输出流

FileOutputStream是用来创建一个文件,并向其中写入数据。如果之前没有该文件,该流会在打开流之前创建一个文件。

这里是两个能够产生FileOutputStream对象的构造函数。

下面的构造函数以文件名的字符串作为参数来创建一个输出流对象去写文件:

OutputStream f = new FileOutputStream("C:/java/hello")

下面的构造函数需要以一个文件对象作为参数来去创建一个输出流对象去写文件,首先用File()方法来去创建一个文件对象:

File f = new File("C:/java/hello");
OutputStream f = new FileOutputStream(f)

一旦有了一个输出流对象,这里将有很多的提供帮助的方法来进行写操作或是其他在流中的操作。

方法 描述
public void close() throws IOException{}  这个方法关闭文件输出流。释放有关文件的所有系统资源。抛出IO异常。
protected void finalize() throws IOException {} 这个方法会切断和文件的连接。确保这个文件输出流的关闭方法在这个流没有引用的时候才会被调用。抛出IO异常。
public void write(int w) throws IOException{}  这个方法用来写特定的字节到输出流。
public void write(byte[] w) 从字节数组中写 w 长度字节到输出流。

示例:

下面是一个例子来演示InputStream和OutputStream:

public class FileStreamTest {

    public static void main(String args[]) {

        try {
byte bWrite[] = { 11, 21, 3, 40, 5 };
OutputStream os = new FileOutputStream("test.txt");
for (int x = 0; x < bWrite.length; x++) {
os.write(bWrite[x]); // writes the bytes
}
os.close(); InputStream is = new FileInputStream("test.txt");
int size = is.available(); for (int i = 0; i < size; i++) {
System.out.print((char) is.read() + " ");
}
is.close();
} catch (IOException e) {
System.out.print("Exception");
}
}

上面的代码将产生test.txt文件并且以二进制格式写入给出的数字。

七、文件导航和I/O

这里需要查看很多类来去了解文件导航和I/O。

  • File Class
  • FileReader Class
  • FileWriter Class

提示:获得完整详细的类说明,请参考Java官方文档。

八、Java目录

目录是一个文件可以包含其他文件和目录的列表。想要在目录中列出可用文件列表,可以通过使用File对象创建目录,获得完整详细的能在File对象中调用的以及有关目录的方法列表。

1、创建目录

这里有两个有用的文件方法,能够创建目录:

  • mkdir()方法创建了一个目录,成功返回true,创建失败返回false。失败情况是指文件对象的路径已经存在了,或者无法创建目录,因为整个路径不存在。
  • mkdirs()方法创建一个目录和它的上级目录。

以下示例创建“/tmp/user/java/bin”目录:

import java.io.File;

public class CreateDir {
public static void main(String args[]) {
String dirname = "/tmp/user/java/bin";
File d = new File(dirname);
// Create directory now.
d.mkdirs();
}
}
//编译并执行以上代码创建 “/tmp/user/java/bin”

提示:Java自动按UNIX和Windows约定来处理路径分隔符。如果在Windows版本的Java中使用正斜杠(/),仍然可以得到正确的路径。

2、目录列表

如下,能够用File对象提供的list()方法来列出目录中所有可用的文件和目录

import java.io.File;

public class ReadDir {
public static void main(String[] args) { File file = null;
String[] paths; try{
// create new file object
file = new File("/tmp"); // array of files and directory
paths = file.list(); // for each name in the path array
for(String path:paths)
{
// prints filename and directory name
System.out.println(path);
}
}catch(Exception e){
// if any error occurs
e.printStackTrace();
}
}
}
//基于/tmp目录下可用的目录和文件,将产生以下结果:
test1.txt
test2.txt
ReadDir.java
ReadDir.class

提示:这种方法只能获取当前目录下的文件和目录,不能递归获取。

测试工程:https://github.com/easonjim/5_java_example/tree/master/javabasicstest/test14

Java中文件和I/O的更多相关文章

  1. java中文件的I/O操作

    java中文件的读写操作 (一) (1)java中文件的字节转成字符读操作 FileInputStream fStream = new FileInputStream("test.txt&q ...

  2. JAVA中文件与Byte数组相互转换的方法

    JAVA中文件与Byte数组相互转换的方法,如下: public class FileUtil { //将文件转换成Byte数组 public static byte[] getBytesByFile ...

  3. java中文件的相对路径以及jar中文件的读取

    Java中File类的构造函数需要我们传入一个pathname,当我们传入以"/"开头的pathname表示绝对路径,其他均表示相对路径. 一:绝对路径名:是完整的路径名,不需要任 ...

  4. java中文件操作《一》

    在日常的开发中我们经常会碰到对文件的操作,在java中对文件的操作都在java.io包下,这个包下的类有File.inputStream.outputStream.FileInputStream.Fi ...

  5. java 中 “文件” 和 “流” 的简单分析

    java 中 FIle 和 流的简单分析 File类 简单File 常用方法 创建一个File 对象,检验文件是否存在,若不存在就创建,然后对File的类的这部分操作进行演示,如文件的名称.大小等 / ...

  6. 【IO流】java中文件路径(相对路径、绝对路径)相关类及方法

    原文链接:https://blog.csdn.net/Activity_Time/article/details/98034409 1. URL 菜鸟教程:Java URL处理 通常推荐对http等协 ...

  7. 总结java中文件拷贝剪切的5种方式-JAVA IO基础总结第五篇

    本文是Java IO总结系列篇的第5篇,前篇的访问地址如下: 总结java中创建并写文件的5种方式-JAVA IO基础总结第一篇 总结java从文件中读取数据的6种方法-JAVA IO基础总结第二篇 ...

  8. Java中文件的随机读写

    [例 10-12]模仿系统日志,将数据写入到文件尾部. //********** ep10_12.java ********** import java.io.*; class ep10_12{ pu ...

  9. java中文件操作

    例一:从一个文件读入数据,然后写入另外一个文件 package lipika; import java.io.FileInputStream; import java.io.FileNotFoundE ...

随机推荐

  1. Jenkins邮件扩展插件Email Extension Plugin配置使用

    1.在管理插件中搜索并安装邮件扩展插件Email Extension Plugin: 2.在任务中增加构建后操作步骤,选择Editable Email Notification; 3.在高级中Add ...

  2. Js 之获取QueryString的几种方法

    一.正则匹配 function getQueryString(name) { var reg = new RegExp('(^|&)' + name + '=([^&]*)(& ...

  3. 【整理】iview Tree数据格式问题,无限递归树处理数据

    iview Tree数据格式问题,无限递归树处理数据 https://juejin.im/post/5b51a8a4e51d455d6825be20

  4. String s = “1a2a3a4a” 解码为 “1234”

    将字符串 String s = “1a2a3a4a”  解码为 “1234” public class Program2 { public static void main(String[] args ...

  5. Archive for required library: 'D:/Program Files/Apache/maven-repository/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar'

    今天导入一个项目工程,发现报错:Archive for required library: 'D:/Program Files/Apache/maven-repository/dom4j/dom4j/ ...

  6. No-6.用户权限相关命令

    用户权限相关命令 目标 用户 和 权限 的基本概念 用户管理 终端命令 组管理 终端命令 修改权限 终端命令 01. 用户 和 权限 的基本概念 1.1 基本概念 用户 是 Linux 系统工作中重要 ...

  7. [BZOJ3211]:花神游历各国(小清新线段树)

    题目传送门 题目描述: 花神喜欢步行游历各国,顺便虐爆各地竞赛.花神有一条游览路线,它是线型的,也就是说,所有游历国家呈一条线的形状排列,花神对每个国家都有一个喜欢程度(当然花神并不一定喜欢所有国家) ...

  8. linux下tomcat服务的相关命令

    一:Linux下tomcat服务的启动.关闭与错误跟踪,使用PuTTy远程连接到服务器以后,通常通过以下几种方式启动关闭tomcat服务:切换到tomcat主目录下的bin目录(cd usr/loca ...

  9. mysql 报错:ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA

    解决办法:设置临时环境变量 ;  

  10. 关于在Safari浏览器中将网页添加到主屏幕的相关设置(自定义图标,启动动画,自定义名称)

    在ios中我们可以使用Safari浏览自带的将网页添加到主屏幕上,让我们的web页面看起来像native那样 第一步: 第二步: 第三步: 到这里还没结束:我们还要进行相关设置才能使我们的应用更像原生 ...