字节输入输出流
1.FileInputStream[文件字节输入流]->读取文件内容
用途:从文件系统中的文件获得输入字节,常用于读取图像、声音等原始字节流,读取字符流可考虑使用FileReader
构造方法:
构造方法摘要 | |
---|---|
FileInputStream(File file) 通过打开一个到实际文件的连接来创建一个 FileInputStream ,该文件通过文件系统中的 File 对象file 指定。 | |
FileInputStream(FileDescriptor fdObj) 通过使用文件描述符 fdObj 创建一个 FileInputStream ,该文件描述符表示到文件系统中某个实际文件的现有连接。 | |
FileInputStream(String name) 通过打开一个到实际文件的连接来创建一个 FileInputStream ,该文件通过文件系统中的路径名 name 指定。 |
方法摘要 | |
---|---|
available() 返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取(或跳过)的估计剩余字节数。 | |
| close() 关闭此文件输入流并释放与此流有关的所有系统资源。 |
finalize() 确保在不再引用文件输入流时调用其 close 方法。 | |
| getChannel() 返回与此文件输入流有关的唯一 FileChannel 对象。 |
| getFD() 返回表示到文件系统中实际文件的连接的 FileDescriptor 对象,该文件系统正被此 FileInputStream 使用。 |
| read() 从此输入流中读取一个数据字节。 |
| read(byte[] b) 从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。 |
| read(byte[] b, int off, int len) 从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。 |
| skip(long n) 从输入流中跳过并丢弃 n 个字节的数据。 |
这里介绍一个最常见的方法:
read(byte[] b, int off, int len)
从此输入流中将最多 len
个字节的数据读入一个 byte 数组中。
->off:b字节数组中的偏移量
小知识:数组偏移量,比如a[1,2,3,4,5]数组,默认数组第一个应该指向a[0],若偏移量为2,则指向a[1]
案例:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
int b;
// 创建输入流
FileInputStream readfile = new FileInputStream("E:\\test.txt");
byte buffer[] = new byte[2500];// 创建字节数组
// 从输入流中读取字节并存入buffer数组中,最长读取2500个字节,返回值b为实际读取的长度
b = readfile.read(buffer, 1, 2000);// 1为buffer数组中的起始偏移量
String str = new String(buffer, 0, b, "Default");
System.out.println(str);
System.out.println(b);
readfile.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2014年8月18日22:14:01
2.FileOutputStream[文件字节输出流]->向文件写入信息
用途:可以向图像等原始字节文件中写入信息
构造函数:
FileOutputStream(File file) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流,覆盖原有数据 |
FileOutputStream(File file, boolean append) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流,append为true,保持原有数据,追加至末尾 |
FileOutputStream(FileDescriptor fdObj) 创建一个向指定文件描述符处写入数据的输出文件流,该文件描述符表示一个到文件系统中的某个实际文件的现有连接。 |
FileOutputStream(String name) 创建一个向具有指定名称的文件中写入数据的输出文件流。 |
FileOutputStream(String name, boolean append) 创建一个向具有指定 name 的文件中写入数据的输出文件流,,append为true,保持原有数据,追加至末尾 |
方法摘要 | |
---|---|
close() 关闭此文件输出流并释放与此流有关的所有系统资源。 | |
finalize() 清理到文件的连接,并确保在不再引用此文件输出流时调用此流的 close 方法。 | |
getChannel() 返回与此文件输出流有关的唯一 FileChannel 对象。 | |
getFD() 返回与此流有关的文件描述符。 | |
write(byte[] b) 将 b.length 个字节从指定 byte 数组写入此文件输出流中。 | |
write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。 | |
write(int b) 将指定字节写入此文件输出流。 |
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class Test {
public static void main(String[] args) {
try {
int b;
File file = new File("E:\\test.txt");
// 创建输入流
FileInputStream readfile = new FileInputStream(file);
byte buffer[] = new byte[2500];// 创建字节数组
// 从输入流中读取字节并存入buffer数组中,最长读取2500个字节,返回值b为实际读取的长度
b = readfile.read(buffer, 1, 2000);// 1为buffer数组中的起始偏移量
String str = new String(buffer, 0, b, "Default");
System.out.println(str);
readfile.close(); // 关闭流
// 创建一个输出流,true表示保留文件原有数据,新数据追加到结尾处
FileOutputStream writefile = new FileOutputStream(file, true);
writefile.write(buffer, 0, b);
writefile.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
字符输入输出流
1.FileReader[字符输入流]->以字符为单位读取文件内数据信息
2.FileWriter[字符输出流]->以字符为单位向输出流中写入信息
上述两个流操作,构造方法,常用函数均与字节流类似,只不过一个处理字节,一个处理字符,使用方法也很相近,主要是针对文本化的文件进行操作,而字节流主要处理图像,视频,声音等原始字节文件数据,直接贴一个代码吧!
import java.io.FileReader;
import java.io.FileWriter;
public class Test {
public static void main(String[] args) {
try {
// 字符输入流,读取文件信息
FileReader fileread = new FileReader("F:\\test.txt");
char[] cbuf = new char[500];
int b = fileread.read(cbuf, 0, 500);
System.out.println(String.valueOf(cbuf));
fileread.close();
// 字符输出流,想输出流中写入信息,并且保留原有数据,追加数据值末尾处
FileWriter filewriter = new FileWriter("F:\\test.txt", true);
filewriter.write(cbuf);
filewriter.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2014年8月21日23:31:09
这篇文章写到这,我突然感觉,我一直忽略了一个很重要的类:File
文件类File:
我们首先介绍一下文件,我想,文件这个名词,很抽象,但是缺非常容易理解,小弟不才没法用文字描述出来呢,在这里我介绍一下文件的简单分类吧:
文件的分类:根据我们程序对文件的访问方式不同,大致的可以分为一下三个类别:
1.顺序文件(Sequential File):这一类文件一行代表一条数据,按序排列的,每条数据或者记录的长度是不限制的,可长可段,访问文件内容必须追条进行访问。
2.随机文件(Random Access File):这种类型文件最大的特点就是每条数据或者记录的长度是固定一样的,可以任意次序的对文件中记录进行操作,同时,每一条记录都有一个唯一的记录号(ID)与之对应,也就是说,只要知道记录号就可以对其进行访问的。
3.二进制文件(Binary File):这个在我们电脑中最常见不过了,它是字节的集合,直接存取的是二进制码,对于二进制文件的访问时通过字节数来定位数据的,没有数据类型。
介绍了文件的分类,就切入正题吧,File类的一些基本信息:
在Java语言中,访问文件或者目录,我们都可以通过File类来访问,甚至可以访问一个压根不存在的东西,或者说什么都不是也行,我们创建了一个File的实例,也就是File对象之后,如果是一个目录,那么我们可以创建和删除目录,也可以显示这个目录下的文件清单,如果这个对象时文件对象话,这点需要注意,这里我们只可以访问存储的目录信息,文件基本属性,比如文件名和文件类型,修改文件名信息等,是不能够进行文件的复制,读取,也就是说我们是不能够对文件的内容进行操作的,这个就属于流操作了,下面简单介绍一下File的简单构造函数和常用的方法吧!作为一个初学者,这些东西,我都是在API里面看的,我也是E文盲,我只能看大牛们翻译的啦!
File类基础信息:
1.构造函数信息:
构造方法摘要 | |
---|---|
File(File parent,String child) 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。 | |
File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。----这个方法最常用了,我觉得 | |
File(String parent,String child) 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。 | |
File(URI uri) 通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File 实例。 |
字段摘要 | |
---|---|
pathSeparator 与系统有关的路径分隔符,为了方便,它被表示为一个字符串。 | |
pathSeparatorChar 与系统有关的路径分隔符。 | |
separator 与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。WIN下是"\",Linux下是“/”,这个最常用 | |
separatorChar 与系统有关的默认名称分隔符。 |
方法摘要 | |
---|---|
canExecute() 测试应用程序是否可以执行此抽象路径名表示的文件。 | |
| canRead() 测试应用程序是否可以读取此抽象路径名表示的文件。 |
canWrite() 测试应用程序是否可以修改此抽象路径名表示的文件。 | |
compareTo(File pathname) 按字母顺序比较两个抽象路径名。 | |
createNewFile() 当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。 | |
createTempFile(String prefix,String suffix) 在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。 | |
createTempFile(String prefix,String suffix, File directory) 在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。 | |
delete() 删除此抽象路径名表示的文件或目录。 | |
deleteOnExit() 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。 | |
equals(Object obj) 测试此抽象路径名与给定对象是否相等。 | |
exists() 测试此抽象路径名表示的文件或目录是否存在。 | |
getAbsoluteFile() 返回此抽象路径名的绝对路径名形式。 | |
getAbsolutePath() 返回此抽象路径名的绝对路径名字符串。 | |
getCanonicalFile() 返回此抽象路径名的规范形式。 | |
getCanonicalPath() 返回此抽象路径名的规范路径名字符串。 | |
getFreeSpace() 返回此抽象路径名指定的分区中未分配的字节数。 | |
getName() 返回由此抽象路径名表示的文件或目录的名称。 | |
getParent() 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null 。 | |
getParentFile() 返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null 。 | |
getPath() 将此抽象路径名转换为一个路径名字符串。 | |
getTotalSpace() 返回此抽象路径名指定的分区大小。 | |
getUsableSpace() 返回此抽象路径名指定的分区上可用于此虚拟机的字节数。 | |
hashCode() 计算此抽象路径名的哈希码。 | |
isAbsolute() 测试此抽象路径名是否为绝对路径名。 | |
isDirectory() 测试此抽象路径名表示的文件是否是一个目录。 | |
isFile() 测试此抽象路径名表示的文件是否是一个标准文件。 | |
isHidden() 测试此抽象路径名指定的文件是否是一个隐藏文件。 | |
lastModified() 返回此抽象路径名表示的文件最后一次被修改的时间。这个经常用到,比如我们通过定时修改文件信息,我写过一个关于定时生成Html的文章,这里用到了 | |
length() 返回由此抽象路径名表示的文件的长度。 | |
list() 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。 | |
list(FilenameFilter filter) 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。 | |
listFiles() 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。返回一个File数组 | |
listFiles(FileFilter filter) 返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。 | |
listFiles(FilenameFilter filter) 返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。 | |
listRoots() 列出可用的文件系统根。 | |
mkdir() 创建此抽象路径名指定的目录。 | |
mkdirs() 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。 | |
renameTo(File dest) 重新命名此抽象路径名表示的文件。 | |
setExecutable(boolean executable) 设置此抽象路径名所有者执行权限的一个便捷方法。 | |
setExecutable(boolean executable, boolean ownerOnly) 设置此抽象路径名的所有者或所有用户的执行权限。 | |
setLastModified(long time) 设置此抽象路径名指定的文件或目录的最后一次修改时间。 | |
setReadable(boolean readable) 设置此抽象路径名所有者读权限的一个便捷方法。 | |
setReadable(boolean readable, boolean ownerOnly) 设置此抽象路径名的所有者或所有用户的读权限。 | |
setReadOnly() 标记此抽象路径名指定的文件或目录,从而只能对其进行读操作。 | |
setWritable(boolean writable) 设置此抽象路径名所有者写权限的一个便捷方法。 | |
setWritable(boolean writable, boolean ownerOnly) 设置此抽象路径名的所有者或所有用户的写权限。 | |
toString() 返回此抽象路径名的路径名字符串。 | |
toURI() 构造一个表示此抽象路径名的 file: URI。 |
import java.io.File;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException {
// 实例化一个File对象,注意这个目录是不存在的,我们重新创建
File mydir = new File("F:\\mydir");
if (!mydir.exists()) {
mydir.mkdir(); // 创建这个目录
} // 那么我们访问以下目录名试试
System.out.println(mydir.getName());
System.out.println(mydir.getAbsolutePath());
System.out.println(mydir.separator);
// 我们给这个目录下创建一个文件吧
File myfile = new File("F:\\mydir\\file.txt");
if (!myfile.exists()) {
myfile.createNewFile();
}
// 我们通过目录来访问目录下的这个文件
File files[] = mydir.listFiles();
for (int i = 0; i < files.length; i++) {
System.out.println(files[i].getName());
System.out.println(files[i].lastModified());
}
}
}
其实这几天挺迷茫的,前几周实习感觉挺有方向的,这几天没有给我安排具体的任务,突然感觉很空洞,夜深的时候,思考自己,我想要什么,当思考明确了自己的目标的时候,迷茫这个词语在脑海中是不存在的,但是这种迷茫也随这你的生活变化,随时都可能再次出现,所以在这里,我给我自己一句话,再苦再累,自己选的路,当你不想走下去的时候,请回头看看已经老去的爸妈,然后跪着走完这条路!!!
加油,没有过不去砍,认真学,慢慢学,别着急速度,给自己一个理想化的学习态度和一份真诚踏实的心,一路走下去即可!呵呵
突然觉得这样的上述的流操作,只能进行单一的读文件或者向文件写入数据,很单一,单向的操作,不用担心,java强大的不可挑剔,RandomAccessFile就可以满足我的这个小小愿望:
RandomAccessFile[随机存取字节流]->可以任意的存和取数据,按照特定的数据类型进行写入或者读取操作,可以指定字节跳跃流所指向的文件指针位置
构造函数信息:
构造方法摘要 | |
---|---|
RandomAccessFile(File file, String mode) 创建从中读取和向其中写入(可选)的随机访问文件流,该文件由 File 参数指定。 | |
RandomAccessFile(String name, String mode) 创建从中读取和向其中写入(可选)的随机访问文件流,该文件具有指定名称。 上述mode取值可以是“r”只读,“w”只写或者“rw”读写 |
long getFilePointer()
返回此文件中的当前偏移量
long length()
返回此文件的长度,字节数
read()
从此文件中读取一个数据字节
read(byte[] b)
将最多 b.length
个数据字节从此文件读入 byte 数组
read(byte[] b, int off, int len)
将最多 len
个数据字节从此文件读入 byte 数组,off为数组偏移量
readChar()
从此文件读取一个字符,这是一个典型的,还有很多,比如readInt(),readBoolean()等等数据类型
seek(long pos)
设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作
skipBytes(int n)
尝试跳过输入的 n
个字节以丢弃跳过的字节
write(byte[] b)
将 b.length
个字节从指定 byte 数组写入到此文件,并从当前文件指针开始
write(byte[] b, int off, int len)
将 len
个字节从指定 byte 数组写入到此文件,并从偏移量 off
处开始
writeBoolean(boolean v)
按单字节值将 boolean
写入该文件,还可以有很多,比如writeInt()等等
写一个超级简单的例子吧:
import java.io.IOException;
import java.io.RandomAccessFile;
public class Test {
public static void main(String[] args) throws IOException {
// 创建一个RAF流,mode类型为“rw”,可写入可读取
RandomAccessFile raf = new RandomAccessFile("F:\\test.txt", "rw");
int num[] = { 1, 2, 3, 4, 5 };
for (int i = 0; i < num.length; i++) {
raf.writeInt(num[i]);// 写入int类型数据
}
raf.seek(0L);// 重新定位流所指向的文件指针位置
for (int i = 0; raf.getFilePointer() < raf.length(); i++) {
raf.seek(i * 4);// 这里的int占四个字节,定位值按照字节定位的
System.out.println(raf.readInt());
}
raf.close();
}
}
未完待续,还有很多常用的流操作,以后会一一补充,很晚了,该睡觉了,每天抽一点时间学习学习,慢慢积累,I can do it!!