`
chenzehe
  • 浏览: 539502 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java IO 基础

 
阅读更多

Java IO之File类

Java IO中所有的操作类跟接口都放在 java.io 包中,主要的类和接口有 File InputStream OutputStream Reader Writer Serialzable 接口。

 

1、 File

File类在整个 IO 中是独立的类,此类的主要功能是与平台无关的文件操作,如创建文件、删除文件等,在 File 类中提供了 public File(String pathname) ,在使用的时候需要指定一个具体的文件路径。

 

2、创建文件

package com.chenzehe.test.io;

import java.io.File;

import java.io.IOException;

public class CreateFileDemo {

    public static void main(String[] args) {

        File file = new File("D://demo.txt");

        try {

            file.createNewFile();

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

}
 

上面程序只是创建文件,如果需要使用具体的内容输出,则需要依靠IO 操作流。

 

 

3、删除文件

删除文件则使用File 对象的 delete() 方法,如:

package com.chenzehe.test.io;

import java.io.File;

public class DeleteFileDemo {

    public static void main(String[] args) {

        File file = new File("D://demo.txt");

        //删除前先判断下文件是否存在

        if (file.exists()) {

            file.delete();

        }

    }

}
 

以上方法虽然完成了文件的操作,可是代码的兼容性有问题,在各个操作系统中文件的分隔符是不一样的,Windows 中的为 \ Linux 中的为 / ,在 File 类中提供提供了下面几种常量:

路径分隔符:public static final String pathSeparator ";"

分隔符:public static final separator "/" 或者 "\"

正常的Java 常量是以大写命名的,这里使用小写是由于历史的原因,以后的程序都采用 File.separator 常量进行分隔。 

 

 

4、判断路径是文件还是文件夹

在文件中可以使用以下方法判断是否是文件夹:public boolean isDirectory()

判断是否是文件:public boolean isFile()

 

 

5、列出目录中的内容

File 类中提供了下面两个方法列出目录列表:

public String[] list()

public File[] listFiles()

 

 

6、创建目录

使用File 类的 mkdir() 方法,如:

 

package com.chenzehe.test.io;

import java.io.File;

public class MkdirDemo {

    public static void main(String[] args) {

        File file = new File("D:" + File.separator + "demo.txt");

        file.mkdir();

    }

}
 

Java IO之RandomAccessFile

    RandomAccessFile 类的主要功能是完成文件的随机读取操作,可以随机读取文件中指定位置的数据。如果要实现随机读取,则数据在文件中保存的长度必须要一致,否则无法实现该功能。

 

    RandomAccessFile实现了 DataOutput DataInput Closeable 接口。

    RandomAccessFile的构造方法:

    public RandomAccessFile(File file,String mode) throes FileNotFoundException

 

    该构造方法需要接收一个File 的实例,和一个操作模式:

    只读模式:r

    只写模式:w

    读写模式:rw ,此模式如果文件不存在,则自动创建文件

 

 

1、 使用RandomAccessFile 进行写入操作

写入操作方法主要为从DataOutput 接口中实现的一系列 writeXxx() 方法,如:

 

package com.chenzehe.test.io;

import java.io.File;

import java.io.RandomAccessFile;

public class RandomAccessFileDemo {

    public static void main(String[] args) throws Exception {

        File file = new File("D:" + File.separator + "demo.txt");

        RandomAccessFile radomAccessFile = new RandomAccessFile(file, "rw");

        // 写入第一条数据

        String name = "first     ";

        int age = 30;

        radomAccessFile.writeBytes(name);

        radomAccessFile.writeInt(age);

        // 写入第二条数据

        name = "second    ";

        age = 31;

        radomAccessFile.writeBytes(name);

        radomAccessFile.writeInt(age);

        // 写入第三条数据

        name = "third     ";

        age = 32;

        radomAccessFile.writeBytes(name);

        radomAccessFile.writeInt(age);

        radomAccessFile.close();//关闭文件

    }

}
 

2、 RandomAccessFile读操作

RandomAccessFile读操作是从实现 DataInput 接口方法而来,有一系列的 readXxx() 方法,可以读取各种类型的数据,有下面两种方法控制读取位置:

回到读取点:public void seek(long pos) throws IOException

跳过n 个字节数: public void skipBytes(int n) throws IOException

如:


package com.chenzehe.test.io;

import java.io.File;

import java.io.RandomAccessFile;

public class RandomAccessFileDemo {

    public static void main(String[] args) throws Exception {

        File file = new File("D:" + File.separator + "demo.txt");

        RandomAccessFile radomAccessFile = new RandomAccessFile(file, "rw");

        byte[] b = new byte[10];

        String name = null;

        int age = 0;

        radomAccessFile.skipBytes(14);// 跳过第一个人的信息

        System.out.println("第二个人的信息为:");

        for (int i = 0; i < 10; i++) {

            b[i] = radomAccessFile.readByte();

       }

        age = radomAccessFile.readInt();// 读取数字

        System.out.println("姓名:" + new String(b));

        System.out.println("年龄:" + age);

        radomAccessFile.seek(0);// 回到第一个人信息开始处

        System.out.println("第一个人的信息为:");

        for (int i = 0; i < 10; i++) {

            b[i] = radomAccessFile.readByte();

        }

        age = radomAccessFile.readInt();// 读取数字

        System.out.println("姓名:" + new String(b));

        System.out.println("年龄:" + age);

        radomAccessFile.skipBytes(14);// 此时文件读取指针在第一个人信息末,跳过第二个人信息

        System.out.println("第三个人的信息为:");

        for (int i = 0; i < 10; i++) {

            b[i] = radomAccessFile.readByte();

        }

        age = radomAccessFile.readInt();// 读取数字

        System.out.println("姓名:" + new String(b));

        System.out.println("年龄:" + age);

        radomAccessFile.close();// 关闭文件

    }

}

 

Java IO之字节流和字符流

在整个 Java IO 中,流的操作分两种:

字节流:字节输出流OutputStream 和字节输入流 InputStream

字符流:一个字符等于两个字节,分为字符输出流Writer 和字符输入流 Reader

 

Java IO操作的基本步骤为:

一:使用File 找到一个文件

二:使用字节流或字符流的子类为OutputStream IntputStream Writer Reader 进行实例化操作

三:进行读或写的操作

四:关闭资源:close() ;在所有流操作中,最终必须要关闭。

 

 

1、 字节输出流OutputStream

java.io 包中 OutputStream 是字节输出流最大的父类:

public abstract class OutputStream extends Object implements Closeable,Flushable

 

此类是一个抽象类,依靠其子类进行文件操作,实现该接口的子类有:

ByteArrayOutputStream FileOutputStream FilterOutputStream ObjectOutputStream OutputStream PipedOutputStream

 

OutputStream提供了以下写入数据的方法:

写入全部字节数组: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

 

如果要完成文件的输出操作,则使用FileOutputStream 进行实例化工作:

package com.chenzehe.test.io;

import java.io.File;

import java.io.FileOutputStream;

import java.io.OutputStream;

public class FileOutputStreamDemo {

    public static void main(String[] args) throws Exception {

        File file = new File("D:" + File.separator + "demo.txt");

        OutputStream outputStream = new FileOutputStream(file);

        String str = "hello world";

        byte[] b = str.getBytes();

        outputStream.write(b);

        outputStream.close();

    }

}

或:

package com.chenzehe.test.io;

import java.io.File;

import java.io.FileOutputStream;

import java.io.OutputStream;

public class FileOutputStreamDemo {

    public static void main(String[] args) throws Exception {

        File file = new File("D:" + File.separator + "demo.txt");

        OutputStream outputStream = new FileOutputStream(file);

        String str = "hello world";

        byte[] b = str.getBytes();

        for (int i = 0; i < b.length; i++) {

            outputStream.write(b[i]);
 
        }

        outputStream.close();

     }

}
 

 

以上方式实现发现每次执行后都把上一次的内容替换掉,如果期望追加内容,则使用FileOutputStream 的下面构造方法:

public FileOutputStream(File file,boolean append) throws FileNotFoundException,如果将 append 设置为 true ,则表示追加内容。

 

 

2、 字节输入流InputStream

public abstract class InputStream extends Object implements Closeable

此类属于抽象类,需要使用其子类来实现文件的操作,实现它的子类有:

AudioInputStream ByteArrayInputStream FileInputStream FilterInputStream InputStream ObjectInputStream PipedInputStream SequenceInputStream StringBufferInputStream ,如果是要实现对文件的操作,则使用 FileInputStream 类,该类有如下方法可读取数据:

将内容读取到字节数组之中:public int read(byte[] b) throws IOException 

每次只读一个数据:public abstract int read() throws IOException

package com.chenzehe.test.io;

import java.io.File;

import java.io.InputStream;

import java.io.FileInputStream;

public class FileInputStreamDemo {

    public static void main(String[] args) throws Exception {

        File file = new File("D:" + File.separator + "demo.txt");

        InputStream inputStream = new FileInputStream(file);

        byte[] b = new byte[1024];

        inputStream.read(b);

        System.out.println(new String(b));

        inputStream.close();

    }

}
 

 

以上是一种比较常见的读取形式,上面给b 开辟了 1024 个字节码的空间,但是实际字符并达不到 1024 长度,所以在输出后面输出很多空格,以上的代码有一个缺点,会受到开辟空间的限制,如果想动态的开辟数组空间,则可以根据文件的大小来决定,采用 read() 方法一个个数据的读取。

 

package com.chenzehe.test.io;

import java.io.File;

import java.io.FileInputStream;

import java.io.InputStream;

public class FileInputStreamDemo {

    public static void main(String[] args) throws Exception {

        File file = new File("D:" + File.separator + "demo.txt");

        InputStream inputStream = new FileInputStream(file);

        byte[] b = new byte[(int) file.length()];

        inputStream.read(b);

        System.out.println(new String(b));

        inputStream.close();

    }

}
 

 

3、 字符输出流Writer

Writer类是在 IO 包中操作字符的最大父类,主要功能是完成字符流的输出, Writer 类的定义如下:

public abstract class Writer extends Object implements Appendable,Closeable,Flushable

OutputStream 一样, Writer 类也发球抽象类,如果要进行文件操作,则使用 FileWriter,

写入操作为:public void writer(String str) throws IOException

可追加的写入操作:public void writer(String str,boolean append) throws IOException

如:

 

 

package com.chenzehe.test.io;
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
public class FileWriterDemo {
	public static void main(String[] args) throws Exception {
		File file = new File("D:" + File.separator + "demo.txt");
		Writer writer = new FileWriter(file);
		String str = "hello world";
		writer.write(str);
		writer.close();
	}
}
 

 

4、 字符输入流Reader

字符输入流与字节输入流不同的地方是使用的是char 数组, Reader 的定义为:

public abstract class Reader extends Object implements Readable,Closeable Reader 是一个抽象类,可以使用 FileReader 类进行文件操作,读取方法有:

读取一组字符:public int read(char[] cbuf) throws IOException

读取一个字符:public int read() throws IOException

如:

package com.chenzehe.test.io;
import java.io.File;
import java.io.FileReader;
import java.io.Reader;
public class FileReaderDemo {
	public static void main(String[] args) throws Exception {
		File file = new File("D:" + File.separator + "demo.txt");
		Reader reader = new FileReader(file);
		char[] c = new char[(int)file.length()];
		reader.read(c);
		System.out.println(new String(c));
		reader.close();
	}
}
 

使用字符流也可以一个个的输出:

 

package com.chenzehe.test.io;
import java.io.File;
import java.io.FileReader;
import java.io.Reader;
public class FileReaderDemo {
	public static void main(String[] args) throws Exception {
		File file = new File("D:" + File.separator + "demo.txt");
		Reader reader = new FileReader(file);
		char[] c = new char[(int) file.length()];
		for (int i = 0; i < c.length; i++) {
			c[i] = (char) reader.read();
		}
		System.out.println(new String(c));
		reader.close();
	}
}
 

5、 字节流和字符流的区别

下面字节流操作文件代码没有关闭操作,内容照常被写到文件中:

package com.chenzehe.test.io;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class FileOutputStreamDemo {
	public static void main(String[] args) throws Exception {
		File file = new File("D:" + File.separator + "demo.txt");
		OutputStream outputStream = new FileOutputStream(file);
		String str = "hello world";
		byte[] b = str.getBytes();
		outputStream.write(b);
		//outputStream.close();
	}
}
 

 

下面字符流操作文件代码没有关闭操作,但是内容并没有写到文件中:

package com.chenzehe.test.io;
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
public class FileWriterDemo {
	public static void main(String[] args) throws Exception {
		File file = new File("D:" + File.separator + "demo.txt");
		Writer writer = new FileWriter(file);
		String str = "hello world";
		writer.write(str);
		//writer.close();
	}
}
 

但是使用了flush() 方法后,即使没有关闭操作,内容就被写到文件中了:

package com.chenzehe.test.io;
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
public class FileWriterDemo {
	public static void main(String[] args) throws Exception {
		File file = new File("D:" + File.separator + "demo.txt");
		Writer writer = new FileWriter(file);
		String str = "hello world";
		writer.write(str);
		// writer.close();
		writer.flush();// 刷新缓冲区
	}
}
 

之前代码只有close() 方法而没有 flush() 方法也能写进文件是因为 close() 方法会强制刷新缓冲区,可以得出下面结论:

字节操作流直接操作文件,不使用缓冲区

字符操作流是操作缓冲区,然后再通过缓冲区操作文件

综合来说,在传输或者硬盘上的数据都是以字节的形式保存的,所以字节流的操作比较多,但是在操作中文的时候,字符流用的比较多。

 

Java IO之内存流

    FileInputStream FileOutputStream 操作的目标是文件,假设有一些临时的信息需要通过 IO 操作,如果将这些临时信息保存到文件中不太合理,因为操作的最后还需要把文件给删除掉,所以 IO 操作中就提供了内存操作流,它的操作目标是内存。

 

使用ByteArrayOutputStream ByteArrayInputStream 来完成内存操作流:

ByteArrayOutputStream:用于内存向程序输出,其基本作用就像 OutputStream 一样,一个个的数据读取;

ByteArrayInputStream:用于从程序向内存写入,其构造方法为:

public ByteArrayInputStream(bute[] buf);

 

 

以下代码为使用内存操作流完成小写字母到大写字母的转换:

package com.chenzehe.test.io;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

public class ByteArrayStreamDemo {
	public static void main(String[] args) {
		String helloworld = "helloworld";
		ByteArrayInputStream bis = new ByteArrayInputStream(
				helloworld.getBytes());
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		int temp = 0;
		while ((temp = bis.read()) != -1) {
			char c = (char) temp;
			bos.write(Character.toUpperCase(c));
		}
		System.out.println(bos.toString());
	}
}

 


Java IO之管道流

    管理流是两个线程间通信使用的,由 PipedOutputStream PipedInputStream 两个类来完成,这两个类在使用的时候基本上和 OutputStream InputStream 一样,唯一的区别就是在于连接管道的操作上: public void connect(PipedInputStream snk)  throws IOException

   下面代码进行管道流的操作:

 

package com.chenzehe.test.io;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;

// 发送数据的类
class Send implements Runnable {
	private PipedOutputStream output = null;
	public Send() {
		this.output = new PipedOutputStream();
	}
	public void run() {
		String helloworld = "hello world!";
		try {
			this.output.write(helloworld.getBytes());
			this.output.close();
		} catch (Exception e) {

		}
	}
	public PipedOutputStream getOutput() {
		return output;
	}
	public void setOutput(PipedOutputStream output) {
		this.output = output;
	}
}

// 接收数据的类
class Receive implements Runnable {
	private PipedInputStream input = null;
	public Receive() {
		this.input = new PipedInputStream();
	}
	public void run() {
		byte[] b = new byte[1024];
		int len = 0;
		try {
			len = this.input.read(b);
			this.input.close();
		} catch (Exception e) {

		}
		System.out.println(new String(b, 0, len));
	}
	public PipedInputStream getInput() {
		return input;
	}
	public void setInput(PipedInputStream input) {
		this.input = input;
	}
}

public class PipedStreamDemo {
	public static void main(String[] args) throws Exception {
		Send send = new Send();
		Receive receive = new Receive();
		send.getOutput().connect(receive.getInput());// 进行管道连接
		new Thread(send).start();
		new Thread(receive).start();
	}
}

 

Java IO之打印流

    使用 OutputStream可以完成数据的输出功能,但是如果输出一个 float 类型的数据并不好输出,它的输出功能并不强大,要想使用更强大的输出功能,则可以使用打印流。打印流有两种:一种是 PrintStream ,一种是 PrintWriter

 

PrintStream的定义:

public class PrintStream extends FilterOutputStream implements Appendable,Closeable{

}

 

PrintStream OutputStream 的子类

 

PrintStream的构造方法:

public PrintStream(OutputStream out){

}

 

实际上PrintStream 属于装饰,也就是说根据实例化 PrintStream 类的对象不同,输出的功能也不同。

下面代码为使用PrintStream 向文件输出:

 

package com.chenzehe.test.io;
import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintStream;

public class PrintStreamDemo {
	public static void main(String[] args) throws Exception {
		File file = new File("D:" + File.separator + "demo.txt");
		PrintStream out = new PrintStream(new FileOutputStream(file));
		out.print("hello ");
		out.println("world!");
		out.println(100);
	}
}

 

 

分享到:
评论

相关推荐

    java IO 基础教程之一

    java IO 基础教程 讲述IO的基本原理

    java IO基础

    以上就是Java IO基础的一些关键知识点,通过深入理解和熟练掌握这些内容,可以有效地处理程序与外部世界的交互,实现数据的高效读写和传输。提供的资料“java_javase201_day01.pdf”、“java_javase201_day02.pdf”...

    Java IO 基础操作(文件读写和移动)

    除了基础流,Java NIO(New IO)提供了一种更高效、非阻塞的IO模型。`java.nio`包下的`FileChannel`和`Files`类提供了更高级的文件操作,如映射内存到文件(MMap),以及异步文件操作。 例如,使用`Files`类移动...

    java IO操作详解.pdf

    #### 一、Java IO基础概念 Java IO(Input/Output)是Java编程语言中处理输入输出的基础框架。它提供了多种类和接口来处理不同类型的输入输出需求,包括文件读写、网络通信等。Java IO体系结构可以分为两大类:字节...

    Java IO 工具类大全

    一、Java IO基础 Java IO体系主要由流(Stream)组成,分为字节流和字符流两大类,分别处理字节数据和字符数据。字节流包括InputStream和OutputStream家族,字符流则包括Reader和Writer家族。这些基类都有许多子类...

    Java IO commons-io-2.5.jar

    一、Java IO 基础 Java IO 包含了许多类,如InputStream、OutputStream、Reader、Writer等,它们分别用于处理字节流和字符流。字节流适用于二进制数据,而字符流适用于文本数据。Java IO 还包括Filter流,可以用来...

    java io基础

    01_IO初步_java基础_www.gougu.net_文件流

    Java IO应届生培训讲义

    Java IO应届生培训讲义是一份面向刚毕业的大学生进行Java IO相关知识的培训资料,它涵盖了Java IO的基础知识、不同的IO模型以及Java中的BIO、NIO和AIO高级IO类库。下面详细解释这些知识点: 1. 用户空间和内核空间 ...

    第一行代码Java源代码第11章课程代码JavaIO编

    总的来说,《第一行代码Java源代码第11章》的课程内容会涵盖以上所述的Java IO基础知识,并通过实例代码帮助读者实践这些概念。通过学习这一章,开发者能够熟练掌握Java中的文件操作、流处理和网络通信,为后续的...

    java基础之IO流

    ### Java IO流基础知识点 #### 一、IO流概述 - **定义**:在Java中,IO流(Input/Output Streams)是用来处理输入输出的基本工具。流是一种有序的数据集合,通常涉及从源到目的地的数据传输过程。源可以是文件、...

    javaIo操作的基础代码

    在提供的压缩包文件"Io基础文档"中,可能包含了关于这些概念的详细说明、示例代码和实战指导,对于深入理解和掌握Java IO操作非常有帮助。学习和理解这些内容,将有助于开发者在处理数据输入输出时编写出高效、稳定...

    java中的IO的基础教学(1)

    本教程将深入讲解Java IO流的基础知识,包括其概念、分类、常用类以及如何在实际编程中应用。 一、IO流的概念 IO流是Java提供的一组接口和类,用于在不同数据源之间传输数据。数据源可以是文件、内存、网络连接等。...

    Java IO知识点

    首先,File类是Java IO的基础,它可以表示文件或目录。通过File对象,我们可以执行一系列操作,如检查文件或目录的存在(exists())、判断类型(isDirectory(), isFile())、创建目录(mkdir(), mkdirs())、获取...

    java零基础自学 之 JavaIO流处理

    Java IO流处理是Java编程中一个非常重要的概念,主要用于数据的输入和输出操作。对于Java初学者来说,理解和掌握IO流的基本使用至关重要。...理解并熟练掌握这些基础知识,对于提升Java开发能力至关重要。

    个人写的JavaIO工具

    在这个“个人写的JavaIO工具”中,我们可以看到作者创建了一个自定义的Io工具集,包含了对文件读写、数据流操作、以及代码统计和注释处理的功能。下面将详细讨论这些知识点。 1. **Java IO基础**: - Java IO API...

    JavaIO流详解归纳.pdf

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

    java io 结构图

    Java IO还包含了过滤流(Filter Stream)的概念,它们在原有流的基础上增加了额外的功能,如转换、压缩、加密等,比如 `InputStreamReader` 和 `OutputStreamWriter` 实际上就是过滤流,它们将字节流转换为字符流。...

    Java IO_NIO

    Java IO(Input/Output)是Java编程语言中用于处理输入输出操作的基础框架,它提供了丰富的类库,使得程序能够与各种设备、文件、网络进行数据交互。然而,传统的IO模型在处理大量并发连接时表现出效率较低的问题,...

    Java学习之IO总结及mina和netty

    **Java IO基础** Java IO库提供了一系列类和接口,用于处理数据的读写操作。这包括文件I/O、流I/O、对象序列化以及网络通信等。在Java中,I/O操作主要分为字节流和字符流,它们分别处理字节数据和字符数据。字节流...

    Java IO 使用例

    在“JavaIODemo”这个示例中,可能会包含以上提到的一些或全部Java IO操作的代码实例,通过这些实例,我们可以学习如何在实际项目中应用Java IO API。实践是掌握Java IO的最佳方式,通过对这些示例的分析和运行,...

Global site tag (gtag.js) - Google Analytics