Java IO流 学习笔记

时间:2023-02-24 19:03:16

Java IO流学习笔记

首先我们先看看整个IO流的体系图

Java IO流 学习笔记

由图中我们可以看出,Java的IO主要分为字节流和字符流两部分。每一部分都有相应的读和写操作,再往下就是各种操作的细分,比如BufferReader,InputerStreamReader之类,就是缓存读取,和字节流通向字符流的读取方式。

一、文件

1. 先来看下简单的文件创建:

/**
* Created by Administrator on 2016/2/28.
*/

public class CreateFile {
public static void main(String[] args){
File file = new File("E:"+ File.separator+"newFile.txt");
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
}
  • 首先创建一个文件对象,填写路径(这里输入的是绝对路径,如果输入相对路径“newFile.txt”则会在项目目录下面生成文件
  • 创建完对象之后可以使用File类中的createNewFile()方法创建对象,该操作会可能会抛出IO异常(主要原因为路径填写出问题)
  • 当该路径已经有文件的时候,再调用该方法,不会覆盖源文件
  • 文件路径中使用了File对象中的常量,表示 “ \ ”,在windows系统下我们使用\进行分隔操作,但是在Linux系统下就不是如此,所以使用File类中的常量可以增强代码的强壮性。

2.创建目录:

/**
* Created by Administrator on 2016/2/28.
*/

public class CreateFile {
public static void main(String[] args){
File file = new File("E:/newFile.txt");
file.mkdir(); //创建一个文件夹
}
}
  • 目录创建的方法和创建文件的方法类似,不同的是使用了File类中的mkdir()方法
  • mkdir()这个方法和我们在windows,linux系统下创建目录的方法相同,这个比较容易理解

3.显示目录下面所有的文件:

/**
* Created by Administrator on 2016/2/28.
*/

public class listFile {
@Test
public void showAllFiles(){
String mkdirName = "E:"+ File.separator;
File file = new File(mkdirName);
String[] str = file.list();
// File[] fileArray=file.listFiles();
for(String names :str){
System.out.println(names);
}
}
}
  • 代码中直接调用了File类中的list方法,返回一个字符串数组,其中包含了所有的文件名(目录与文件)
  • 当调用File类中的listFiles()方法时,返回的则是一个文件数组,这个操作需要先判断文件是否为目录
  • 判断文件是否为目录,可以使用isDirectory()方法进行判断。

二、字符流

1.FileReader
首先我们来看下最简单的,从文件中读取出文本信息

package com.joker.FileReader;

import org.junit.Test;

import java.io.*;

/**
* Created by jaycekon on 2016/3/10.
*/

public class ReadFile {
@Test
public void readFile(){
File file = new File("E:"+ File.separator+"hello.txt");
char[] buffer=new char[512];
int num = 0;
FileReader reader =null;
try {

reader = new FileReader(file);
reader.read(buffer);
System.out.println(buffer);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

输出结果:

hello
world!
  • 首先我们找到文件,然后创建FileReader对象,在构造函数里面提供了三种构造方法分别是String,File和FileDescriptor三种不同参数构成个构造函数。
  • 然后我们需要用到一个字符数组来装载我们从文件中读取到的内容,reader.read(buffer);
  • 在read方法里面,有个常用的无参方法和带字符数组的方法
  • 在调用read方法的时候,文件读取是一个一个字符的读取,并且在读取完所有字符后,才会结束
  • 这种方法适用于文件内容较少的情况

    2.FileWriter

package com.Joker.Char;

import org.junit.Test;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

/**
* Created by Administrator on 2016/3/11.
*/

public class Write {
@Test
public void TestOutWriter(){
try {
FileWriter writer =new FileWriter("hello.txt");
writer.write("写入文件!\n");
char[] cs = {'a','b','c'};
writer.write(cs);
writer.write("覆盖原文!");
writer.close();
FileReader reader = new FileReader("hello.txt");
char[] ch = new char[100];
reader.read(ch);
System.out.println(ch);
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

运行结果:

写入文件!
覆盖原文!
  • 这里需要注意的是,在输出流没有关闭时,不会调用写入操作,只有当输出流关闭,才会将缓存中的内容写入文件中。
  • 这里调用的写入方法,会覆盖原文件中的内容
  • FileWriter提供了4种写入方式,包括char[]和String类型的方式,还有指定长度的写入方式

3.StringReader

package com.Joker.Char;

import org.junit.Test;

import java.io.IOException;
import java.io.StringReader;

/**
* Created by Administrator on 2016/3/11.
*/

public class StringRead {
@Test
public void TestString(){
StringReader reader = new StringReader("hello");
char[] ch = new char[100];
try {
reader.read(ch);
System.out.println(ch[1]);
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
  • 这里的用法主要是用来读取字符串,看了一下他的构建方法,只有读取字符串这种方式,所以现在理解的用法是将字符串读取出来,再进行处理

4.PrintWriter

package com.Joker.Char;

import org.junit.Test;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;

/**
* Created by Administrator on 2016/3/11.
*/

public class printWrite {
@Test
public void testPrint(){
try {
Writer write= new PrintWriter(System.out);
write.write("hello world!");
write.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

输出结果:


Process finished with exit code 0
hello world!
  • 从输出结果来看,程序是先结束了再输出内容的。如果我们没有关闭输出流,则没有输出。
  • PrintWriter的用法可以用来输出内容到命令行,类似system.out.print的功能,不过要注意的是输出的时间不是即时的,而是程序结束阶段才会输出。

5.BufferedReader

package com.Joker.Char;

import org.junit.Test;

import java.io.*;

/**
* Created by Administrator on 2016/3/11.
*/

public class BufferRead {
@Test
public void TestBufferRead(){
File file = new File("hello.txt");
try {
BufferedReader reader = new BufferedReader(new FileReader(file));
String str;
while((str=reader.readLine())!=null){
System.out.println(str);
}
reader.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

输出结果:

hello world!==============>1
hello world!==============>2
hello world!==============>3
hello world!==============>4
hello world!==============>5
hello world!==============>6
hello world!==============>7

Process finished with exit code 0
  • 首先我们看一下BufferedReader的构造函数,BufferedReader提供了一个带Reader参数的构造方法,我们需要填入一个Reader类型的对象才能创建BufferedReader对象。
  • 常见的Reader对象有InputStreamReader和FileReader,我们这里用FileReader来演示
  • 再创建出一个BufferedReader之后,我们可以逐行读取文本内容。这种方法对我们大区大文件的时候有很大的帮助,因为在读取的时候不用把所有的内容都放入内存,先放在缓存中,当读到该行的时候在放入内存中,这样可以提高效率并且节省资源。

6.BufferWriter

package com.Joker.Char;

import org.junit.Test;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

/**
* Created by Administrator on 2016/3/11.
*/

public class BufferedWrite {
@Test
public void testBufferWrite(){
try {
BufferedWriter writer = new BufferedWriter(new FileWriter("hello.txt"));
for(int i=0;i<10;i++){
writer.write("hello world! ++++++++"+i+"\n");
}
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

运行结果:

hello world! ++++++++0
hello world! ++++++++1
hello world! ++++++++2
hello world! ++++++++3
hello world! ++++++++4
hello world! ++++++++5
hello world! ++++++++6
hello world! ++++++++7
hello world! ++++++++8
hello world! ++++++++9
  • BufferedWriter的构造方法和上面的类似,需要写入一个Writer对象,这里面主要起到的作用是做一个缓冲的作用,避免一下子写入大量的文件
  • 最后需要注意的时候,不管使用哪种写入方法,都会覆盖原文件中的内容

三、字节流

package com.Joker.chars;

import org.junit.Test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
* Created by Administrator on 2016/3/11.
*/

public class FileInputStreams {
@Test
public void testFileInputStreams(){
File file = new File("hello.txt");
try {
FileInputStream inputStream = new FileInputStream(file);
byte[] by = new byte[100];
inputStream.read(by);
String str = new String(by);
System.out.println(str);
for(byte b:by){
System.out.print(b+" ");
}
inputStream.close();

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

运行结果:

hello world!

104 101 108 108 111 32 119 111 114 108 100 33
  • 这里面读取到文件的内容是字节类型,如果我们想要获得字符内容的话需要自己手动进行转换

2.FileOutPutSream

package com.Joker.chars;

import org.junit.Test;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
* Created by Administrator on 2016/3/11.
*/

public class FileOutSreams {
@Test
public void testFileOutSreams(){
File file = new File("hello.txt");
try {
FileOutputStream fileOutputStream = new FileOutputStream(file);
String str ="Hello Wrold!";
byte[] bytes =str.getBytes();
fileOutputStream.write(bytes);
fileOutputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

输出结果:

Hello Wrold!
  • 这里面输出的参数是字节数组,主要用来便于直接输出字节流
  • 我们可以看到写入文件之后字节流变成的字符,所以最后存入文件中的是相应的字符

参考文章:

http://blog.csdn.net/yczz/article/details/38761237
http://www.importnew.com/