黑马程序员技术交流社区
标题:
java输入流
[打印本页]
作者:
stormdzh
时间:
2013-8-5 16:12
标题:
java输入流
java.io包 java.io包中的类使得读写文件和处理数据流非常容易.
字节流 要读写字节,程序应使用字节流,即java.io包中InputStream类和OutputStream类的派生类.
InputStream类和OutputStream类分别为输入流(读取字节的流)和输出流(写入字节的流)提供API和部分实现.
字符流 java.io中字符流的抽象父类是Reader和Writer,读取和写入的类.
输入流 输入流在创建时会自动打开,而用close()方法显式关闭.如图2.2所示的输入流的类的关系:
InputStream 最常见的方法:
1. int read() 它从输入流读取下一个字节.字节是作为0至255之间的一个int返回的,如果已经达到流的结尾,则返回-1.
2. long skip(long) 它会跳过和丢弃此输入流的指定数目的字节.返回实际跳过的字节数.
如果为负数则没有跳过任何字节.
FileInputStream 三种构造函数:
1.将文件名视为字符串: FileInputStream f=new FileInputStream("C:/temp.txt");
2.将File对象视为其参数: FileInputStream f=new FileInputStream(new File("C:/temp.txt"));
3.将FileDescriptor对象视为其参数 FileInputStream f=new FileInputStream(new FileDescriptor());
ByteArrayInputStream 将字节数组用作源,并在该数组中执行读操作.(两种构造函数)
1.将字节数组用作参数: ByteArrayInputStream b=new ByteArrayInputStream(buf[]);
2.从指定的字节数组来创建: ByteArrayInputStream b=new ByteArrayInputStream(buf[],off,len);
其中 off是要读取的第一个字节的偏移,len是要读入数组的字节数
StringBufferInputStream 与ByteArrayInputStream很相似,不同的是内部缓冲器中的是字符串数组而不是字节数组.
输出流 OutputStream类是抽象类,提供输出流的最小编程接口和部分实现.OutputStream的体系如下:
OutputStream 最常见的方法:
1. void write(int) 将指定字节写入输出流,被写入的字节参数的八个低位比特,高位比特被忽略.
2. void close() 关闭此输出流并释放与这个流相关联的资源.
3. void flush() 刷新此输出流,强制写出任何缓冲输出字节.
FileOutputStream 此类创建文件(如果文件不存在),并将数据写入文件. (四种构造函数)
1. 将文件名作为字符串: FileOutputStream f=new FileOutputStream("C:/temp.txt");
2. 将File对象作为其参数: FileOutputStream f=new FileOutputStream(new File("C:/temp.txt"));
3. 将FileDescriptor对象作为参数 FileOutputStream f=new FileOutputStream(new FileDescriptor());
4. 将文件名为第一参数,将布尔值作为第二参数.
作者:
What/
时间:
2013-8-8 15:55
有没有详细的代码说明呢?
作者:
赵国刚
时间:
2013-8-9 18:45
*/
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
public class FileDemo {
public static void main(String[] args) throws IOException {
//将a。txt封装成file对象。可以将已有的和为出现的文件或者文件夹封装成对象
File f=new File("a.txt");
File f2=new File("C:\\ABC","a.txt");
File d=new File("C:\\ABC");
File f3=new File(d,"c.txt");
//在File类中封装的是什么酒打印什么。
System.out.println(f);
System.out.println(f2);
System.out.println(f3);
//目录分隔符
method_1();//创建文件
}
//创建文件
public static void method_1() throws IOException{
File file=new File("file.txt");
System.out.println("create:"+file.createNewFile());
}
//删除文件
public static void method_2(){
File file=new File("file.txt");
System.out.println("delete:"+file.delete());
file.deleteOnExit();
}
//文件是否可执行。文件是否存在
public static void method_3() {
File file=new File("file.txt");
System.out.println("execute:"+file.canExecute());
System.out.println("execute:"+file.exists());
}
//创建文件夹
public static void method_4(){
File dir=new File("aa\\dd\\cc");
System.out.println("mkdir:"+dir.mkdir());
System.out.println("mkdir:"+dir.mkdirs());
}
//判断是文件还是文件夹
public static void method_5(){
File file=new File("file.txt");
//记住:在判断文件对象是否是文件或是目录是,必须先判断该文件对象封装的内容是否存在
//通过 exists判断
System.out.println("create:"+file.isDirectory());
System.out.println("create:"+file.isFile());
}
//获取文件路径,重命名
public static void method_6() {
File file=new File("file.txt");
System.out.println("path:"+file.getPath());
System.out.println("path:"+file.getParent());
System.out.println("path:"+file.getAbsolutePath());
File file2=new File("D:\\file2.txt");
System.out.println("path:"+file.renameTo(file2));
}
//获取有效盘符
public static void method_7() {
File[] files=File.listRoots();
for(File f : files){
System.out.println(f);
}}
//获取指定路径下的文件及文件名,包含隐藏文件
public static void method_8() {
File f=new File("C:\\");
String[] files=f.list();
for(String f1 : files){
System.out.println(f1);
}}
//过滤文件
public static void method_9() {
File dir=new File("C:\\");
String[] arr=dir.list(new FilenameFilter(){
public boolean accept(File dir, String name) {
return name.endsWith(".java");
}
});
for(String f1 : arr){
System.out.println(f1);
}}}
应用举例:
列出指定文件中的所有文件,包括文件夹中的文件夹下的所有文件。
思路:因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可。
在列出过程中出现的还是目录的话,还可以再一次调用本功能,也就是
函数自身调用自身。这种表现形式,或者变成手法称作递归。
递归要注意:
1.限定条件。
2.要注意递归的次数,尽量避免内存溢出。
import java.io.File;
public class FileLists {
public static void main(String[] args) {
File dir =new File("E:\\Program Files\\audio player\\xml");
showDir(dir);
}
private static void showDir(File dir) {
System.out.println(dir);
File[] files=dir.listFiles();//获取文件数组
for(int x=0;x<files.length;x++){
if(files[x].isDirectory()){
showDir(files[x]);
}else{
System.out.println(files[x]);
}}}}
上面的方法也可以列出目录中的隐藏文件。
2/*删除一个带内存的目
* 删除原理:在window中,删除目录从里往外删除的。
* 既然从里往外删除,就需要用到递归。
*/
import java.io.File;
public class RemoverDir {
public static void main(String[] args) {
File file=new File("C:\\");
removeDir(file);
}
public static void removeDir(File dir){
File[] files=dir.listFiles();
for(int x=0;x<files.length;x++){
if(files[x].isDirectory()){
removeDir(files[x]);
}else{
System.out.println(files[x].delete());//删除文件
}}
System.out.println(dir.delete());//删除目录
}}
/* Properties是hashtable子类。
* 也就是说它具有map集合的特点,而且它里面存储的见值队都是字符串
* 试剂盒中和IO技术相结合的集合容器
* 该对象的特点:可以用于键值对形式的配置
* 那么在加载数据时,需要数据有固定格式:键=值。
* 演示:如何江流中的数据存储到集合中
* 想要将info。txt中键值数据存到集合中进行操作。
* 1。用以各留和info.txt文件关联
* 2.读取一行数据,并将该行数据用“=”进行切割。
* 3。等号左边作为键,右边作为值,存到Properties集合中即可
*/
import java.io.*;
import java.util.*;
public class JavaFileList {
public static void main(String[] args) throws IOException {
loadDemo();
storeDemo();
loadDemo();
}
//用Properties自带的store();将集合中的数据保存到指定文件中
public static void storeDemo() throws IOException{
Properties prop=new Properties();
FileOutputStream fis=new FileOutputStream("C:\\Users\\esws\\Desktop/info.txt");
prop.setProperty("shaghai", "49");
prop.store(fis," 注释,该注释会保留到文件中,由于其前面有“#”所以不会被Properties加载");
}
//用Properties自带的load();将数据加载到集合中
public static void loadDemo() throws IOException{
Properties prop=new Properties();
FileInputStream fis=new FileInputStream("C:\\Users\\esws\\Desktop/info.txt");
prop.load(fis);
prop.list(System.out);
}
//用自己的方法将数据读入到Properies集合中
public static void setGetP() throws IOException{
BufferedReader bufr=new BufferedReader(new FileReader("C:\\Users\\esws\\Desktop/info.txt"));
String line=null;
Properties prop=new Properties();
while((line=bufr.readLine())!=null){
String[] arr=line.split("=");
prop.setProperty(arr[0],arr[1]);
}}
//用自己的方法列出Properies集合中的数据
public static void setAndGet(Properties p){
Properties prop=p;
Set<String> names =prop.stringPropertyNames();
for(String s :names){
System.out.println(s+":"+prop.getProperty(s));
}}}
Properies在实际开发中的应用
/*用于记录应用程序运行次数
* 如果使用次数一到,那么给出注册提示。
* 即使程序结束,该计数器的值也存在。下次程序启动时会先加载计数器的值并加1后重新存储起来。
* 通常配置文件使用键值对的形式。这样便于阅读数据,并操作数据。
* 键值对数据时基于map集合
* 数据是以文本形式存储,使用IO技术。
* 那么 map+io-->properties.
* 配置文件可以实现应用程序数据的共享。
*/
import java.io.*;
import java.util.*;
public class Jishuqi {
public static void main(String[] args) throws IOException {
Properties prop=new Properties();//创建Properties对象
File file=new File("C:\\Users\\esws\\Desktop/count.ini");
if(!file.exists()){//判断文件是否存在
file.createNewFile();
}
FileInputStream fis=new FileInputStream(file);
prop.load(fis);//加载文件
int count=0;
String value=prop.getProperty("time"); //获取键值
if(value!=null){
count=Integer.parseInt(value);
if(count>=5){
System.out.print("使用次数已到!请注册!");
return;
}}
count++;
System.out.print("使用"+count+"次");
prop.setProperty("time", String.valueOf(count));
FileOutputStream fos=new FileOutputStream(file);
prop.store(fos, value);//保存Properties文件
fos.close();
fis.close();
}
}
/*打印流:
* 给流提供了打印方法,可以将各种数据类型的数据都原样答引出来。
* 字节打印流:
* PrintStream
* 构造函数可以接收的参数类型:
* 1.file对象。file
* 2.字符串路径。String
* 3.字节输出流。OutputStream
* PrintWriter
* 构造函数可以接收的参数类型:
* 1.file对象。file
* 2.字符串路径。String
* 3.字节输出流。OutputStream
* 4.字符输出流。Writer
*/
总结:
1. 用来将文件或者文件夹封装成对象。方便对文件与文件夹的属性信息进行操作、
对文件的处理就是 .创建文件 之后就是对文件的增删改查等操作。
2. Properties是hashtable子类。
也就是说它具有map集合的特点,而且它里面存储的见值队都是字符串
试剂盒中和IO技术相结合的集合容器,map+io-->properties.
3.SequenceInputStream 表示其他输入流的逻辑串联。它从 输入流的有序集合开始,
并从第一个输入流开始读取, 直到到达文件末尾,接着从第二个输入流读取,
依次类推,直到到达包含的最后一个输入流的文件末尾为止
作者:
jiahui108
时间:
2013-8-21 08:54
很不错的知识总结,收了
作者:
swolice
时间:
2013-8-21 13:58
真不晓得这哥们在说啥。总结输入流的类?
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2