以下内容引用自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类。下面是一个例子,作用是用这两个类来完成把一个输入文件的内容复制到输出文件:

  1. import java.io.*;
  2.  
  3. public class CopyFile {
  4. public static void main(String args[]) throws IOException
  5. {
  6. FileInputStream in = null;
  7. FileOutputStream out = null;
  8.  
  9. try {
  10. in = new FileInputStream("input.txt");
  11. out = new FileOutputStream("output.txt");
  12.  
  13. int c;
  14. while ((c = in.read()) != -1) {
  15. out.write(c);
  16. }
  17. }finally {
  18. if (in != null) {
  19. in.close();
  20. }
  21. if (out != null) {
  22. out.close();
  23. }
  24. }
  25. }
  26. }

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

  1. This is test for copy file.

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

  1. $javac CopyFile.java
  2. $java CopyFile

二、字符流

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

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

  1. import java.io.*;
  2.  
  3. public class CopyFile {
  4. public static void main(String args[]) throws IOException
  5. {
  6. FileReader in = null;
  7. FileWriter out = null;
  8.  
  9. try {
  10. in = new FileReader("input.txt");
  11. out = new FileWriter("output.txt");
  12.  
  13. int c;
  14. while ((c = in.read()) != -1) {
  15. out.write(c);
  16. }
  17. }finally {
  18. if (in != null) {
  19. in.close();
  20. }
  21. if (out != null) {
  22. out.close();
  23. }
  24. }
  25. }
  26. }

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

  1. This is test for copy file.

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

  1. $javac CopyFile.java
  2. $java CopyFile

三、标准流

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

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

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

  1. import java.io.*;
  2.  
  3. public class ReadConsole {
  4. public static void main(String args[]) throws IOException
  5. {
  6. InputStreamReader cin = null;
  7.  
  8. try {
  9. cin = new InputStreamReader(System.in);
  10. System.out.println("Enter characters, 'q' to quit.");
  11. char c;
  12. do {
  13. c = (char) cin.read();
  14. System.out.print(c);
  15. } while(c != 'q');
  16. }finally {
  17. if (cin != null) {
  18. cin.close();
  19. }
  20. }
  21. }
  22. }

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

  1. $javac ReadConsole.java
  2. $java ReadConsole
  3. Enter characters, 'q' to quit.
  4. 1
  5. 1
  6. e
  7. e
  8. q
  9. q

四、读写文件

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

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

两个重要的流是FileInputStream和FileOutputStream。

五、文件输入流

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

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

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

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

  1. File f = new File("C:/java/hello");
  2. 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对象的构造函数。

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

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

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

  1. File f = new File("C:/java/hello");
  2. 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:

  1. public class FileStreamTest {
  2.  
  3. public static void main(String args[]) {
  4.  
  5. try {
  6. byte bWrite[] = { 11, 21, 3, 40, 5 };
  7. OutputStream os = new FileOutputStream("test.txt");
  8. for (int x = 0; x < bWrite.length; x++) {
  9. os.write(bWrite[x]); // writes the bytes
  10. }
  11. os.close();
  12.  
  13. InputStream is = new FileInputStream("test.txt");
  14. int size = is.available();
  15.  
  16. for (int i = 0; i < size; i++) {
  17. System.out.print((char) is.read() + " ");
  18. }
  19. is.close();
  20. } catch (IOException e) {
  21. System.out.print("Exception");
  22. }
  23. }
  24. } 

上面的代码将产生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”目录:

  1. import java.io.File;
  2.  
  3. public class CreateDir {
  4. public static void main(String args[]) {
  5. String dirname = "/tmp/user/java/bin";
  6. File d = new File(dirname);
  7. // Create directory now.
  8. d.mkdirs();
  9. }
  10. }
  11. //编译并执行以上代码创建 “/tmp/user/java/bin”

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

2、目录列表

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

  1. import java.io.File;
  2.  
  3. public class ReadDir {
  4. public static void main(String[] args) {
  5.  
  6. File file = null;
  7. String[] paths;
  8.  
  9. try{
  10. // create new file object
  11. file = new File("/tmp");
  12.  
  13. // array of files and directory
  14. paths = file.list();
  15.  
  16. // for each name in the path array
  17. for(String path:paths)
  18. {
  19. // prints filename and directory name
  20. System.out.println(path);
  21. }
  22. }catch(Exception e){
  23. // if any error occurs
  24. e.printStackTrace();
  25. }
  26. }
  27. }
  28. //基于/tmp目录下可用的目录和文件,将产生以下结果:
  29. test1.txt
  30. test2.txt
  31. ReadDir.java
  32. 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. 腾讯AI开放平台的接口调用指南

    最近无意发现腾讯AI开放平台上提供了大量好玩的人工智能云服务,而且是完全免费的.只需要用QQ号登录即可.这么好的东西,作为一个程序员,当然要试试了! 从上图可以看出腾讯AI开放平台提供的人工智能服务主 ...

  2. C++_pthread read-write lock_读写锁_visual studio 2015下配置

    pthread下载地址:https://sourceware.org/pthreads-win32/ 1. 项目->属性->VC++目录 包含目录里添加:pthread所在路径\pthre ...

  3. Codeforces 1076D——最短路算法

    题目 给你一个有n个顶点.m条边的无向带权图.需要擦除一些边使得剩余的边数不超过k,如果一个点在原始图到顶点1的最短距离为d,在删边后的图中到顶点的最短距离仍是d,则称这种点是 good.问如何删边, ...

  4. DB9串口引脚定义

    在单片机串口通信中,使用3根信号线就能够实现通信:RXD,TXD,GND. 经常使用的RS232串口线使用DB9端子. DB9分为公头和母头两种: 一般使用时,引脚定义如下: 连接方式: 注:RXD- ...

  5. Java练习demo 20190402 优惠券扣减

    实体类: package org.jimmy.autosearch2019.pojo; import java.math.BigDecimal; public class TestEntity2019 ...

  6. TWaver3D直线、曲线、曲面的绘制

    插播一则广告(长期有效) TWaver需要在武汉招JavaScript工程师若干 要求:对前端技术(JavasScript.HTML.CSS),对可视化技术(Canvas.WebGL)有浓厚的兴趣 基 ...

  7. sql实验

    数据表xiami_1,结构如下: CREATE TABLE xiami_1( id ) not null auto_increment, singer ) not null, title ) not ...

  8. Java 对象的创建以及类加载

    1. 对象的创建的过程: 类加载检查—>分配内存—>初始化零值—>设置对象头—>执行 init . 1.类加载检查: 虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数 ...

  9. 深搜DFS

    POJ-1321 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有 ...

  10. html前端如何将一个页面表单内的数据全部传递到另一个页面?

    http://blog.csdn.net/stone_tomcate/article/details/64148648?winzoom=1