流的本质就是数据传输
流的读取方式可以分为两种:字节流和字符流
字节流的读取接口为inputstream和outputstream 实现类常用的为fileinputstream和fileoutputstream
字符流的读取接口为reader和writer实现类常用的为filereader和filewriter
对输入流只能进行读操作,对输出流只能进行写操作,程序中需要根据待传输数据的不同特性而使用不同的流
字节流和字符流也可以相互进行转换之间桥梁是inputstreamreader和outstreamwriter
字节流和字符流的区别:
字节流在操作时本身不会用到缓冲区,是文件本身直接操作的,字符流,通过缓冲区再操作文件,字节流可以用于任何类型的对象,包括二进制对象而字符流只能处理字符或者字符串 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理unicode字符 而字符流可以
下面看一下例子吧
/*
* 编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,
* a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔.
*/
/*
* 读取文件中的内容 按照规定格式拆分
*/
public static String[] read(String pathname, String regex) throws Exception {
// 根据一个路径找到文件
File f = new File(pathname);
// 读取文件内容到内存
FileReader reader = new FileReader(f);
// 建立一个字节数组
char[] buf = new char[(int) f.length()];
// 把文件内容放在数组字节数组中
reader.read(buf);
// 文件内容转换成字符串
String results = new String(buf);
reader.close();
// 拆分并返回符合需求的字符串数组
return results.split(regex);
}
/*
* 得到一个交叉数组 写入到另一个文件中
*/
public static void writers(FileWriter c, String[] words) throws Exception {
for (int i = 0; i < words.length; i++) {
// 获取输出流 输出内容到指定文件中
c.write(words[i] + " ");
}
}
public static void main(String[] args) throws Exception {
// 读取 a和b文件
String[] aword = MainClass.read("D:/a.txt", " ");
String[] bword = MainClass.read("D:/b.txt", " ");
// 实例一个ab的组合数组
String[] ab = new String[aword.length + bword.length];
// 循环遍历输出a和b中的内容 循环最大的那个数组长度
int count = (aword.length > bword.length ? aword.length : bword.length);
// 组合数组
int j = 0;
for (int i = 0; i < count; i++) {
// 如果数组索引比i大就说明还有数据
if (aword.length > i) {
ab[j] = aword[i] + "\r\n"; // 加回车
j++;
}
// 如果数组索引比i大就说明还有数据
/*
* windows下的文本文件换行符:\r\n
* linux/unix下的文本文件换行符:\r
* Mac下的文本文件换行符:\n
*/
if (bword.length > i) {
ab[j] = bword[i] + " "; // 加空格或回车
j++;
}
}
FileWriter c = new FileWriter("D:/c.txt");
MainClass.writers(c, ab);
c.close();
}</pre>第二个:</p><p><pre name="code" class="java">/**
* 编写一个程序,将 d:\java目录下的所有.java 文件复制到d:\jad目录下,并将原来文件的扩展名从.java 改为.jad。
*
* listFiles方法接受一个 FileFilter对象, 这个 FileFilter 对象就是过虑的策略对象, 不同的人提供不同的
* FileFilter 实现,即提供了不同的过滤策略。
*
* @throws Exception
*/
public static void main(String[] args) throws Exception {
/*
* 得到某个目录下的所有的.java文件
*/
// 1.找到这个目录
File srcDir = new File("D:/java");
/*
* 判断目录是否存在file_exists() 函数检查文件或目录是否存在。 如果指定的文件或目录存在则返回 true,否则返回 false。
* isDirectory() 检查表示此抽象路径名的文件是否是一个目录
*/
if (!(srcDir.exists() && srcDir.isDirectory())) {
throw new Exception("目录不存在");
} else {
/*
* 2 File.listFiles() 返回抽象路径名的定义中表示此抽象路径名的目录中的文件的数组 3
* FilenameFilter过滤得到指定类型的文件或者目录 必须重写accept(File file,String path)方法
*/
File[] files = srcDir.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(".java");
}
});
/*
* 将文件写入jad目录中
*/
File desDir = new File("D:/jad");
if (!desDir.exists()) {
/*
* mkdir() 只能在已经存在的目录中创建创建文件夹。
* mkdirs()可以在不存在的目录中创建文件夹。诸如:a\\b,既可以创建多级目录。D:/a/b/c
*/
desDir.mkdir();
}
/*
* filereader fileinputstream FileInputStream :以字节流方式读取 byte数组;
* FileReader :把文件转换为字符流读入 char数组 FileInputStream 类以二进制输入 / 输出, I/O
* 速度快且效率搞,但是它的 read ()方法读到的是一个字节,很不利于人们阅读 FileReader 类弥补了这个缺陷
* 如果处理纯文本文件,建议使用 FileReader
* 因为更方便,也更适合阅读;但是要注意编码问题!其他情况(处理非纯文本文件),FileInputStream是唯一的选择
*/
// 根据源文件名得到目标文件名,并且改名
for (File f : files) {
FileInputStream fis=new FileInputStream(f);
//replace和replaceAll都是查找出所有匹配字符并替换之,最大的不同:replaceAll的参数是正则表达式,而replace是普通字符
//$是匹配输入的结束 结束是否符合条件
String destFileName=f.getName().replaceAll("\\.java$", ".jad");
//desDir 是所在上一级路径 destFileName是文件名
FileOutputStream fos=new FileOutputStream(new File(desDir,destFileName));
//复制内容
copy(fis, fos);
fis.close();
fos.close();
}
}
}
private static void copy(InputStream ips,OutputStream ops) throws IOException{
//读取内容放入字节数组中
int len=0;
byte[] buf=new byte[1024];
/*
* int read()读取一个字节,返回值为所读的字节
* int read( byte b[ ] ); //读取多个字节,
* 放置到字节数组b中,通常读取的字节数量为b的长度,返回值为实际读取的字节的数量
*
*/
while((len=ips.read(buf))!=-1){
//buf 输出字节数组 结束
//write( byte b[ ], int off, int len ); //把字节数组b中从下标off开始,长度为len的字节写入流中
ops.write(buf, 0, len);
}
}
本文探讨了I/O流的核心概念,重点介绍了字节流和字符流的读取方式,如inputstream、outputstream、reader、writer及其常用实现类。强调字节流与字符流的区别,包括是否使用缓冲区以及处理对象类型,并指出两者间的转换方法。通过实例说明了如何在实际操作中选择合适的流类型。
910

被折叠的 条评论
为什么被折叠?



