字节输入和输出流
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:
我们首先介绍一下文件。我想,文件这个名词,非常抽象,可是缺非常easy理解。小弟不才没法用文字描写叙述出来呢。在这里我介绍一下文件的简单分类吧:
文件的分类:依据我们程序对文件的訪问方式不同,大致的能够分为一下三个类别:
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 实例。 |
2.经常使用字段介绍
字段摘要 | |
---|---|
pathSeparator 与系统有关的路径分隔符,为了方便,它被表示为一个字符串。 |
|
pathSeparatorChar 与系统有关的路径分隔符。 |
|
separator 与系统有关的默认名称分隔符。为了方便,它被表示为一个字符串。WIN下是"\",Linux下是“/”。这个最经常使用 |
|
separatorChar 与系统有关的默认名称分隔符。 |
3.经常用法
方法摘要 | |
---|---|
canExecute() 測试应用程序能否够运行此抽象路径名表示的文件。 |
|
|
canRead() 測试应用程序能否够读取此抽象路径名表示的文件。 |
canWrite() 測试应用程序能否够改动此抽象路径名表示的文件。 |
|
compareTo(File pathname) 按字母顺序比較两个抽象路径名。 |
|
createNewFile() 当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。 |
|
createTempFile(String prefix,String suffix) 在默认暂时文件文件夹中创建一个空文件。使用给定前缀和后缀生成其名称。 |
|
createTempFile(String prefix,String suffix, 在指定文件夹中创建一个新的空文件。使用给定的前缀和后缀字符串生成其名称。 |
|
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, 创建从中读取和向当中写入(可选)的随机訪问文件流,该文件由 File 參数指定。
|
|
RandomAccessFile(String name, 创建从中读取和向当中写入(可选)的随机訪问文件流。该文件具有指定名称。 上述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!!
版权声明:本文博客原创文章,博客,未经同意,不得转载。