Java语言基础--IO(1)

本文介绍了Java中IO流的概念及使用,包括字节流与字符流的区别和操作方法。同时,详细阐述了如何利用File类进行文件和目录的基本操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


======================================================
注:本文源代码点此下载
======================================================

1.流

java.io包有两个主要部分:字符流和字节流。字符是指16位的utf-16字符,而字节通常是8位的。字符流主要用于基于文本的i/o,而字节流主要用于基于二进制数据的i/o。字节流被称为输入流(input stream)与输出流(output stream),而字符流被称为读取器(reader)与写入器(writer)。

inputstream类是java.io包中大多数字节输入流的超类。主要方法有:

public abstract int read()throw ioexception:从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。

public int read(byte[] buf, int offset, int count)throws ioexception:将输入流中最多count个数据字节读入byte 数组。尝试读取count个字节,但读取的字节也可能小于该值。以整数形式返回实际读取的字节数。在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。如果count为0,则不读取任何字节并返回 0;否则,尝试读取至少一个字节。如果因为流位于文件末尾而没有可用的字节,则返回值 -1;否则,至少读取一个字节并将其存储在buf中。将读取的第一个字节存储在元素buf[offset]中,下一个存储在buf[offset+1]中,依次类推。读取的字节数最多等于count。设k为实际读取的字节数;这些字节将存储在buf[offset]到buf[offset+k-1]的元素中,不影响buf[offset+k]到buf[offset+count-1]的元素。

public int read(byte[] buf)throws ioexception:等价于read(buf, 0, buf.length)。

public void close()throws ioexception:关闭输入流。

outputstream类是表示输出字节流的所有类的超类。主要方法有:

public abstract void write(int b)throws ioexception:将指定的字节写入此输出流。要写入的字节是参数b的低8位,高24位将被忽略。

public void write(byte[] buf, int offset, int count)throws ioexception:将指定byte数组中从偏移量offset开始的count个字节写入此输出流。

public void write(byte[] buf)throws ioexception:等价于write(byte[] buf, 0, buf.length)。

public void flush()throws ioexception:刷新此输出流并强制写出所有缓冲的输出字节。

public void close()throws ioexception:关闭输出流。

用于读取或者写入字符流的抽象类是reader和writer。reader类的主要方法:

public int read()throws ioexception:读取单个字符。在字符可用、发生i/o 错误或者已到达流的末尾前,此方法一直阻塞。

public abstract int read(char[] buf, int offset, int count)throws ioexception:将字符读入为char数组的一部分。在某个输入可用、发生 i/o 错误或者到达流的末尾前,此方法一直阻塞。

public int read(char[] buf)throws ioexception:等价于read(char[] buf, 0, buf.length)。

public abstract void close()throws ioexception:关闭输入流。

writer类的主要方法:

public void write(int ch)throws ioexception:写入单个字符。要写入的字符包含在给定整数值的低16位中,高16位被忽略。

public abstract void write(char[] buf, int offset, int count)throws ioexception:写入字符数组的某一部分。

public void write(char[] buf)throws ioexception:等价于write(buf, 0, buf.length)。

public void write(string str, int offset, int count)throws ioexception:写入字符串的某一部分。

public void write(string str)throws ioexception:等价于write(str, 0, str.length())。

public abstract void flush()throws ioexception:刷新流。

public abstract void close()throws ioexception:关闭流。

inputstreamreader与outstreamwrite是字符流与字节流转化的桥梁。inputstreamreader使用指定的字符集读取字节并将其解码为字符。每次调用 inputstreamreader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。outputstreamwrite使用指定的字符集将要写入流中的字符编码成字节。

2.文件操作

file类是文件和目录的路径名的抽象表示形式。

import java.io.file;

import java.util.date;

/**

* 获取文件的基本信息

*/

public class getfileinfos {

public static void println(string s){

system.out.println(s);

}

public static void main(string[] args) {

//用文件路径新建一个文件对象。路径可以是绝对路径也可以是相对路径

//传入的参数被当作为文件的抽象路径

file file = new file("c:/temp/newtemp.txt");

//获取文件的名字,不包括路径

println("文件名:\t" + file.getname());

//将抽象路径名中的文件分隔符用系统默认分隔符替换

println("文件路径:\t" + file.getpath());

//获取文件的绝对路径

println("绝对路径:\t" + file.getabsolutepath());

//获取抽象路径名的父抽象路径

println("父目录:\t" + file.getparent());

println("文件是否存在:\t" + file.exists());

println("是否可读:\t" + file.canread());

println("是否可写:\t" + file.canwrite());

println("是否是隐藏文件:\t" + file.ishidden());

println("是否是普通文件:\t" + file.isfile());

println("是否是文件目录:\t" + file.isdirectory());

println("文件路径是否是绝对路径:\t" + file.isabsolute());

println("文件路径的uri:\t" + file.touri());

println("文件最后修改时间:\t" + new date(file.lastmodified()));

println("文件大小:\t" + file.length() + " bytes");

}

}

file类的list方法返回该目录下所有文件的文件名(不包含路径信息)。listfiles方法返回该目录下所有文件的file对象。filenamefilter是文件名过滤器接口类,自定义的文件名过滤器必须实现该接口的accept方法。

import java.io.file;

import java.io.filenamefilter;

public class listfileutil {

/**

* 这是一个内部类,实现了filenamefilter接口,用于过滤文件

*/

static class myfilenamefilter implements filenamefilter{

//文件名后缀

private string suffix = "";

public myfilenamefilter(string surfix){

this.suffix = surfix;

}

public boolean accept(file dir, string name) {

//如果文件名以surfix指定的后缀相同,便返回true,否则返回false

if (new file(dir, name).isfile()){

return name.endswith(suffix);

}else{

//如果是文件夹,则直接返回true

return true;

}

}

}

/**

* 列出目录下所有文件包括子目录的文件路径

* @param dirname文件夹的文件路径

*/

public static void listallfiles(string dirname){

//如果dir不以文件分隔符结尾,自动添加文件分隔符。

if (!dirname.endswith(file.separator)){

dirname = dirname + file.separator;

}

file dirfile = new file(dirname);

//如果dir对应的文件不存在,或者不是一个文件夹,则退出

if (!dirfile.exists() || (!dirfile.isdirectory())){

system.out.println("list失败!找不到目录:" + dirname);

return;

}

//列出源文件夹下所有文件(包括子目录)

file[] files = dirfile.listfiles();

for (int i = 0; i if (files[i].isfile()){

system.out.println(files[i].getabsolutepath() + " 是文件!");

}else if (files[i].isdirectory()){

system.out.println(files[i].getabsolutepath() + " 是目录!");

listfileutil.listallfiles(files[i].getabsolutepath());

}

}

}

/**

* 列出目录中通过文件名过滤器过滤后的文件。

* @param filter文件名过滤器对象

* @param dirname目录名

*/

public static void listfilesbyfilenamefilter(filenamefilter filter, string dirname){

//如果dir不以文件分隔符结尾,自动添加文件分隔符。

if (!dirname.endswith(file.separator)){

dirname = dirname + file.separator;

}

file dirfile = new file(dirname);

//如果dir对应的文件不存在,或者不是一个文件夹,则退出

if (!dirfile.exists() || (!dirfile.isdirectory())){

system.out.println("list失败!找不到目录:" + dirname);

return;

}

//列出源文件夹下所有文件(包括子目录)

file[] files = dirfile.listfiles(filter);

for (int i = 0; i if (files[i].isfile()){

system.out.println(files[i].getabsolutepath() + " 是文件!");

}else if (files[i].isdirectory()){

system.out.println(files[i].getabsolutepath() + " 是目录!");

listfileutil.listfilesbyfilenamefilter(filter, files[i].getabsolutepath());

}

}

}

public static void main(string[] args) {

string dir = "c:/temp";

system.out.println((dir + "目录下的内容: "));

listfileutil.listallfiles(dir);

system.out.println();

system.out.println("经过过滤器过滤后的内容:");

//新建一个文件名过滤器。参数为".txt"

filenamefilter myfilenamefilter = new listfileutil.myfilenamefilter(".txt");

listfileutil.listfilesbyfilenamefilter(myfilenamefilter, dir);

}

}


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值