以下内容引用自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. mysql-mmm 部署高可用集群

    集群的部署(mysql-mmm + 主从同步) 什么是集群? 多台服务器提供相同的服务 集群的好处? 节省成本. 配置集群? 准备环境:准备4台数据库服务器 准备服务器,能够ping 4 台数据库服务 ...

  2. BZOJ1232: [Usaco2008Nov]安慰奶牛cheer(最小生成树)

    题意:给一个图 需要找到一个子图使得所有点都连通 然后再选择一个点做为起点 走到每个点并回到起点 每条边,每个点被经过一次就要花费一次边权.点权 题解:肯定是找一颗最小生成树嘛 然后惊奇的发现 任意选 ...

  3. 全志T8智能汽车方案芯片参数介绍

    T8处理器代表了Allwinner在智能汽车市场上的最新成就.T8适用于需要三维图形.高级视频处理.精密相机.多种连接选项和高水平系统集成的应用程序.它将把先进的消费电子体验带入未来的汽车,实现高性能 ...

  4. 性能测试,如何得到大量token,并保存在本地文件中

    需求:性能测试需要大量的token,模拟登陆 设计思路: 1.使用语言:python +request+正则匹配+写入本地 2.jmeter+函数助手+正则或者json/yaml+后置处理器beans ...

  5. MySQL中外键删除、更新

      MySQL支持外键的存储引擎只有InnoDB..在创建外键的时候,可以指定在删除.更新父表时,对子表进行的相应操作,包括RESTRICT.NO ACTION.SET NULL和CASCADE. 其 ...

  6. 关闭 macOS Google Chrome 黑暗模式风格

    终端执行命令 defaults write com.google.Chrome NSRequiresAquaSystemAppearance -bool YES 恢复 defaults write c ...

  7. Python数据结构--搜索树

    ''' 二叉搜索树(BST)是一棵树,其所有节点都遵循下述属性 - 节点的左子树的键小于或等于其父节点的键. 节点的右子树的键大于其父节点的键. 因此,BST将其所有子树分成两部分; 左边的子树和右边 ...

  8. 根据不同的产品id获得不同的下拉选项 (option传多值)

    <td> 没有 value 所以要在<td>里面加上input  同时text 为hidden这样就不会显示value的值 <td><select id='g ...

  9. Github 多账号配置

    1. 不同账户,生成不同密钥ssh-keygen -t rsa -f github1 -C "xxx@163.com"ssh-keygen -t rsa -f github2 -C ...

  10. XV6操作系统接口

    操作系统接口 操作系统的工作是(1)将计算机的资源在多个程序间共享,并且给程序提供一系列比硬件本身更有用的服务.(2)管理并抽象底层硬件,举例来说,一个文字处理软件(比如 word)不用去关心自己使用 ...