`
海上明月共潮生--风铃
  • 浏览: 59780 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

java io 详解 上

    博客分类:
  • java
 
阅读更多

 io 很好地体现了java面向对象的设计思想
一个接口或抽象类的具体行为由子类决定,那么根据实例化子类的不同 完成的功能也不同
1,File

file类 在整个java.io 包中是一个独立的类,此类的主要功能是完成与平台无关的文件操作。例如:创建文件,产出文件等等。
在File类中提供了一下构造方法:public File(String pathname)
在使用时需要制定一个文件的具体路径
1.1 创建文件
  

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

public class CreateFileDemo01 {

	public static void main(String[] args) {
		File file = new File("d:\\demo.txt"); // 找到File类的实例
		try {
			file.createNewFile(); // 创建文件
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

 

 

 1.2 删除文件
      file.delete();
 注:由于windows:\
         linux:/
java 本市跨平台的语言 所以FIle类中提供了已下常量   
public static final String pathSeparator ; ";"
public static final String separator  "\" "/"
来代替所以 用File.separator 来进行分隔
1.3,判断文件是否存在
public boolean exists();
file.exists();
1.4 判断路径是文件还是文件夹
public boolean isDirextory()
public boolean isFile()
File file1=new File("d:"+File.separator+"demo");
File file2=new File("d:"+File.separator+"demo.txt");
System.out.println(file1.isFile);
1.5 列出目录中的内容

import java.io.File;

public class ListDemo {

	public static void main(String[] args) {
		File file = new File("d:" + File.separator + "docs"); // 找到File类的实例
		String path[] = file.list(); // 列出全部的内容
		for (int i = 0; i < path.length; i++) {
			System.out.println(path[i]) ;
		}
	}

}

  

 

 

 

 list()列出的只是一目录下的文件或文件夹

 

 为了清楚地表示列出的路径:

import java.io.File;

public class ListFilesDemo {

	public static void main(String[] args) {
		File file = new File("d:" + File.separator + "docs"); // 找到File类的实例
		File path[] = file.listFiles(); // 列出全部的子文件或文件夹
		for (int i = 0; i < path.length; i++) {
			System.out.print(path[i].getParent() + " --> ");
			System.out.println(path[i].getPath());
		}
	}

}

 

 

 listFiles() 列出的却是完整的路径。如果箱操作文件肯经后者更方便。找到了FIle类的对象就找到了完整的路径。


1.6创建目录
mkdir()

File file=new File("d:\\aa\\demo.txt");
File.mkdir();

1.7列出一个目录中所有的文件或文件夹

 

 

import java.io.File;

public class ListDirectoryDemo {

	public static void main(String[] args) {
		File file = new File("d:" + File.separator);
		list(file);
	}

	public static void list(File file) {
		if (file.isDirectory()) {
			File lists[] = file.listFiles();
			if (lists != null) {
				for (int i = 0; i < lists.length; i++) {
					list(lists[i]);// 列出内容
				}
			}
		}
		System.out.println(file);
	}
}

 

 2 RandomAccessFile
之前的File类只是针对文件本身进行操作的,而如果要对文件内容进行操作,则需要RandomAccessFile类
此类属于随机读取类,可以随机读取一个文件中指定位置的数据。
想要实现随机读取,则存储数据的时候保证数据长度的一致性是必须的,否则无法成功。

 

 



 
public RandomAccessFile(File file,String mode)throws FileNotFoundException
读模式:r 写:w 读写:rw
其中读写模式是最重要的 如果操作的文件不存在的话 会帮用户自动创建的。
2.1 写入操作
 

 

import java.io.File;
import java.io.RandomAccessFile;

public class RandomAccessFileDemo01 {
	public static void main(String[] args) throws Exception {// 所有异常抛出
		File file = new File("d:" + File.separator + "demo.txt");// 指定要操作的文件
		RandomAccessFile raf = new RandomAccessFile(file, "rw");// 以读写的形式进行操作
		// 写入第一条数据
		String name = "zhangsan";// 表示姓名
		int age = 30; // 表示年龄
		raf.writeBytes(name); // 以字节的方式将字符串写入
		raf.writeInt(age); // 写入整型数据
		// 写入第二条数据
		name = "lisi    ";// 表示姓名
		age = 31; // 表示年龄
		raf.writeBytes(name); // 以字节的方式将字符串写入
		raf.writeInt(age); // 写入整型数据
		// 写入第三条数据
		name = "wangwu  ";// 表示姓名
		age = 32; // 表示年龄
		raf.writeBytes(name); // 以字节的方式将字符串写入
		raf.writeInt(age); // 写入整型数据
		raf.close();// 文件操作的最后一定要关闭
	}

}

 

 

2.2 读取操作
RandomAccessFile 操作的读取方法都是从DataInput接口实现而来的,有一系列的readXx()方法可以读取各类型的数据。
但是在RandomAccessFile 中可以实现随机读取,所以有一系列的控制方法。
回到读取点:public void seek(long pos) throws IOException
跳过读取点:public int skipBytes(int n) throws IOException

 

import java.io.File;
import java.io.RandomAccessFile;

public class RandomAccessFileDemo02 {
	public static void main(String[] args) throws Exception {// 所有异常抛出
		File file = new File("d:" + File.separator + "demo.txt");// 指定要操作的文件
		RandomAccessFile raf = new RandomAccessFile(file, "r");// 以读的形式进行操作
		byte b[] = null;// 定义字节数组
		String name = null;
		int age = 0;
		b = new byte[8];
		raf.skipBytes(12); // 跨过第一个人的信息
		System.out.println("第二个人的信息:");
		for (int i = 0; i < 8; i++) {
			b[i] = raf.readByte(); // 读取字节
		}
		age = raf.readInt();// 读取数字
		System.out.println("\t|- 姓名:" + new String(b));
		System.out.println("\t|- 年龄:" + age);
		raf.seek(0);// 回到开始位置
		System.out.println("第一个人的信息:");
		for (int i = 0; i < 8; i++) {
			b[i] = raf.readByte(); // 读取字节
		}
		age = raf.readInt();// 读取数字
		System.out.println("\t|- 姓名:" + new String(b));
		System.out.println("\t|- 年龄:" + age);
		raf.skipBytes(12); // 跨过第二个人的信息
		System.out.println("第三个人的信息:");
		for (int i = 0; i < 8; i++) {
			b[i] = raf.readByte(); // 读取字节
		}
		age = raf.readInt();// 读取数字
		System.out.println("\t|- 姓名:" + new String(b));
		System.out.println("\t|- 年龄:" + age);
		raf.close();// 文件操作的最后一定要关闭
	}
}

 

 
在文件中提供了指针,完成具体的操作功能。
RandomAccessFile可以进行读写操作旦毕竟比较麻烦,java读写操作一般都用字符流或字节流
3,字节流
整个io包中流的操作就分为两种
字节流和字符流
OutputStream InputStream writer reader
3.1 OutputStream 字节输出流
OutputStream 是抽象类  FileOutputStream 是实例化子类。
方法 写入全部字节数组:public void write(byte[] b)throws IOException
     写入部分字节数组:public void write(byte[] b,int off,int len)throws IOException
     写入一个数据:public abstract  void write(int b)throws IOException

 

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

public class OutputStreamDemo01 {
	public static void main(String[] args) throws Exception {
		File file = new File("d:" + File.separator + "demo.txt"); // 要操作的文件
		OutputStream out = null; // 声明字节输出流
		out = new FileOutputStream(file); // 通过子类实例化
		String str = "hello world"; // 要输出的信息
		byte b[] = str.getBytes(); // 将String变为byte数组
		out.write(b); // 写入数据
		out.close(); // 关闭
	}

}

  

当然也可以循环一个一个输出
 

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

public class OutputStreamDemo02 {
	public static void main(String[] args) throws Exception {
		File file = new File("d:" + File.separator + "demo.txt"); // 要操作的文件
		OutputStream out = null; // 声明字节输出流
		out = new FileOutputStream(file); // 通过子类实例化
		String str = "hello world"; // 要输出的信息
		byte b[] = str.getBytes(); // 将String变为byte数组
		for (int i = 0; i < b.length; i++) {
			out.write(b[i]); // 写入数据
		}
		out.close(); // 关闭
	}

}

 

 

 

以上操作 会发现一个问题每次执行完,所有的内容都会被覆盖掉,如果希望追加:
仔细观察 构造方法 public FileOutputStream(File file,boolean append)throws FileNotFoundException
如果将append的内容设为true 这表示追加

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

public class AppendOutputStreamDemo {
	public static void main(String[] args) throws Exception {
		File file = new File("d:" + File.separator + "demo.txt"); // 要操作的文件
		OutputStream out = null; // 声明字节输出流
		out = new FileOutputStream(file, true); // 通过子类实例化,表示追加
		String str = "hello world \r\n"; // 要输出的信息,“\r\n”表示换行
		byte b[] = str.getBytes(); // 将String变为byte数组
		out.write(b); // 写入数据
		out.close(); // 关闭
	}

}

  


3.2 ,InputStream
字节输入流 也是一个抽象类。FileInputStream 是子类实例化
方法: 将内容读到字节数组中 public int read(byte[] b) throws TOException
       每次住一个数据:public abtract int read() throws IOException

 

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

public class InputStreamDemo01 {
	public static void main(String[] args) throws Exception {
		File file = new File("d:" + File.separator + "demo.txt"); // 要操作的文件
		InputStream input = null; // 字节输入流
		input = new FileInputStream(file);// 通过子类进行实例化操作
		byte b[] = new byte[1024];// 开辟空间接收读取的内容
		int len = input.read(b); // 将内容读入到byte数组中
		System.out.println(new String(b, 0, len)); // 输出内容
		input.close(); // 关闭
	}

}

 

以上读取方式 有一个问题 就是会受到开辟控件的限制,如果动态开辟数组空间采用read()方法一个一个的读取。
 

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

public class InputStreamDemo02 {
	public static void main(String[] args) throws Exception {
		File file = new File("d:" + File.separator + "demo.txt"); // 要操作的文件
		InputStream input = null; // 字节输入流
		input = new FileInputStream(file);// 通过子类进行实例化操作
		byte b[] = new byte[(int)file.length()];// 开辟空间接收读取的内容
		for(int i=0;i<b.length;i++){
			b[i] = (byte)input.read() ;	// 一个个的读取数据
		}
		System.out.println(new String(b)); // 输出内容,直接转换
		input.close(); // 关闭
	}

}

 

 

4,字符流
字符流与字节流不同就在于使用的char数组 字符流是两个字节两个字节的拿数据对于存取汉字特别方便
4.1 Reader 抽象类 实例化子类是FileReader
方法:读取一组字节 public int read(char[] cbuf) throws IOException
      读取一个个字符  public int read() throws IOException

import java.io.File;
import java.io.FileReader;
import java.io.Reader;

public class ReaderDemo01 {
	public static void main(String[] args) throws Exception {
		File file = new File("d:" + File.separator + "demo.txt"); // 要操作的文件
		Reader input = null; // 字符输入流
		input = new FileReader(file);// 通过子类进行实例化操作
		char b[] = new char[1024];// 开辟空间接收读取的内容
		int len = input.read(b); // 将内容读入到byte数组中
		System.out.println(new String(b, 0, len)); // 输出内容
		input.close(); // 关闭
	}

}

 

 

 

以上完成了资格字符的输入流,那么当然也可以通过循环的方式,一个一个的进行读取操作。
 

import java.io.File;
import java.io.FileReader;
import java.io.Reader;

public class ReaderDemo02 {
	public static void main(String[] args) throws Exception {
		File file = new File("d:" + File.separator + "demo.txt"); // 要操作的文件
		Reader input = null; // 字节输入流
		input = new FileReader(file);// 通过子类进行实例化操作
		char b[] = new char[(int)file.length()];// 开辟空间接收读取的内容
		for(int i=0;i<b.length;i++){
			b[i] = (char)input.read() ;	// 一个个的读取数据
		}
		System.out.println(new String(b)); // 输出内容,直接转换
		input.close(); // 关闭
	}

}

 

 

5字节流与字符流的区别
例1 

import java.io.File; import java.io.FileOutputStream;
 import java.io.OutputStream;
 public class OutputStreamDemo01 {
 public static void main(String[] args) throws Exception {
 File file = new File("d:" + File.separator + "demo.txt"); // 要操作的文件 
OutputStream out = null; // 声明字节输出流
 out = new FileOutputStream(file); // 通过子类实例化 
String str = "hello world"; // 要输出的信息 
byte b[] = str.getBytes(); // 将String变为byte数组
 out.write(b); // 写入数据 
  } 
}

 

 

以上并没有关闭操作 发现可以输出
 

import java.io.File;
import java.io.FileWriter;
import java.io.Writer;

public class WriterDemo {
	public static void main(String[] args) throws Exception {
		File file = new File("d:" + File.separator + "demo.txt"); // 要操作的文件
		Writer out = null; // 声明字符输出流
		out = new FileWriter(file); // 通过子类实例化
		String str = "hello world"; // 要输出的信息
		out.write(str); // 写入数据
	 	}

}

 

 

发现并没有输出 但是Writer 有一个方法flush()
 

import java.io.File;
import java.io.FileWriter;
import java.io.Writer;

public class WriterDemo {
	public static void main(String[] args) throws Exception {
		File file = new File("d:" + File.separator + "demo.txt"); // 要操作的文件
		Writer out = null; // 声明字符输出流
		out = new FileWriter(file); // 通过子类实例化
		String str = "hello world"; // 要输出的信息
		out.write(str); // 写入数据
		out.flush(); // 刷新
	}

}

 

 


实际来讲,最早的造作中并没有刷新,因为使用了关闭 关闭会强制刷新 刷新的是缓冲区 (内存)
结论:字节流---->
      字符流---->缓冲区--->文件
综合来讲,在传输或者硬盘上保存的内容都是以字节的形式存在的。但是操作中文 字符流更好使。

  • 大小: 26.1 KB
分享到:
评论

相关推荐

    Java教程之javaIO详解

    Java IO 详解 Java IO(Input/Output)是 Java 语言中用于处理输入输出操作的类库,提供了大量的类和方法来实现文件、网络、字节流等方面的输入输出操作。下面对 Java IO 中的重要知识点进行详细说明。 一、File ...

    java中的io详解.

    Java 中的 IO 详解 Java IO 是指应用程序对外部设备的数据输入和输出,在程序中,键盘被当作输入文件,显示器被当作输出文件使用。Java 语言定义了许多类专门负责各种方式的输入输出,这些类都被放在 java.io 包中...

    Java_IO流详解

    Java_IO流详解 Java 的核心库 java.io 提供了全面的 IO 接口,包括文件读写、标准设备输出等。Java 中 IO 是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入。在项目开发中,IO 是非常...

    JavaIO文件复制优化-JavaIO优化详解(下载可用)

    JavaIO文件复制优化——JavaIO优化详解(下载可用)。个人经导师指导并认可通过的98分大作业设计项目,适用人群:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业或毕业设计,作为“参考资料”使用。...

    java_io详解

    ### Java IO详解 #### 1. 什么是IO 在计算机科学中,IO(Input/Output,输入/输出)指的是程序与外部系统之间进行数据交换的过程。在Java中,IO操作主要通过`java.io`包来实现,这个包包含了用于文件读写、标准...

    JavaIO流详解归纳.pdf

    JavaIO流详解归纳 Java 的核心库 java.io 提供了全面的 IO 接口,包括文件读写、标准设备输出等。Java 中 IO 是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入。在项目开发中,IO 是非常...

    java中的io流详解

    Java 中的 IO 流详解 Java 中的 IO 流是指在 Java 语言中对输入输出操作的抽象,主要用于实现程序与外部设备和其他计算机之间的交流,尤其是对磁盘文件的操作。IO 流的概念是在 1984 年由 C 语言第一次引入的,后来...

    java IO流详解

    ### Java IO流详解 #### 一、流的概述与分类 在Java中,流是一种抽象概念,用于描述数据从一个地方传输到另一个地方的过程。它主要用于处理数据输入和输出,例如从磁盘读取文件、向网络发送数据或从键盘接收用户...

    java IO部分详解

    java IO部分详解各种流的解析例如 InputStream

    java.io详解

    ### Java IO流详解 #### 一、Java IO流概述 Java IO流是Java标准库中的一个重要组成部分,主要用于处理数据的输入输出操作。根据处理的数据类型不同,Java IO流被分为两大类:字节流(byte streams)和字符流...

    32.9、java io详解1

    Java IO 之字节流和字符流的区别 Java 中的 IO 操作是指对文件、网络或其他输入/输出设备的读写操作。Java 中的 IO 操作可以分为两大类:字节流和字符流。字节流和字符流是 Java 中的两种基本的 IO 操作方式,它们...

    javaio详解【2】.pdf

    Java IO 是Java平台中用于处理输入输出操作的重要部分,它提供了丰富的类库,使得开发者能够高效地读写数据。在Java中,IO是以流为基础进行的,数据被串行化写入输出流或从输入流读取。Java的IO体系分为字节流和字符...

    JAVA IO流详解

    ### JAVA IO流详解 #### 一、Java IO流概述 Java IO流是Java程序与外部设备之间进行数据交互的重要方式之一。Java的核心库`java.io`提供了丰富的接口用于实现文件读写、标准设备输入输出等功能。Java IO流的设计...

    java IO流详细笔记

    Java IO流详解

    java_IO 详解java_IO 详解

    另外,Java 还提供了过滤流(Filter Stream)的概念,允许通过装饰器模式动态添加功能,比如 `DataInputStream` 可以在 `InputStream` 上添加解析基本数据类型的能力。 对于输入/输出操作,面试例题 29 中创建文件 ...

    java io 详解

    ### Java IO 详解 #### 一、Java IO体系概述 Java IO(Input/Output)是Java编程语言中处理输入输出的基础。它主要包括两大类:字节流和字符流。字节流主要处理二进制数据,如图片、音频等;字符流则用于处理文本...

    JAVA_IO详解_包括讲解IO中各种流及其用法.pdf

    JAVA IO流是Java编程中用于处理输入输出操作的重要工具。IO流主要分为两大类,即输入流(Input Streams)和输出流(Output Streams),它们用于读取或写入数据到不同的数据源,比如文件、网络连接或内存中的字节数组。在...

Global site tag (gtag.js) - Google Analytics