Java IO,
Java IO,
一、简介
在进行java学习过程中发现Java IO是一个很复杂又很便于使用的模块,其复杂性是由于为了便于IO操作,Java的作者对于IO模块进行了不断的扩充,扩充了许多类来与不同的对象进行通信,比如文件、控制台、网络链接等(这我觉得对于java初学者来讲可能是一看一脸懵逼的原因)。本文旨在介绍java标准库中各种各样的类以及它们的用法。
二、java IO的类型
从读写分类来看,java IO分类如下:
- java输入:InputStream和Reader;
- java输出:OutputStream和Writer。
从其处理流的类型上来看,可以分为字节流和字符流:
1.字节流:InputStream和OutputStream;
2.字符流:Reader和Writer。
三、java IO的类
我们通过下边张图片来看一下Java IO所包含的各种类。
主要提供对以下类型的IO的支持:
- 文件访问
- 内存访问
- 网络访问
- 线程内部通信
- 管道
- 过滤
- 解析
- 读写文本
- 读写数据
- 读写基本对象
四、Java IO的用法
4.1.1 File
File类从名字上看具有一定的误导性,其实它并不仅仅代表一个特定的文件名称,也指一个文件集。把File类放在这里讲的主要原因是后边的各种IO会用到,因此需要对File类有一定的了解。下面来看如何通过File查看某个文件夹下的文件。
示例一:File读取文件下的文件列表
import java.util.*;
import java.util.regex.*;
import java.io.*;
public class DirList {
public static void main(String[] args) {
// TODO Auto-generated method stub
File path = new File("/Users/zhuyinghao/Desktop/shell学习笔记");
String[] list;
if(args.length != 0)
{
list = path.list();
for(String dir: list)
System.out.println(dir);
}
else
{
list = path.list(new FilenameFilter()
{
Pattern pattern = Pattern.compile("java");
@Override
public boolean accept(File dir, String name) {
// TODO Auto-generated method stub
return pattern.matcher(name).find();
}
});
Arrays.sort(list, String.CASE_INSENSITIVE_ORDER);
for(String dir: list)
System.out.println(dir);
}
}
}
上面的代码实现了一个FilenameFilter接口,该接口的内容很简单, 如下。 accept()方法提供给list()方法进行回调, 回调有兴趣的朋友请自行查阅,这里不进行详述。accept()方法接受两个参数:文件名和正则表达式,通过文件名与正则表达式是否匹配来筛选合法文件名。
public interface FilenameFilter
{
boolean accept(File dir, String regex);
}
4.1.2 文本文件读写
如果要打开一个文件进行字符输入,可以使用String或者File对象的FileInputReader。为了提高速度我们希望对文件进行缓冲那么我们需要将产生的饮用传递给一个BufferedReader构造器。下面我们利用Printer实现一个文本文件的读写工具。
[示例:文本文件的读写]
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.TreeSet;
public class MyTxtFile extends ArrayList<String>
{
/**
*
*/
private static final long serialVersionUID = 1L;
public static String read(String filename)
{
String s;
StringBuilder sb = new StringBuilder();
try
{
BufferedReader in = new BufferedReader(new FileReader(new File(filename).getAbsoluteFile()));
try
{
while((s = in.readLine()) != null)
sb.append(s + "\n");
}finally
{
in.close();
}
}
catch(IOException e)
{
throw new RuntimeException();
}
return sb.toString();
}
//write a single file in one method call;
public static void write(String filename, String text)
{
try
{
PrintWriter out = new PrintWriter(new File(filename).getAbsoluteFile());
try
{
out.print(text);
} finally
{
out.close();
}
}
catch(IOException e)
{
throw new RuntimeException();
}
}
// read a file, split by any splitter expression
public MyTxtFile(String filename, String spilter)
{
super(Arrays.asList(read(filename).split(spilter)));
if(get(0).equals("")) remove(0);
}
public MyTxtFile(String filename)
{
this(filename, "\n");
}
public void write(String filename)
{
try
{
PrintWriter out = new PrintWriter(new File(filename).getAbsoluteFile());
try
{
for(String item : this)
out.println(item);
}
finally
{
out.close();
}
}
catch(IOException e)
{
throw new RuntimeException();
}
}
public static void main(String[] args) throws IOException
{
String text = read("/Users/zhuyinghao/Desktop/shell学习笔记/copy.txt");
System.out.print(text);
write("/Users/zhuyinghao/Desktop/shell学习笔记/test.txt", text);
MyTxtFile mtf = new MyTxtFile("/Users/zhuyinghao/Desktop/shell学习笔记/test.txt");
mtf.write("/Users/zhuyinghao/Desktop/shell学习笔记/test2.txt");
TreeSet<String> words = new TreeSet<String>(new MyTxtFile("/Users/zhuyinghao/Desktop/shell学习笔记/copy.txt", "\\W+"));
System.out.println(words);
}
}
4.2 java标准IO
4.2.1 从标准输入中读取
java提供了基于标准IO模型的System.in、System.out和System.err,其中System.out和System.err已经被封装为OutputStream对象, 但是System.in却是一个未经包装过的InputStream,所以如果需要使用标准输入时需要进行封装。封装方面见下面示例代码。
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.TreeSet;
public class MyTxtFile
{
public static void main(String[] args) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s;
while((s = br.readLine()) != null && s.length() != 0)
System.out.println(s);
}
}
4.2.2将System.out转换为PrintWriter
System.out是一个PrintStream,PrintStream是一个OutputStream。PrintWriter又一个可以接受OutputStream参数的构造器。
PrintWriter out = new PrintWriter(System.out, true);
其中为了开启自动清空功能,需要使用带有两个参数的构造器,并且把第二个参数设置为true。
4.2.3 IO重定向
java提供了以下几个简单的静态方法供我们对IO进行重定向。
setIn(InputStream)
setOut(PrintStream)
setErr(PrintStream)
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.TreeSet;
public class MyTxtFile
{
public static void main(String[] args) throws IOException
{
PrintStream console = System.out;
BufferedInputStream in = new BufferedInputStream(new FileInputStream("/Users/zhuyinghao/Desktop/shell学习笔记/copy.txt"));
PrintStream out = new PrintStream(new FileOutputStream("/Users/zhuyinghao/Desktop/shell学习笔记/MyTxtFile.txt"));
System.setIn(in);
System.setOut(out);
System.setErr(out);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s;
while((s = br.readLine()) != null)
System.out.println(s);
System.setOut(console);
System.out.print("hello java");
}
}
相关文章
- 暂无相关文章
用户点评