1 package org.java;
  2 
  3 import java.io.BufferedReader;
  4 import java.io.BufferedWriter;
  5 import java.io.File;
  6 import java.io.FileInputStream;
  7 import java.io.FileOutputStream;
  8 import java.io.FileReader;
  9 import java.io.FileWriter;
 10 import java.io.FilenameFilter;
 11 import java.io.IOException;
 12 
 13 
 14 public class JavaUseTest {
 15 
 16     public static void main(String[] args) {
 17 /*
 18  Java文件输入输出
 19  从输入流中 读取数据
 20 在输出流中 写入数据
 21 
 22 Java.io包提供流类
 23 InputStream抽象类    的 子类 创建的 流对象 称为 字节输入流
 24 OutputStream抽象类 的 子类 创建的 流对象 称为  字节输出流
 25 Reader抽象类  的 子类 创建的 流对象 称为字符输入流 
 26 Writer抽象类  的 子类 创建的 流对象 称为字符输出流
 27 
 28 
 29 File类:
 30 主要 获取一些文本信息:
 31 构造方法:
 32 File(URI uri);//传入文件的目录地址和名字 :file.txt:绝对路径是->C:\Users\Nirobert Einteson\Desktop\java\File\file.txt
 33 File(String filename);//filename文件名字;会被认为在当前应用程序在同一目录;hello.txt:C:\Users\Nirobert Einteson\eclipse-workspace\HelloWorld\hello.txt
 34 File(String directoryPath,String filename);//directoryPath文件路径
 35 File(File fileParentPath,String name);//在 file 的父路径 路径 下创建  新的 文件 filex.txt;
 36 
 37 文件的属性:
 38 public String getName();//获取文件的名字
 39 public boolean canRead();//判断文件是否是  可读的
 40 public boolean canWrite();//判断文件是否是 可被写入
 41 public boolean exists();//判断文件是否 存在
 42 public String getAbsolutePath();//获取文件的绝对路径
 43 public String getParent();//获取文件的父目录
 44 public boolean isFile();//判断文件是否是 一个普通的文件,而不是目录
 45 public boolean isDirectory();//判断文件是否是一个目录
 46 public boolean isHidden();//判断文件是否是 隐藏文件
 47 public long lastModified();//获取文件的 最后修改的时间(毫秒数)
 48 public long length();//获取文件的长度
 49 public boolean delete();//删除文件;file.delete();
 50 public boolean createNewFile();//如果目录中没有要创建的文件,那么会调用这个方法,创建这个文件
 51 public 
 52 
 53 
 54 文件的创建
 55 File file=new File(filename);
 56 文件的删除
 57 
 58 目录:
 59 pubic boolean mkdir();//创建一个目录 创建成功返回true,否则返回false(文件已存在也是false);
 60 public String[] list();//以字符串形式目录下的所有文件
 61 public String[] list(FilenameFilter object);//以字符串形式 返回目录下指定的类型的文件 如:.txt,.java
 62 public File[] listFiles();//以File对象的形式返回目录下的所有文件
 63 public File[] listFiles(FilenameFilter object);//以 File对象的形式 返回返回目录下指定的类型的文件 如:.txt,.java
 64 
 65 FilenameFilter是一个接口;有方法accept(File dir,String name);需要实现接口
 66 public boolean accept(File dir,String name);
 67 
 68 字节型
 69  基本管道:FileInputStream  FileOutputStream
 70 增强型 管道:在基本管道的外面 包上一层)
 71 DataInputStream DataOutputStream
 72 BufferedInputStream  BufferedOutputStream
 73 ObjectInputStream ObjectOutputStream
 74 增强型管道的 源 和目的地 都是 字节型 基本管道
 75 public DataInputStream(InputStream   in) 
 76 public DataOutputStream(OutnputStream  out) 
 77 public BufferedInputStream(InputStream in) 
 78 public BufferedInputStream(InputStream in, int size) 
 79 public BufferedOutputStream(OutputStream out) 
 80 public BufferedOutputStream(OutputStream out, int size) 
 81 ObjectInputStream(InputStream in)
 82 ObjectOutputStream(OutputStream out) 
 83 对象输出流使用writeObject(Object obj)方法将一个对象obj写入到一个文件;对象输入流使用readObject()读取一个对象到程序中。
 84 当使用对象流写入或读入对象时,要保证对象是序列化的 
 85 一个类如果实现了Serializable接口(java.io包中的接口),那么这个类创建的对象就是所谓序列化的对象 。
 86 
 87 
 88 
 89 字符型:
 90 基本管道:
 91 FileReader  FileWriter
 92 增强型:
 93 BufferedReader  BufferedWriter
 94 
 95 
 96  
 97  
 98  文件字节流:
 99  读写文件的子类:FileInputStream 和FileOutputStream 
100  若只是简单的读写文件,那么就可以使用FileInputStream 和FileOutputStream 
101  
102 
103 
104  文件字节输入流:
105  关闭输入流 :fileInputStream.close();
106 FileInputStream 是 InputStream 的子类:
107 构造方法:
108 FileInputStream(String name);
109 FileInputStream(File file);
110 参数name 和file 称为输入流的源,输入流通过调用read方法 读出 源 中的数据
111 
112 以字节为单位 读 文件
113 //2^8 =256-> 返回(0,255)字节值,到达末尾 返回-1
114 int read();//输入流 调用read() 方法 顺序 地 从源 中读取 单个  字节数据 ;
115 int read(byte b[]);//按照字节  顺序地 从文件中读取b.length个数据,然后放到 字节数组 b里面
116 int read(byte b[],int off,int len);///按照字节  顺序地 从文件中 off开始  顺序地  读取len个字节 , 放到 字节数组 b里面
117 read读取文件,只要不关闭流,那么每次调用read 方法 都会顺序地 读取剩余 的内容,直到读完流中的文件 或者文件关闭
118 
119 FileOutputStream类:
120 关闭输出流: 关闭输入流 :fileOutputStream.close();
121 构造方法:
122 FileOutputStream(String name);
123 FileOutputStream(File file);
124 以name ,file 作为目的地 把数据在 输出流中 写入文件中
125 
126 以字节为单位 写入文件:
127 //以字节为单位顺序写入 数据
128  public void write(byte b[]);//把字节数组中 数据 全部写入到文件中
129  public void write(byte b[],int off,int len);//把字节数组中 偏移量off开始 共len个字节 数据,写入到文件中
130 
131 
132 字节流 :的 read()和write() 方法
133 字节流不能很好的 处理Unicode字符 ,如汉字在文件中 占两个字节,使用字节流,可能出现乱码
134 可以加大 输入输出流的 强度 
135 
136 将字节型 流 变成 字符型流
137 变成 FileReader()和 FileWriter() 是 Reader和Writer的子类
138 在java.io.*包里面
139 构造方法:
140 FileReader(String filename);
141 FileReader(File filename);
142 FileWriter(String filename);
143 FileWriter(File filename);
144 
145 字符型read(),write()方法
146 int read();//从源 中读取一个字符  ,返回(0-65535,Unicode字符值),读出失败返回-1
147 int read(char ch[]);//从源 中读取  ch.length 个 字符 ,放到 字符 数组 ch中;到达 源(文件) 的末尾 返回-1
148 int read(char ch[],int offset,int len);//从源 中从off开始 读取  len 个 字符 放到 字符数组 ch里面,到达 源(文件) 的末尾 返回-1;
149 void write(char ch);//字符输出流 写入 一个 字符
150 void write(char ch[]);//在字符输出流中  写入 一个 字符数组
151 void write(char ch[],int off,int len);//在字符输出流中  写入 一个 字符数组 的off开始   ,共len个字符 
152 
153 
154 
155 
156 缓冲流:
157 BufferReader类:缓冲输入流
158 BufferWriter类:缓冲输出流
159 如果要读取一行,那么字符型输入流 很难 知道一行是 多少个字符,所以采用 缓冲输入流
160 
161 缓冲流的 源和目的地: 必须是 字符输入流 和 字符输出流 
162 构造方法:
163 BufferedReader(reader in);
164 BufferedWriter(Writer out);
165 
166 向BufferedReader 传递 一个Reader的 子类 对象   (如:FileReader fileReader)来创建BufferedReader对象
167 如:        FileReader fileReader=new FileReader(file);
168         BufferedReader bufferedReader=new BufferedReader(fileReader);//创建 缓冲 输入流 对象 
169         String  str=bufferedReader.readLine();//方法读取一行数据,赋值给str-->toCharArray()变成字符数组
170         //newLine();//写入一个回车符号
171 BufferedWriter(Writer out);
172 
173 write(String str,int off,int len);//字符串str从 off开始 ,共len个字符 写入 文件中
174 
175 字符输入流FileReader 首先 将 数据 读入缓存,然后 BufferedReader缓冲输入流 再从 缓存中 读取数据
176      BufferedWriter缓冲输出流 先向 缓存中 写入数据,然后字符输入流FileWriter将 缓存 中的 数据 写入 目的地;
177          当BufferedWriter 调用flush()方法 刷新 缓存 或close()方法 关闭的时候,即使 缓存 没有 溢出,仍然要 将缓存的内容送入目的地
178              要先关闭 缓冲流,然后才能关闭 字符流
179      
180 
181 
182  */
183         String path="C:\\Users\\Nirobert Einteson\\Desktop\\java\\File\\";//文件的所在的目录 
184         
185         File file=new File(path+"file.txt");//在path路径下 创建file.txt文件
186         File file2=new File("file2.txt");//默认 和当前应用程序在同一目录;即:*.java 在同一目录下
187         File file3=new File(path,"file3.txt");//在path路径下,创建file3.txt文件
188         File file4=new File(file3.getParent(),"file4.txt");//在 file3的父路径 路径 下创建  新的 文件 file4.txt;
189     
190         System.out.println(file.getName()+" :绝对路径是->"+file.getAbsolutePath());
191         System.out.println(file2.getName()+":绝对路径是->"+file2.getAbsolutePath());
192         System.out.println(file3.getName()+":绝对路径是->"+file3.getAbsolutePath());
193         System.out.println(file4.getName()+":绝对路径是->"+file4.getAbsolutePath());
194         
195         System.out.println("file文件是否可读"+file.canRead());
196         System.out.println("file文件是否可写"+file.canWrite());
197         System.out.println("file文件的长度"+file.length());
198 
199         //路径  path 下.的内容;//.代表 当前路径
200         File dir=new File(path+".");//C:\Users\Nirobert Einteson\Desktop\java\File\.
201         //取出目录下的 所有.txt文件
202         String[] filenames=dir.list(new FilenameFilter(){
203             //重写 接口的 方法,这里属于是匿名接口的实现
204             @Override
205             public boolean accept(File dir,String name) {
206                 return name.endsWith(".txt");//dir路径下;名字以.txt结尾的文件
207             }});
208         //文件以字符串的形式  已经存到 filenames里面
209         System.out.println(path+"路径下以.txt结尾的文件有"+filenames.length+"个"+"\n"+"分别是:");
210         for(String name1:filenames) {
211             System.out.println(name1);
212         }
213         
214         //直接获取文件夹里面的所有文件 存到字符串数组里面
215         File file5=new File(path+".");//C:\Users\Nirobert Einteson\Desktop\java\File\.
216         String names[]=file5.list();//获取这个路径下的所有文件
217         System.out.println(path+"路径下以.txt结尾的文件有"+names.length+"个"+"\n"+"分别是:");
218         for(String name1:names) {
219             System.out.println(name1);
220         }
221         
222         //删除文件
223         file3.delete();
224         System.out.println(file3.exists());
225         
226         try {//文件可能会抛出异常 ,所以需要在try-catch语句里面进行写
227             
228             //在输出流中 ,向文件写入数据--write();方法
229             FileOutputStream fileOutputStream3=new FileOutputStream(file3);
230             //变成字节数组,在 文件输出流中 ,写入到文件里面
231             byte byteFile[]="this is a byte stream".getBytes();
232             fileOutputStream3.write(byteFile);
233             fileOutputStream3.close();
234             
235             FileOutputStream fileOutputStream4=new FileOutputStream(file4);
236             fileOutputStream4.write(byteFile);
237             fileOutputStream4.close();
238             
239             //从文件字节 的输入流 中读数据--->read()方法
240             FileInputStream fileInputStream=new FileInputStream(file);
241             
242             byte byteReadData[]=new byte[8];//初始化8个字节数组
243             int data;
244             while((data=fileInputStream.read(byteReadData,0,8))!=-1) {//每次都读取8个字节 放到 byteReadData字节数组里面
245                 //data位每次从输入流中 实际读取了多少个数据
246                 //String string=new String(byteReadData,0,data);//data是每次读取了多少个字节数,比如8,8,8,3最后一个到不了8个字节
247                 //String string2=new String(byteReadData,0,8);//每次都输出8个,可能不正确,比如只读出了3个却输出了8个
248                 //System.out.println(string);
249             }
250             fileInputStream.close();
251             
252             
253             //字符型 输出流
254             
255             FileWriter fileWriter=new FileWriter(file);
256             char ch[]="这是一个字符型流测试的样例".toCharArray();//字符串 变成 字符串数组
257             fileWriter.write(ch);//字符数组
258             fileWriter.write(ch, 4, 3);//字符数组
259             fileWriter.write('X');//写入一个字符
260             fileWriter.write("hello",1,3);//字符串 
261             fileWriter.close();
262             
263             //字符输入流
264             FileReader fileReader=new FileReader(file);
265             char readChar[]=new char[8];//每次读取8个字符
266             int index=0;
267             while((index=fileReader.read(readChar,0,8))!=-1) {
268                 String tmp=new String(readChar,0,index);
269                 System.out.println("读取的字符型数据:"+tmp+"\n");
270                 System.out.println("读取单个字符:"+(char)fileReader.read());//返回0-65535转成字符
271             }
272             fileReader.close();
273             
274             
275             // 缓冲 输出流
276             FileWriter fileWriter2=new FileWriter(file);
277             BufferedWriter bufferedWriter=new BufferedWriter(fileWriter2);
278             bufferedWriter.write("hhhhhhhh+ko+'\n'+ok+hhhhhhhh");
279             bufferedWriter.newLine();//写入换行符
280             bufferedWriter.close();//要先关闭 缓冲流,然后才能关闭 字符流
281             fileWriter2.close();
282             
283             
284             //缓冲 输入流
285             FileReader fileReader2=new FileReader(file);
286             BufferedReader bufferedReader=new BufferedReader(fileReader2);
287             String string=null;//string用来接收 readLine() 字符串,最后默认返回为null
288             while((string=bufferedReader.readLine())!=null) {//只要读出的 不是null,说明不为空
289                 System.out.println("缓冲输入流:读出的文件是:"+string);
290             }
291             bufferedReader.close();//要先关闭 缓冲流,然后才能关闭 字符流
292             fileReader2.close();
293             
294             
295         }catch (IOException e) {
296             System.out.println(e);
297         }
298         
299     }
300 
301 }

 

 

输出结果:

1 file.txt :绝对路径是->C:\Users\Nirobert Einteson\Desktop\java\File\file.txt
 2 file2.txt:绝对路径是->C:\Users\Nirobert Einteson\eclipse-workspace\HelloWorld\file2.txt
 3 file3.txt:绝对路径是->C:\Users\Nirobert Einteson\Desktop\java\File\file3.txt
 4 file4.txt:绝对路径是->C:\Users\Nirobert Einteson\Desktop\java\File\file4.txt
 5 file文件是否可读true
 6 file文件是否可写true
 7 file文件的长度29
 8 C:\Users\Nirobert Einteson\Desktop\java\File\路径下以.txt结尾的文件有3个
 9 分别是:
10 file.txt
11 file3.txt
12 file4.txt
13 C:\Users\Nirobert Einteson\Desktop\java\File\路径下以.txt结尾的文件有3个
14 分别是:
15 file.txt
16 file3.txt
17 file4.txt
18 false
19 读取的字符型数据:这是一个字符型流
20 
21 读取单个字符:测
22 读取的字符型数据:试的样例字符型X
23 
24 读取单个字符:e
25 读取的字符型数据:ll
26 
27 读取单个字符:�
28 缓冲输入流:读出的文件是:hhhhhhhh+ko+'
29 缓冲输入流:读出的文件是:'+ok+hhhhhhhh